2011-03-07 306 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