C++ Vector.end()删除C++;

C++ Vector.end()删除C++;,c++,c++11,vector,stl,C++,C++11,Vector,Stl,当我删除向量中的重复值时,我面临一个问题。 我知道,当一个向量值被删除时,该向量会被重新分配,以便在没有任何“黑洞”的情况下维护数据。 问题是,当我在循环中使用remove()时,当代码运行回它的条件语句时,我会收到一条断言失败的消息 我的问题是: 如果我在迭代的某个条件下使用nums.end(),它会得到一个迭代器的静态值,还是每次迭代都会返回一个指向新的重新分配向量末尾的新迭代器? 如果是,或者不是,递增法似乎有什么问题 while ( itfast != nums.end()) {

当我删除向量中的重复值时,我面临一个问题。 我知道,当一个向量值被删除时,该向量会被重新分配,以便在没有任何“黑洞”的情况下维护数据。 问题是,当我在循环中使用remove()时,当代码运行回它的条件语句时,我会收到一条断言失败的消息

我的问题是: 如果我在迭代的某个条件下使用nums.end(),它会得到一个迭代器的静态值,还是每次迭代都会返回一个指向新的重新分配向量末尾的新迭代器? 如果是,或者不是,递增法似乎有什么问题

while ( itfast != nums.end()) {
        if (*itslow == *itfast) {
            nums.erase(itfast);
        }
        else {
            itslow++;
            itfast++;
        }
    }

std::vector.erase使当前迭代器无效,但返回一个迭代器,该迭代器指向通过已擦除迭代器的下一个有效迭代器

itfast = nums.erase(itfast);
正如Daniel指出的,这将使您拥有的任何其他迭代器无效,因此您也必须处理itslow情况

在处理更复杂的擦除时,处理索引可能会更简单、更不容易出错,但如果删除元素,并且itslow>=removed元素,也会有关于itslow的陷阱。如果不知道你的确切问题是什么,我就不能确切地说该用哪一个

有关擦除的更多详细信息,请参阅CPPPreference。还有其他几个问题与此非常类似


nums.erase(itfast)使
itfast
itslow
无效。使用
itfast=nums.erase(itfast)取而代之。以
itslow
失效为例。另外,更改
itslow++;itfast++
++itslow++itfast。这很奇怪,在您推荐的更改之前进行调试时,我看到它将“itfast”增加到下一个元素,那么这两种方法有什么不同呢?(我还看到erase在删除元素后返回新的迭代器状态)区别在于代码导致未定义的行为。简单地说,代码中有一个bug,有时可能不会暴露出来(这对于未定义的行为尤其危险)。此外,还有一些“规范”方法可以从向量中删除重复项。参见,例如。
itslow
的失效问题相当严重。(可以通过使用索引而不是迭代器来删除。)当然是这样,我尝试只使用向量结构。这很难回答问题。你只指出了一个问题。
itslow
的失效情况如何?你为什么不把你正在谈论的问题联系起来呢?你为什么不提供一些解决方案呢?您提出的更改将无法使代码正确。感谢Daniel为我的第一个答案提供反馈。我做了一些调整,并将记住这些。