2013-12-18 91 views
0

我遍歷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的任何元素被擦除之前設置。

+0

考慮尋找std算法。如果你使用std :: remove_if,你可以寫這個而不用擔心無效迭代器。 – YoungJohn

回答

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;

+0

是的,謝謝! – t354

0

使用

near_pts.erase(it); 

無效it。在此操作之後,任何使用迭代器it的行爲都有未定義的行爲。您可能需要使用

near_ptrs.erase(it++); 

代替:這種方式被刪除之前的迭代器it移出了刪除元素。當然,使用該語句後,您不能無條件地增加it

+0

這與問題無關,但讓我建議更好的方法來使'it'有效:'it = near_pts.erase(it)'。在C++ 11中,所有'erase'函數都返回指向下一個容器元素的迭代器。 –

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; 
    } 
    } 
} 
+0

感謝您的支持,這對我來說是一個非常愚蠢的錯誤。對不起浪費大家的時間,但我真的很感激它。 – t354

相關問題