我正在迭代2D数组(lib)的行,并将每行中的前4个条目与包含4个元素的元组(near_pts)的向量进行比较。基本上,我想从lib中提取所有行,其中前4个元素(在该行中)匹配near_pts中的任何元组,并将这些行添加到新的2D数组(sub_lib)。在lib或near_pts中不应该有任何重复。
当来自near_pts的元组在lib中匹配时,我想从near_pts中删除它,以便不会浪费时间来尝试匹配该特定元组。我希望,因为我在擦除后立即有一个break语句,我们将转到外部for循环的下一次迭代,而near_pts上的迭代器将被重置以处理near_pts的修改版本。然而,这似乎并没有发生,一些元组永远不会匹配(并且应该总是匹配)。我知道这个问题与迭代器有关,因为我的调试工作表明,当多个元素仍然存在时,迭代器有时只会循环超过1个元素near_pts,但我无法弄清楚为什么会发生这种情况。代码如下,如果需要更多信息和/或清晰度,请告诉我。
int n = 0;
for (int i=0; i<numPts; i++) {
for (vector<my_tup>::iterator it = near_pts.begin(); it != near_pts.end(); it++) {
bool match = (get<0>(*it)==lib[i][0] && get<1>(*it)==lib[i][1] &&
get<2>(*it)==lib[i][2] && get<3>(*it)==lib[i][3]);
// If there is a match, add it to the sub-library, erase the entry
// from near_pts, and exit the interior loop.
if (match) {
for (int j=0; j<numLibCols; j++) { sub_lib[n][j] = lib[i][j]; }
n++;
near_pts.erase(it);
break;
}
// If we have found all of the tuples, exit the loop.
if (n==near_pts.size()) { break; }
}
}
注意:lib实际上是一个大小为numPts x 13的2D数组,near_pts是my_tup的向量,其中my_tup是一个元组&lt; double,double,double,double&gt;和sub_lib是一个大小为near_pts.size()x 13的2D数组,其中此大小在near_pts的任何元素被删除之前设置。
答案 0 :(得分:2)
你的最终状况
// If we have found all of the tuples, exit the loop.
if (n==near_pts.size()) { break; }
是不正确的,因为near_pts会减少,并且每次匹配都会增加n。
您可能想查看if (near_pts.empty()) break;
答案 1 :(得分:1)
在向量中迭代期间擦除使迭代器无效,因此您需要更新它。这样做也消除了最后检查n
,因为当near_pts
为空时,迭代器必须位于near_pts.end()
。
int n = 0;
for (int i=0; i<numPts; i++) {
vector<my_tup>::iterator it = near_pts.begin();
while(it != near_pts.end()) {
bool match = (get<0>(*it)==lib[i][0] && get<1>(*it)==lib[i][1] &&
get<2>(*it)==lib[i][2] && get<3>(*it)==lib[i][3]);
// If there is a match, add it to the sub-library, erase the entry
// from near_pts, and exit the interior loop.
if (match) {
for (int j=0; j<numLibCols; j++) { sub_lib[n][j] = lib[i][j]; }
n++;
it = near_pts.erase(it);
break;
}
else {
++it;
}
}
}
答案 2 :(得分:0)
使用
near_pts.erase(it);
使it
无效。在此操作之后对迭代器it
的任何使用都有未定义的行为。您可能想要使用
near_ptrs.erase(it++);
代替:这样迭代器it
在擦除之前就会从擦除元素移出。当然,在使用该语句后,您无法无条件地增加it
。