2011-03-07 304 views
16

我想知道是否有任何函數比較2個字符串向量以返回不同(或相同)元素的數量?或者我必須對它們進行迭代並逐項測試。
謝謝。比較兩個向量C++

+0

您是否需要比較具有相同索引的元素或者是否具有檢測不同位置匹配的算法? – 2011-03-07 22:08:53

+0

它需要檢測匹配是 – Kobe 2011-03-07 22:09:45

+0

如何檢測所有元素在不同位置的匹配?在這種情況下,矢量的數量是無關緊要的。你確定這就是你想要的嗎? – 2011-03-07 22:16:09

回答

40
std::sort(v1.begin(), v1.end()); 
std::sort(v2.begin(), v2.end()); 
std::vector<string> v3; 
std::set_intersection(v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(v3)); 

或者,如果你不想進行排序:

std::set<string> s1(v1.begin(), v1.end()); 
std::set<string> s2(v2.begin(), v2.end()); 
std::vector<string> v3; 
std::set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), std::back_inserter(v3)); 

您可能需要使用一個多重是否有可能是一個矢量重複。

+0

好想法:) – Kobe 2011-03-07 22:16:26

+0

好的,只需要添加#include #include 2016-03-12 00:10:18

4

我不知道現有的功能,但自己寫一個不應該太麻煩。

int compare(const vector<string>& left, const vector<string>& right) { 
    auto leftIt = left.begin(); 
    auto rightIt = right.begin(); 
    auto diff = 0; 
    while (leftIt != left.end() && rightIt != right.end()) { 
    if (*leftIt != *rightIt) { 
     diff++; 
    } 
    leftIt++; 
    rightIt++; 
    } 

    // Account for different length vector instances 
    if (0 == diff && (leftIt != left.end() || rightIt != right.end())) { 
    diff = 1; 
    } 

    return diff; 
} 

  • std::爲簡潔前綴
  • 此功能需要更新,如果它要處理不同長度的vector<string>實例
+0

謝謝,我以爲我需要實現一個... btw關於您的代碼,是否有任何具體原因您使用自動爲您的本地變量? :)從未見過自動使用,直到現在 – Kobe 2011-03-07 22:15:26

+0

@vBx,在C++ 0x「自動」重新用於類型推斷。在'auto'使用上面的編譯器可以推斷出我的類型,所以我不必爲這兩個迭代器寫出完整的'vector :: const_iterator'。它非常類似於C#的'var'關鍵字 – JaredPar 2011-03-07 22:17:24

+0

我們可以用count_if()做的更好。 – 2011-03-07 22:17:50