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

标签 c++ qt iterator qlist

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

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

指向一个像那样制作的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",即使它们在整个循环中接受相同的处理。这里发生了什么?

最佳答案

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

Iterators pointing to an item in a QLinkedList remain valid as long as the item exists, whereas iterators to a QList can become invalid after any insertion or removal.

( source )

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

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

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

关于c++ - 为什么两个迭代器在循环中分开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33807518/

相关文章:

rust - 如何在 StackVec 上实现 IntoIterator

c++ - Blt() 创建图层效果。不工作。我是在使用错误的逻辑函数还是什么?

c++ - 尝试访问 vector<string> 元素时出现错误,文本中的信息

c++ - 如何从 OpenCV rvecs 计算旋转角度

linux - 用于嵌入式 Linux 的 Qt : Hide cursor on startup

python - 在 QtDesigner GUI 中嵌入 matplotlib 图

c++ - 使用字符串生成 IP 地址

Qt - 同时制作水平和垂直的拆分器

java - 迭代数组列表的最佳方法是什么

python - 乘以来自Python中两个单独列表的 float