Far*_*han 5 c++ stl list visual-c++
自然的答案是取消引用迭代器并获取值。但是,我坚持使用 VC++ 2010,它不允许取消引用列表迭代器(或者它允许取消引用?)我很困惑,因为有一次,我需要取消引用两个列表迭代器并使用以下方法比较它们的值:(* it) == (*it2) 程序因错误而崩溃,仅由于这一行。我还在语句中取消引用迭代器: 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--;
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
调试断言失败
表达式:列表迭代器不可解引用
令人惊讶的是,在 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;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
38241 次 |
| 最近记录: |