我可以使用 std::vector.size() 来控制删除元素的循环吗?
Can I use std::vector.size() to control a loop that's removing elements?
我正在研究的对象检测器非常头疼。
我已经创建了这个关于可能是问题的其他部分的线程:堆损坏试图将元素添加到现有的 std::vector
但是,现在,我想也许我从矢量中删除元素的方式可能是我的问题。所以,简单的问题,我可以做这样的事情吗...
for (int i=0; i < vector.size(); i++){
if(iNeedToRemoveThisElement){
std::swap(vector[i],vector.back());
vector.pop_back();
i--;
}
?
你的循环是可以的(当然,假设iNeedToRemoveThisElement
没有做任何坏事)。循环条件每次都执行,因此您始终与反映最新更新的当前vector.size()
进行比较。
此外,仔细检查循环还会发现,您不会陷入比较的另一个潜在陷阱:如果i
为负数,则比较会给出false
,因为vector.size()
是无符号的。然而,事实证明,在比较时,i
从来都不是负数。
警告我不完全确定:如果i
引用最后一个元素,则用它自己交换该元素;我不确定这是否是定义的行为(使用 C++98/C++03 复制,当然没有问题,但我不确定 C++11 移动实现是否也支持它)。因此,可能需要对此进行特殊处理。更新:正如dyp在评论中解释的那样,允许自我交换,因此无需特殊情况。
在任何情况下,您都应该从C++标准库中查找算法std::remove
和std::remove_if
。它们允许您完全摆脱循环,如果您可以使用 C++11 的 lambda 函数,它也比循环更简单。
相关文章:
- C++如何通过用户输入删除列表元素
- 使用函数"remove"删除重复元素
- 如何通过 getter 函数删除矢量的元素?
- 从控制台中删除最后打印的元素
- 如何从存储在std::映射中的std::集中删除元素
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 删除列表中的第n个元素
- 从矢量中删除元素后出现隔离错误
- 删除映射和分割错误中的一个过去结束元素
- 如何使用remove_if从矢量中删除元素
- 如何从使用 for 循环中的矢量大小的矢量中删除元素
- 从矢量中删除空元素
- 关于比较两个无序数组并删除 a[] 中可以在 b[] 中找到的元素的问题
- 删除指针数组 (C++) 中的元素
- 删除列表 c++ 中的最后 3 个元素
- 比较 2 个向量并从第二个向量中删除在第一个 - c++ 中找不到的元素
- 为什么通过 vector<reference_wrapper> 的元素删除引用的值<T>不会使向量无效?
- 从std::multiset的第i个元素删除到末尾
- 删除 [] 是否等于每个元素删除.C++
- std::列出元素删除后节点的内存回收