std :: remove不起作用

时间:2012-12-01 16:35:04

标签: c++ stl

我的测试程序的目标是在一个简单的字符串向量中擦除单元格,如下所示。 程序失败(分段错误)。

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

有人可以帮助我吗?在此先感谢您的帮助。

3 个答案:

答案 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;
    }
}

(再次,标准习语。)