首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >string::erase不带迭代器?

string::erase不带迭代器?
EN

Stack Overflow用户
提问于 2012-03-05 16:25:44
回答 3查看 1.2K关注 0票数 1

我在使用带有迭代器的字符串函数erase时遇到了问题。

下面的函数获取输入文件和.ini文件的名称,并为输出文件创建路径。路径定义为

代码语言:javascript
复制
dir + in_file + def_name + ini_file + ".txt"

我使用erase擦除输入文件名的扩展名。

代码语言:javascript
复制
void Output::vDefault(string in, string ini)
{
 //save names
 strIn=in;
 strIni=ini;

 //get working dir
 char mydirectory[MAX_PATH] = {""};
 GetCurrentDirectory(MAX_PATH,mydirectory);

 //erase extensions
 strIn.erase(strIn.find_last_of('.'), strIn.end()); // error
 strIni.erase(strIni.find_last_of('.'), strIni.end()); // error

 //adr starts with folder
 strAdr=mydirectory;
 //and ends with name
 //address=dir+in_file+def_name+ini_file+.txt;
 strAdr+=strIn+DEFOUTNAME+strIni+".txt";    
}

运行代码会导致以下错误:

代码语言:javascript
复制
error C2664: 'std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::erase(unsigned int,unsigned int)' : cannot convert parameter 2 from 'std::_String_iterator<_Elem,_Traits,_Alloc>' to 'unsigned int'

erase可以接受两个迭代器作为第一个和最后一个迭代器。你能帮帮我吗?我不知道为什么它在我的项目中只接受int

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-05 16:33:54

string::find_last_of()不返回迭代器,因此它不能匹配string::erase()的迭代器重载。

幸运的是,接受位置索引的string::erase()重载默认情况下从头到尾都是擦除,因此下面的代码应该适用于您:

代码语言:javascript
复制
strIn.erase(strIn.find_last_of('.'));
strIni.erase(strIni.find_last_of('.'));

当然,字符串中最好包含一个'.'字符...

票数 0
EN

Stack Overflow用户

发布于 2012-03-05 16:35:42

错误发生是因为擦除签名需要2个size_t或2个迭代器。不是组合。find_last_of返回一个size_t

http://www.cplusplus.com/reference/string/string/erase/

代码语言:javascript
复制
string& erase ( size_t pos = 0, size_t n = npos );
iterator erase ( iterator position );
iterator erase ( iterator first, iterator last );

http://www.cplusplus.com/reference/string/string/find_last_of/

代码语言:javascript
复制
size_t find_last_of ( const string& str, size_t pos = npos ) const;
size_t find_last_of ( const char* s, size_t pos, size_t n ) const;
size_t find_last_of ( const char* s, size_t pos = npos ) const;
size_t find_last_of ( char c, size_t pos = npos ) const;

解决方案是使用

代码语言:javascript
复制
string& erase ( size_t pos = 0, size_t n = npos );

下面是size_t n optional。

擦除从位置pos开始的n个字符序列。请注意,这两个参数都是可选的:只有一个参数时,该函数删除从位置pos开始向前的所有内容,没有参数时,该函数删除整个字符串,就像成员clear一样。

代码语言:javascript
复制
strIn.erase(strIn.find_last_of('.'));
strIni.erase(strIni.find_last_of('.'));
票数 1
EN

Stack Overflow用户

发布于 2012-03-05 16:36:19

std::find_last_of返回一个size_t,而不是一个迭代器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9563584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档