有没有办法比较两个向量?
if (vector1 == vector2)
DoSomething();
注意:目前,这些向量没有排序并且包含整数值。
您的代码 ( vector1 == vector2
) 是正确的 C++ 语法。有一个==
向量运算符。
如果要将短向量与较长向量的一部分进行比较,可以使用equal()
向量运算符。(这里的文档)
这是一个例子:
using namespace std;
if( equal(vector1.begin(), vector1.end(), vector2.begin()) )
DoSomething();
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))
,我们看到它只是“所有迭代项都相同”的迭代器友好定义。
其他容器的类似问题:
如果他们真的绝对必须保持未排序(他们真的没有......如果你正在处理数十万个元素,那么我不得不问你为什么要比较这样的向量),你可以一起进行比较适用于未排序数组的方法。
我想这样做的唯一方法是创建一个临时的vector3
并假装set_intersection
通过添加所有元素来做 a vector1
,然后搜索 in 的每个单独元素vector2
并vector3
在找到时将其删除。我知道这听起来很糟糕,但这就是为什么我不会很快编写任何 C++ 标准库。
不过,实际上,只需先对它们进行排序。