std::remove 在传递索引时不起作用

问题描述 投票:0回答:3

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

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

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

c++ stl
3个回答
5
投票
vec.erase(std::remove(vec.begin(), vec.end(), index), vec.end());

您需要将实际元素(在本例中为

std::string
类型)传递给您的
erase
函数。

所以不是

index
,应该是
somestring


0
投票
  • 您不得混合迭代器和自制索引。仅使用迭代器。
  • 像复制这样的算法 - 当您想要与实际容器类型解耦时,可以使用外部算法,并且有一些成员函数可以完成优化工作。在你的情况下 vec擦除 为你做了一切,只需传递找到的迭代器

    vec.erase(It);


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

(再次,标准习语。)

© www.soinside.com 2019 - 2024. All rights reserved.