C++迭代器问题

dme*_*ssf 3 c++ iterator vector

我正在使用C++上的迭代器,我在这里遇到了一些麻烦.它在行interIterator ++上的表达式(this - > _ Has_container())上说"Debug Assertion Failed".距离列表是向量<vector <DistanceNode >>.我做错了什么?

vector< vector<DistanceNode> >::iterator externIterator = distanceList.begin();

   while (externIterator != distanceList.end()) {

    vector<DistanceNode>::iterator interIterator = externIterator->begin();

        while (interIterator != externIterator->end()){

          if (interIterator->getReference() == tmp){

     //remove element pointed by interIterator
     externIterator->erase(interIterator);             

          } // if
    interIterator++;
  } // while
  externIterator++;
   } // while      
Run Code Online (Sandbox Code Playgroud)

Ash*_*ain 13

vector's erase()返回一个新的迭代器到下一个元素.擦除元素和元素失效后的所有迭代器.但是,你的循环忽略了这一点,并继续使用interIterator.

您的代码应如下所示:

if (condition)
    interIterator = externIterator->erase(interIterator);
else
    ++interIterator;  // (generally better practice to use pre-increment)
Run Code Online (Sandbox Code Playgroud)


Mar*_*tos 5

迭代时,你不能从序列容器中删除元素 - 至少不是你这样做的方式 - 因为调用erase使迭代器失效.您应该将返回值分配给erase迭代器并抑制增量:

while (interIterator != externIterator->end()){
   if (interIterator->getReference() == tmp){
       interIterator = externIterator->erase(interIterator);             
   } else {
       ++interIterator;
   }
}
Run Code Online (Sandbox Code Playgroud)

此外,在预增量(++ i)执行时,永远不要使用后增量(i ++).