我的测试程序的目标是擦除简单字符串向量中的单元格,如下所示。 程序失败(分段错误)。
static void display(std::vector<std::string> const &vec)
{
std::vector<std::string>::const_iterator It = vec.begin();
for (; It != vec.end(); ++It)
std::cout << *It << " ";
std::cout << std::endl;
}
int main(void)
{
std::vector<std::string> vec;
size_t index = 0;
vec.push_back("Toto");
vec.push_back("Titi");
vec.push_back("Tata");
vec.push_back("Tutu");
display(vec);
std::vector<std::string>::iterator It = vec.begin();
for (size_t idx = 0; It != vec.end(); ++It, idx++)
if (!(*It).compare("Tutu"))
index = idx;
vec.erase(std::remove(vec.begin(), vec.end(), index), vec.end()); //Segmentation fault
display(vec);
getchar();
return (0);
}
有人可以帮助我吗?预先感谢您的帮助。
vec.erase(std::remove(vec.begin(), vec.end(), index), vec.end());
您需要将实际元素(在本例中为
std::string
类型)传递给您的 erase
函数。
所以不是
index
,应该是somestring
像复制这样的算法 - 当您想要与实际容器类型解耦时,可以使用外部算法,并且有一些成员函数可以完成优化工作。在你的情况下 vec擦除 为你做了一切,只需传递找到的迭代器
vec.erase(It);
由于您要检查是否相等,因此只需使用
std::remove
:
vec.erase( std::remove( vec.begin(), vec.end(), "Tutu" ),
vec.end() );
这是标准的习语。如果由于某种原因,你必须写 自己循环:
std::vector<std::string>::const_iterator current = vec.begin();
while ( current != vec.end() ) {
if ( *current == "Tutu" ) {
current = vec.erase( current ) ;
} else {
++ current;
}
}
(再次,标准习语。)