为什么两个迭代器在循环中分开?

时间:2015-11-19 15:08:52

标签: c++ qt iterator qlist

我有两个用于QStringList的STL样式迭代器,它们在循环之前初始化。

QStringList::iterator it(cnamesNum->begin()),itCnam(cnames->begin()+1+totMetaData);

it指向QStringList那样的

  1. “1”
  2. “2”
  3. “3”
  4. “4”
  5. “5”
  6. “6”
  7. 虽然itCnam指向QStringList,但与前一个完全相同,但在这种情况下,我们在前面有一个额外的元素。所以

    1. “foo” 的
    2. “1”
    3. “...”
    4. 我正在检查矩阵的每一列的条件,如果不满足条件,我想删除相应的列名。

      for(unsigned int i=0;i<numDF.n_cols;i++,it++,itCnam++)       //Subset matrix and check RSD
          {
              vec b = numDF.submat(IdxQcs,uvec{i});
              b = b.elem(find_finite(b));
      
              if(b.n_elem>0)
              {
                  if(stddev(b)/mean(b)<rsdPerc)    //if below retain
                      keepColidx.insert_rows(ct++,uvec{i});
                  else                            //otherwise keep track of removed
                  {
                      removed.append(*it);
                      cnamesNum->erase(it);
                      cnames->erase(itCnam);  // 1 is the class
                  }
              }
              else
              {
                  removed.append(*it);
                  cnamesNum->erase(it);
                  cnames->erase(itCnam);  // 1 is the class
              }
          }
      

      条件检查按预期工作,从QStringcnamesNum中删除cnames是正确的,直到我们到达第五次迭代,其中cnamesNum删除了正确的字符串(“ 5“)但cnames删除”6“,即使它们在整个循环中经历相同的处理。这里发生了什么?

1 个答案:

答案 0 :(得分:1)

您的代码有undefined behavior。当你调用erase时,迭代器变为无效

  

只要项目存在,指向QLinkedList中项目的迭代器仍然有效,而QList的迭代器在插入或删除后可能变为无效。

source

您需要做的是捕获返回的迭代器,因为它将指向列表中的下一个元素。

it = cnamesNum->erase(it);
itCnam = cnames->erase(itCnam);

如果您不从列表中删除元素,则还需要从for循环中删除it++,itCnam++,并且只会增加ititCnam