1

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

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

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

4

3 回答 3

5
vec.erase(std::remove(vec.begin(), vec.end(), index), vec.end());

您需要将实际元素(在这种情况下为 type std::string)传递给您的erase函数。

因此,而不是index,它应该是somestring

于 2012-12-01T16:38:14.637 回答
0
  • 您不应混合使用迭代器和自制索引。仅使用迭代器。
  • 复制之类的算法 - 当您想与实际容器类型分离时,可以使用外部算法,并且有一些成员函数可以完成优化的工作。在你的情况下 vec erase 为你做任何事情,只需传递找到的迭代器

    vec.erase(它);

于 2012-12-01T17:40:42.447 回答
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;
    }
}

(再次,标准成语。)

于 2012-12-01T18:21:56.140 回答