string :: erase不带迭代器?

时间:2012-03-05 08:25:44

标签: c++ string iterator erase

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

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

dir + in_file + def_name + ini_file + ".txt"

我正在使用erase来删除输入文件名的扩展名。

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";    
}

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

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之外什么都不接受。

3 个答案:

答案 0 :(得分:1)

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

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

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/

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;

解决方案是使用

string& erase ( size_t pos = 0, size_t n = npos );

这是size_t n可选。

  

从pos位置开始删除n个字符的序列。注意   这两个参数都是可选的:只有一个参数,   函数从位置pos向前删除所有内容,并且没有   参数,该函数删除整个字符串,如成员清除。

strIn.erase(strIn.find_last_of('.'));
strIni.erase(strIni.find_last_of('.'));

答案 1 :(得分:0)

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

幸运的是,获取位置索引的string::erase()重载默认为从那里删除到结尾,因此以下内容适合您:

strIn.erase(strIn.find_last_of('.'));
strIni.erase(strIni.find_last_of('.'));

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

答案 2 :(得分:0)

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