如何在删除一个元素(double for循环)后正确地指向std::list
How to properly point back to std::list after erasing en element (double for loop)?
我想从std::list
中删除一个元素然后指向这个列表但是当我这样做时
for(std::list<CvRect>::iterator it = listOfCvRects.begin(); it != listOfCvRects.end(); it++)
{
for(std::list<CvRect>::iterator jt = listOfCvRects.begin(); jt != listOfCvRects.end(); jt++)
{
if( it == jt )
{ continue;}
if( (jt->x) > (it->x) //.. more conditions...)
{
jt = listOfCvRects.erase(jt);
//OR
//listOfCvRects.erase(jt++);
}
}
}
我得到了一个未处理的异常:iterator is unincrementable
我认为问题在于在某些情况下(删除元素的情况下),您对迭代器进行了双加。你的for循环看起来像这样:
for(std::list<T>::iterator jt = l.begin(); jt != l.end(); jt++) {
....
}
但是在里面你要做这样的事情:
jt = l.erase(jt);
因此,如果发生擦除操作,则在擦除操作的同时,将迭代器设置为下一个元素……但是,您也可以使用jt++
!
for(std::list<T>::iterator it = l.begin(); it != l.end(); ) { // notice no increment!
// ...
if(cond) {
it = l.erase(it);
} else {
++it;
}
}
所以你只能做其中一个增量,而不能同时做。
从列表中删除一个元素会使指向该元素的迭代器失效,但不会使指向其他元素的迭代器失效。所以你需要在erase前进行增量操作:
for(std::list<CvRect>::iterator it = listOfCvRects.begin(); it != listOfCvRects.end(); it++) {
std::list<CvRect>::iterator jt = listOfCvRects.begin();
while (jt != listOfCvRects.end()) {
if( it == jt) continue;
if( (jt->x) > (it->x) //.. more conditions...) {
listOfCvRects.erase(jt++);
} else {
jt++;
}
}
}
相关文章:
- 如何正确地将分支添加到已存在的树中
- 如何正确地将带有指针的数组传递给函数
- 如何正确地推回然后遍历堆中对象的向量?
- 我是否不正确地集中了这些字符数组?
- 如何通过另一个对象中的命令正确地从一个对象返回数据
- 我怎样才能通过友谊正确地履行我的职能?
- C++:如何正确地将 deque::front() 返回的变量从函数中传递出去?
- 我应该如何正确地将packaged_task移动到 lambda?
- 如何正确地将SHA1CryptoServiceProvider转换为c ++?
- 如何正确地对 constexpr 函数进行单元测试
- 我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
- 如何正确地将boost::asio::buffers_iterator转换为InputIterator
- 如何正确地检查变量char中包含的字母
- 当试图交换可变模板类时,如何正确地重载operator=
- 如何正确地将 boost::optional<std::chrono::d uration> 作为函数参数?
- 如何在C++中正确地将我的语言字符输出到HTML文件中
- 如果我的类正确地管理了一个资源,那么拥有智能的poointer有什么意义
- 如何在删除一个元素(double for循环)后正确地指向std::list
- 如何正确地并行化嵌套的for循环
- 如何使用具有循环依赖性的组件模式正确地使用多态性