c++ - 访问迭代器指向的列表元素

标签 c++ visual-c++ list stl

自然的答案是取消对迭代器的引用并获取值。但是,我坚持使用 VC++ 2010,它不允许取消引用列表迭代器(或者是吗?) 我很困惑,因为有一次,我需要取消引用两个列表迭代器并使用以下方法比较它们的值: (*它) == (*它2) 该程序因错误而崩溃,仅由于这一行。我也在声明中取消引用迭代器: printf("%d\n", (*it)); 不过,这工作得很好。 那么,有没有什么方法可以在不取消引用或不使用 cliext::list 的情况下访问元素。

for (it=sList.begin(); it != sList.end(); it++)
{
    for (it2=it; it2 != sList.end(); it2++)
    {
        it2++;
        if ((*it) == (*it2))
        {
           sList.erase(it, it2);
        }
        it2--;
    }
}

我得到的错误是:

调试断言失败

表达式:列表迭代器不可解引用

令人惊讶的是,同样的代码在 DevC++ (MinGW) 上编译时没有问题

最佳答案

您实际上可以取消引用 list 迭代器。如果不能,您的比较代码甚至都不会编译。很可能您不小心取消引用了 end 迭代器而不是有效迭代器,从而导致崩溃。如果没有更多代码,就很难进行进一步观察。

编辑:我不太明白你想做什么。您编写的代码会删除两个相等元素之间的所有元素。我假设您实际上是在尝试删除所有重复元素,并且首先对列表进行排序以提高性能并不是一个问题/选项。

EDIT2:我在下面的评论中看到您真的想删除该范围。更新了我的代码。

然后尝试这样的事情:

for (it=sList.begin(); it != sList.end(); ++it)
{
    it2 = it;
    ++it2;
    while(it2 != sList.end())
    {
        if ((*it) == (*it2))
        {
           it = it2 = sList.erase(it, it2);  // Reset it as well since it will be blown away. It'll still point to the same value it did before though.
        }
        else
            ++it2;
    }
}

关于c++ - 访问迭代器指向的列表元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5146057/

相关文章:

c++ - 对 QJsonArray 进行排序

c++ - visual c++ 2010调试问题

visual-c++ - 用 Visual C++ 编写的最大的开源项目是什么?

java - 来自 ListView.getItems().removeAll() 的可疑行为

python - 从集合模块应用计数器后访问列表的内容

c++ - TDD用于系统程序

c++ - Opencv,在编译时找出像素的类型

c++ - 在这种情况下如何使用 auto_ptr

c++ 这里正确的语法是什么?

list - 如何在 Haskell 中切换列表中的 2 个元素