循环使用C ++中的同一向量

时间:2014-01-24 05:03:20

标签: c++ loops vector iterator

很抱歉,我知道有些人会问如何删除重复项,但我认为这需要一个新线程,因为我的编译器会出现一些奇怪的东西。

vector<string> removeDuplicates(vector<string> vector)
{
    for (vector<string>:: const_iterator it = vector.begin(); it != vector.end(); ++it)
    {
        for (vector<string>:: const_iterator sit = vector.begin(); sit != vector.end(); ++sit)
        {
            if(it != sit)
            {
                if(*it == *sit)
                {
                    vector.erase(it);
                }
            }
        }
    }
return vector;
}

我不明白为什么它会给我错误。我是C ++的新手,所以问题可能听起来有点愚蠢。是因为我在同一个向量上循环吗?

enter image description here

4 个答案:

答案 0 :(得分:4)

您不想一次删除1个项目。使用删除 - 擦除模式将删除一次应删除的所有元素,而不是几次擦除调用。在这种情况下(因为您似乎想要删除所有重复的元素),您可以将矢量复制到std::set(不允许复制),然后将其分配回来。

错误消息似乎显示您的实施中存在错误。 std::vector::erase应该能够使用const_iterator(请参阅下面标准中的引用),但是您看到的错误消息表明您的实现没有以这种方式定义。

  

§23.3.6.5

iterator erase(const_iterator position);
iterator erase(const_iterator first, const_iterator last);

您的当前实现也会得到未定义的行为,因为迭代器在擦除后会失效,因此it++在循环条件下无效。

如果切换到更有效的删除方法,这也可能解决了这个问题。

设置方法

std::vector<std::string> vec;
// fill vector with duplicates
std::set<std::string> sVec(vec.begin(), vec.end()); // copies the vector into a set, duplicates removed
vec.assign(sVec.begin(), sVec.end()); // pushes the data in the set back to the vector

删除/唯一删除方法(假设顺序无关紧要)

std::vector<std::string> vec;
// fill vector with duplicates
std::sort(vec.begin(), vec.end());
vec.erase(std::unique(vec.begin(), vec.end()), vec.end());

答案 1 :(得分:1)

我认为,条件应该是:

    if(it != sit)
    {
        if(*it == *sit)
        {
            sit = vector.erase(sit)
        }
        else
        {
            ++sit;
        }
    }
  

并且不要继续进行循环

删除正在擦除的迭代器的常量。将sit设为vector :: iterator。

答案 2 :(得分:1)

当擦除向量中的项时,使用erase()返回的有效迭代器。 比如,iterator = vector.erase(iterator)

另外,当您碰巧擦除向量中的最后一项时,执行++迭代器将无效。

此链接可能有助于vector erase iterator

答案 3 :(得分:-1)

这样做:

it = vector.erase(it);