C++ : List iterator not incrementable(C++:列表迭代器不可递增)
问题描述
尝试擦除列表的最后一个元素时出现此错误.我调试了代码并且能够找出导致它的原因和位置,这是我的代码:
Getting this error while trying to erase the last element of a list. I debugged the code and was able to figure out what causes it and where, here's my code:
for(Drop_List_t::iterator i = Drop_System.begin(); i != Drop_System.end() && !Drop_System_Disable; /**/)
{
if(Player->BoundingBox.Intersect(&(*i)->BoundingBox))
{
i = Drop_System.erase(i);
}
++i; //List iterator crashes here if last entry was deleted
}
我不知道我做错了什么...有什么建议吗?
I can't figure out what I'm doing wrong... Any suggestions?
推荐答案
您的算法有缺陷,因为您不了解 erase
返回的内容.
Your algorithm is flawed because you did not understood what erase
returned.
当你使用erase
时,它会移除迭代器指向的元素,并返回一个指向下一个元素的迭代器.
When you use erase
, it removes the element pointing to by the iterator, and returns an iterator to the next element.
如果您希望遍历列表的所有元素,这意味着无论何时使用 erase
都不应进一步增加它.
If you wish to iterate over all elements of a list, it means that whenever erase
was used you should not further increment it.
这是你应该得到的正常代码:
This is the normal code you should have gotten:
if (Player->BoundingBox.Intersect(i->BoundingBox)) {
i = Drop_System.erase(i);
}
else {
++i;
}
这巧妙地解决了您遇到的问题!因为当你 erase
最后一个元素时,erase
将返回与 end
相同的迭代器,即指向最后一个元素的迭代器元素.此迭代器应永远不会增加(如果列表不为空,它可能会减少).
And this neatly solves the issue you are encountering! Because when you erase
the last element, erase
will return the same iterator as end
, that is an iterator pointing one-past-the-last element. This iterator shall never be incremented (it may be decremented if the list is not empty).
这篇关于C++:列表迭代器不可递增的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:C++:列表迭代器不可递增
基础教程推荐
- 设计字符串本地化的最佳方法 2022-01-01
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- C++,'if' 表达式中的变量声明 2021-01-01
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- 运算符重载的基本规则和习语是什么? 2022-10-31
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01