为什么两个迭代器在循环中分开?
Why do two iterators shift apart in loop?
我有两个用于 QStringList
的 STL 样式迭代器,它们在这样的循环之前被初始化。
QStringList::iterator it(cnamesNum->begin()),itCnam(cnames->begin()+1+totMetaData);
it
指向一个 QStringList
那样做的
- “1”
- "2"
- "3"
- "4"
- "5"
- "6"
而 itCnam
指向一个 QStringList
,它与前面的完全一样,但在这种情况下,我们在前面有一个额外的元素。所以
- "foo"
- “1”
- “...”
我正在检查矩阵的每一列的条件,如果不满足条件,我想删除相应的列名。
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
}
}
条件检查正常工作,从 cnamesNum
和 cnames
中删除的 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++
,并且只递增 it
和 itCnam
。
我有两个用于 QStringList
的 STL 样式迭代器,它们在这样的循环之前被初始化。
QStringList::iterator it(cnamesNum->begin()),itCnam(cnames->begin()+1+totMetaData);
it
指向一个 QStringList
那样做的
- “1”
- "2"
- "3"
- "4"
- "5"
- "6"
而 itCnam
指向一个 QStringList
,它与前面的完全一样,但在这种情况下,我们在前面有一个额外的元素。所以
- "foo"
- “1”
- “...”
我正在检查矩阵的每一列的条件,如果不满足条件,我想删除相应的列名。
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
}
}
条件检查正常工作,从 cnamesNum
和 cnames
中删除的 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++
,并且只递增 it
和 itCnam
。