比较两个向量(C++)

23

我想知道是否有比较两个字符串向量并返回不同(或相同)元素数量的函数?还是我必须逐个迭代它们并测试每个项目。
谢谢。


它需要检测匹配。 - Adrian
如何检测所有元素在不同位置的匹配?在这种情况下,向量的数量是无关紧要的。您确定这就是您想要的吗? - Nick Rolando
@Nicklamort:我正在寻找两个向量中都存在的三个字符串中的最小值。 - Adrian
可能可以查看 std::count_ifstd::for_each - AJG85
1
@vBx 这是你应该在原始帖子中提供的关键信息 >_< - Nick Rolando
显示剩余2条评论
4个回答

46
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));

如果向量中可能存在重复元素,您可能希望使用multiset。


1
好的,只需要添加 #include <algorithm> 和 #include <iterator>。 - Jean-Christophe Blanchard
对于 std::sort,你需要确保 v1 和 v2 不是 const,并且实现了 operator<,这在所有情况下都无法保证。 - jaques-sam
如果一个类/结构体代替了字符串,那么在该类中必须实现哪个std::method才能使其与set_intersection一起工作?是std::less还是其他什么?能否编辑答案并添加一个类/结构体类型的示例,而不是字符串?谢谢。 - Raffaello

5

5

我不知道是否存在这样的功能,但编写一个并不会太麻烦。

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>实例,则需要更新此函数

谢谢,我以为我需要实现一个...顺便问一下,关于你的代码,你使用auto作为本地变量有什么特定的原因吗? :) 直到现在我都没见过auto被使用。 - Adrian
在C++0x中,“auto”被重新定义为类型推断。在上面的“auto”用法中,编译器可以为我推断出类型,因此我不必为两个迭代器都写出完整的“vector<string>::const_iterator”。这非常类似于C#中的“var”关键字。 - JaredPar
我们可以用count_if()做得更好。 - Martin York
@Martin York,难道不需要将这两个vector<string>实现合并为一个吗?我认为count_if只能在单个迭代器范围上操作。虽然谓词可以是一个改变第二个迭代器的lambda函数,但感觉不太对。 - JaredPar
这个函数的整个主体可以被替换为“return left == right;”。 - Tom Sirgedas
显示剩余2条评论

2
if (vector1 == vector2)
{
    DoSomething();
}

根据以下链接文档,将比较两个向量的内容:

比较两个向量的内容。

1-2)检查lhs和rhs的内容是否相等,即它们具有相同数量的元素,并且lhs中的每个元素与rhs中相同位置的元素相等。

链接: https://en.cppreference.com/w/cpp/container/vector/operator_cmp

vector 支持 ==< 类型比较。 - Andrew
@Andrew,是的,它支持两种,列表在上面的链接中提到了。 - Build Succeeded

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接