我的测试程序的目标是在一个简单的字符串向量中擦除单元格,如下所示。 程序失败(分段错误)。
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);
}
有人可以帮助我吗?在此先感谢您的帮助。
答案 0 :(得分:5)
vec.erase(std::remove(vec.begin(), vec.end(), index), vec.end());
您需要将实际元素(在本例中为std::string
类型)传递给erase
函数。
因此,应该是index
somestring
答案 1 :(得分:0)
像copy一样的算法 - 当你想要从实际的容器类型中解耦并且有成员函数执行优化的作业时,可以使用外部算法。在你的情况下,vec erase会为你做的,只需传递找到的迭代器
vec.erase(IT);
答案 2 :(得分:0)
由于您要检查是否相等,只需使用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;
}
}
(再次,标准习语。)