我可以使用 std::vector.size() 来控制删除元素的循环吗?
Can I use std::vector.size() to control a loop that's removing elements?
我正在研究的对象检测器让我很头疼。
我已经创建了关于可能是问题的其他部分的线程:Heap Corruption trying to add elements to existing 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函数,它也比循环更简单。
我正在研究的对象检测器让我很头疼。
我已经创建了关于可能是问题的其他部分的线程:Heap Corruption trying to add elements to existing 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函数,它也比循环更简单。