我遍歷2D數組(lib)的行並將每行的前4個條目與包含4個元素的元組(near_pts)的向量進行比較。基本上,我想從lib中提取前四個元素(在該行中)與near_pts中的任何元組相匹配的所有行,並將這些行添加到新的二維數組(sub_lib)。在lib或near_pts中不應該有任何重複。在兩個for循環內擦除一個向量的元素
當一個來自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×13的2D陣列,near_pts是my_tup,其中my_tup是一個元組的矢量<雙,雙,雙,雙>和sub_lib是的2D陣列大小near_pts.size()x 13,其中這個大小在near_pts的任何元素被擦除之前設置。
考慮尋找std算法。如果你使用std :: remove_if,你可以寫這個而不用擔心無效迭代器。 – YoungJohn