【问题标题】:STL iterator: Assertion ErrorSTL 迭代器:断言错误
【发布时间】:2012-12-02 17:34:45
【问题描述】:

为什么下面的代码会产生断言错误:Expression: list iterators incompatible

#include <list>
using namespace std;

int main()
{
    list<int> a;
    a.push_back(1);
    list<int>::iterator iter=a.begin();
    a.erase(iter);

    iter==a.end();
}

【问题讨论】:

  • 如果你写了iter=a.end() 这会很好,因为你已经替换了无效的迭代器,但是因为你写了iter==a.end(),你正在比较一个无效的迭代器,这会导致不兼容的警告

标签: c++ stl iterator erase


【解决方案1】:

你想做的是这样的:

#include <list>
using namespace std;

int main()
{
    list<int> a;
    a.push_back(1);
    list<int>::iterator iter=a.begin();
    iter = a.erase(iter);
}

【讨论】:

    【解决方案2】:

    a 更改时,给定集合a 上的迭代器变为无效,例如通过删除一个元素。

    【讨论】:

    • 并非所有类型容器中的所有迭代器都是如此。
    • 哪种容器不正确?
    • 你可以 pop_back() 我的 std::vector 集合 a 没有我的迭代器指向 a 中间的某个地方跳过一个节拍。以此类推。
    【解决方案3】:

    删除iter 时,它会失效。我认为无效的迭代器不能用于除了分配给它们之外的任何东西,甚至不能将它们与任何东西进行比较。您可能想使用

    iter = a.end();
    

    【讨论】:

      【解决方案4】:

      擦除后迭代器无效。在您的情况下,擦除本身会在您删除最后一个元素时返回(您删除它)结束迭代器

      【讨论】:

        猜你喜欢
        • 2013-09-23
        • 1970-01-01
        • 2014-05-23
        • 1970-01-01
        • 2018-06-11
        • 1970-01-01
        • 1970-01-01
        • 2012-03-16
        • 2012-07-20
        相关资源
        最近更新 更多