【问题标题】:Why do two iterators shift apart in loop?为什么两个迭代器在循环中分开?
【发布时间】:2015-11-19 15:08:51
【问题描述】:

我有两个用于 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”

itCnam 指向QStringList,这与前一个完全相同,但在这种情况下,我们在前面有一个额外的元素。所以

  1. “富”
  2. “1”
  3. “...”

我正在检查矩阵每一列的条件,如果不满足条件,我想删除相应的列名。

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
        }
    }

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

【问题讨论】:

    标签: c++ qt iterator qlist


    【解决方案1】:

    您的代码有undefined behavior。当您调用擦除时,迭代器变得无效

    只要项目存在,指向 QLinkedList 中项目的迭代器就保持有效,而指向 QList 的迭代器在任何插入或删除后都可能变得无效。

    (source)

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-03-26
      • 2020-09-01
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多