2011-10-02 49 views
1

的矢量I具有載體(loops)的矢量內重複的載體。一些內部向量是重複的,但它們的元素順序不一樣。現在,我想獲得一個矢量矢量而不需要任何重複的內部矢量。 這裏是我的vec vec的例子; (91826119),(91826189),(91825169),(11452611),(11264511),(16492511),(164925119),(1118451911),(1145451111),(1164451111),(1164451111), ),(16 25 49 16),(18 9 11 26 18),(18 9 16 25 18),(25 16 49 25),(26 11 45 26))取出其中包含的整數值向量

爲了確定是否有內部矢量另一個內部向量的副本;我開發了一個功能IsDuplicate。這告訴我,(9 18 26 11 9) and (9 11 26 18 9)重複,然後我可以刪除第二個或所有其他重複。

要刪除我的矢量的矢量內複製的載體,我已經實現以下代碼。

Vector<vector<int> > loops; 
Vector<vector<int> > ::iterator no1, no2; 
Int setno1, setno2; 

for (no1=loops.begin(), setno1=0; no1!=loops.end(); no1++, setno1++){ 
     set1 = *no1; 
     for (no2=loops.begin()+setno1, setno2=setno1; no2!=loops.end(); setno2++){ 
      set2 = *no2; 
      if (set2.IsDuplicate(set1)) loops.erase(loops.begin()+setno2); 
      else no2++; 
     } 

    } 

它花了很長時間,我以爲我的程序是crasihing。所以,請幫我解決這個問題。

也,我試圖與此有關。這有效,但我得到了一個錯誤的答案。請任何幫助。

01 int first=0; bool duplicates=false; 
02 do {  
03  set1 = loops[first];  
04  for (no2=loops.begin()+1, setno2=1; no2!=loops.end(); setno2++){  
05    set2 = *no2;  
06    if (set2.IsPartOf(set1)){  
07     loops.erase(loops.begin()+setno2);  
08     duplicates = true;  
09    }  
10    else no2++;  
11  }  
12  first++;  
13  } while(!duplicates); 
+0

「墜毀」怎麼樣?未捕獲的異常?分割錯誤,也許? – 2011-10-02 12:29:51

+3

爲什麼不製作集合或多集合的向量?那麼識別重複項會更容易。甚至還有一套。 –

+0

@KerrekSB集合(1,1,2)和(1,2,2)是否相等? –

回答

4

這種慣用的方法是使用Erase/Remove idiom自定義謂詞。 要檢查重複的矢量和,無需修改向量的內容,寫一個謂詞的值取它的參數,矢量進行排序,並使用std::equal

bool equal_vector(std::vector<int> a, std::vector<int> b) { 
    std::sort(a.begin(), a.end()); 
    std::sort(b.begin(), b.end()); 

    return std::equal(a.begin(), a.end(), b.begin()); 
} 

// use it like this 
v.erase(remove_if(v.begin(), v.end(), equal_vector), v.end()); 

至於爲什麼你當前的代碼失敗:刪除從vector元素會使所有其他迭代器到矢量是目前存在這樣vector::erase已被刪除的元素之後返回一個有效的迭代器的位置。

stdlib還提供setmultiset容器,看起來更適合您的用途。

+0

感謝您的迴應。但我,我使用DEVC++,我不能用習慣的方法(我試圖用這種方式早些時候刪除向量中的元素,但可以做的。所以我希望,偏差不能識別這些成語。),如果可以的話,請添加傳統的方式來做同樣的事情。那麼,我可以學習和實施。此外,我不能使用set作爲我真正的objct類不是整數(它是我自己的類PointNumber),但從整數繼承併發布爲簡單的整數。 - 在此先感謝 - – niro

+1

@g_niro我沒有使用DevC++的經驗,但這似乎是不可能的。你是否包含正確的標題?你至少需要'算法'和'矢量'才能工作。如果算法頭不支持'remove'或'sort',你應該儘快切換到一個可行的平臺。 – pmr

+0

@g_niro另外,'int'和'PointNumber'差決不做只要'PointNumber'具有'操作者<影響代碼'定義。 – pmr

相關問題