84

有没有办法比较两个向量?

if (vector1 == vector2)
    DoSomething();

注意:目前,这些向量没有排序并且包含整数值。

4

5 回答 5

83

您的代码 ( vector1 == vector2) 是正确的 C++ 语法。有一个==向量运算符。

如果要将短向量与较长向量的一部分进行比较,可以使用equal()向量运算符。(这里的文档

这是一个例子:

using namespace std;

if( equal(vector1.begin(), vector1.end(), vector2.begin()) )
    DoSomething();
于 2012-09-29T00:13:05.577 回答
20

C++的检查 std::mismatch方法。

比较向量已在DaniWeb 论坛上进行了讨论并得到了回答

C++:比较两个向量

检查下面的SO帖子。会对你有所帮助。他们用不同的2方法达到了相同的效果。

比较两个向量 C++

于 2011-06-06T05:19:29.307 回答
6

C++11==标准std::vector

其他人提到确实operator==比较了矢量内容和作品,但这里引用了C++11 N3337 标准草案,我相信这暗示了这一点。

我们首先看第 23.2.1 章“一般容器要求”,它记录了必须对所有容器有效的内容,包括因此std::vector

包含条目的表 96“容器要求”部分:

Expression   Operational semantics
===========  ======================
a == b       distance(a.begin(), a.end()) == distance(b.begin(), b.end()) &&
             equal(a.begin(), a.end(), b.begin())

distance语义部分意味着两个容器的大小相同,但以通用迭代器友好的方式表示,用于非随机访问可寻址容器。distance()在第 24.4.4 节“迭代器操作”中定义。

那么关键问题是什么equal()意思。在表格的最后,我们看到:

注意:算法 equal() 在第 25 条中定义。

在第 25.2.11 节“相等”中,我们找到了它的定义:

template<class InputIterator1, class InputIterator2>
bool equal(InputIterator1 first1, InputIterator1 last1,
           InputIterator2 first2);

template<class InputIterator1, class InputIterator2,
class BinaryPredicate>
bool equal(InputIterator1 first1, InputIterator1 last1,
           InputIterator2 first2, BinaryPredicate pred);

1 返回:如果对于范围内[first1,last1)的每个迭代器 i 都满足以下相应条件,则为 true:*i == *(first2 + (i - first1)), pred(*i, *(first2 + (i - first1))) != false. 否则,返回 false。

在我们的例子中,我们关心的是没有版本的重载版本BinaryPredicate,它对应于第一个伪代码定义*i == *(first2 + (i - first1)),我们看到它只是“所有迭代项都相同”的迭代器友好定义。

其他容器的类似问题:

于 2019-11-06T12:14:21.267 回答
4

根据这里的讨论,您可以使用直接比较两个向量

==

if (vector1 == vector2){
   //true
}
else{
   //false
}
于 2018-03-20T18:33:03.973 回答
1

如果他们真的绝对必须保持未排序(他们真的没有......如果你正在处理数十万个元素,那么我不得不问你为什么要比较这样的向量),你可以一起进行比较适用于未排序数组的方法。

我想这样做的唯一方法是创建一个临时的vector3并假装set_intersection通过添加所有元素来做 a vector1,然后搜索 in 的每个单独元素vector2vector3在找到时将其删除。我知道这听起来很糟糕,但这就是为什么我不会很快编写任何 C++ 标准库。

不过,实际上,只需先对它们进行排序。

于 2011-06-06T05:56:59.880 回答