奇怪的迭代行为在G 中进行循环
strange iterator behavior in for loop in g++
我得到了一个奇怪的问题,以下是正常工作的代码段。
std::multimap<long,int>::iterator dateItr = reconnQueueDates.begin();
while( dateItr!=reconnQueueDates.end() ){
LOG_DEBUG("RUN comparision " <<cDateTime<< ", "<<dateItr->first);
if(dateItr->first <= cDateTime){
long nextTimeout = -1;
if( (nextTimeout = callReconnects(dateItr->second,dateItr->first))>-1){
if(nextTimeout>0){
reconnQueueDates.insert(std::pair<long , int>(nextTimeout, dateItr->second));
}
reconnQueueDates.erase(dateItr);
LOG_DEBUG("modified the iterator ressetting");
dateItr = reconnQueueDates.begin();
LOG_DEBUG("resset iter");
}//end of callreconnect if
}else{
++dateItr;
} //else for datetime check
}//end of while
在此之前,我使用的是循环中的一个循环,如下所示
for( ;dateItr!=reconnQueueDates.end();++dateItr ){
LOG_DEBUG("RUN comparision " <<cDateTime<< ", "<<dateItr->first);
if(dateItr->first <= cDateTime){
long nextTimeout = -1;
if( (nextTimeout = callReconnects(dateItr->second,dateItr->first))>-1){
if(nextTimeout>0){
reconnQueueDates.insert(std::pair<long , int>(nextTimeout, dateItr->second));
}
reconnQueueDates.erase(dateItr);
LOG_DEBUG("modified the iterator ressetting");
dateItr = reconnQueueDates.begin();
LOG_DEBUG("resset iter");
}// callReconnect
} // check datetime
}// for loop
在调试时,我发现在循环内部更改映射后,for构造内部的迭代器值仍在使用旧地址。
我正在使用,ubuntu 12.04与G 版本4.6.3。在我看来,某种编译器错误或某种优化这样做。
任何可能是哪个标志或错误的想法。
reconnQueueDates.erase(dateItr);
之后, dateItr
中的迭代器无效,任何用途都是未定义的行为。由于您的新旧 for
循环之后都使用它,因此您的新版本" Works"纯粹是偶然的。
正确的方法是先提取所有可能仍需要的数据(包括下一个迭代器的位置),然后再擦除该元素。例如:
std::multimap<long,int>::iterator dateItr = reconnQueueDates.begin();
while( dateItr!=reconnQueueDates.end() )
{
LOG_DEBUG("RUN comparision " <<cDateTime<< ", "<<dateItr->first);
if(dateItr->first <= cDateTime)
{
std::multimap<long,int>::iterator nextItr = dateItr;
++nextItr;
long nextTimeout = -1;
if( (nextTimeout = callReconnects(dateItr->second,dateItr->first))>-1)
{
std::pair<long , int> newentry = std::make_pair(nextTimeout, dateItr->second);
reconnQueueDates.erase(dateItr);
if(nextTimeout>0)
{
reconnQueueDates.insert(newentry);
}
LOG_DEBUG("modified the iterator resetting");
nextItr = reconnQueueDates.begin();
LOG_DEBUG("reset iter");
}//end of callreconnect if
dateItr = nextItr;
}
else
{
++dateItr;
} //else for datetime check
}//end of while
相关文章:
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 使用基于范围的循环迭代矢量时出现问题
- C++:返回一个基于范围 for 循环迭代器,其中包含继承对象
- 在分配和发布递增循环迭代器时C++无限循环(gcc 错误?
- 如何基于循环迭代器选择函数
- 如何使用基于范围的for循环迭代Rapidjson文档(它本身就是一个JSON数组)
- 在循环迭代期间将引用保存到矢量中的空指针
- 在每次循环迭代时停止代码执行毫秒
- 优先级队列(使用 pairs<int,int> ) 根据 for 循环迭代器的顶级元素
- 如何在每次循环迭代期间生成向量,存储数据,然后删除该向量?
- 先前循环迭代对当前迭代执行时间的影响
- C++使用 for 循环迭代 2 个向量
- 为什么循环迭代不打印任何东西?
- 每次循环迭代后递减迭代器都会显示出奇怪的行为
- 虽然循环迭代了C++中的太多元素
- 循环迭代后,C 函数调用不会再次调用
- 指向向量和向量的指针中的循环迭代
- 为矩阵创建动态数组,以循环迭代器命名
- for 循环 - 迭代特定元素
- 通过线程分发循环迭代