有没有办法比较两个载体?
if (vector1 == vector2)
DoSomething();
注意:目前,这些向量未排序并包含整数值。
答案 0 :(得分:62)
您的代码(vector1 == vector2
)是正确的C ++语法。向量有一个==
运算符。
如果要将短矢量与较长矢量的一部分进行比较,可以使用equal()
运算符作为矢量。 (documentation here)
以下是一个例子:
using namespace std;
if( equal(vector1.begin(), vector1.end(), vector2.begin()) )
DoSomething();
答案 1 :(得分:27)
答案 2 :(得分:1)
如果他们真的绝对必须保持未分类(他们真的没有......如果你正在处理数十万个元素,那么我不得不问你为什么要比较这样的矢量),你可以破解一起使用与未排序数组一起使用的比较方法。
我要这样做的唯一方法是创建一个临时的vector3
并假装通过向其添加set_intersection
的所有元素来执行vector1
,然后搜索vector2
中vector3
的每个单独元素,如果找到则将其删除。我知道这听起来很糟糕,但这就是为什么我不会很快写出任何C ++标准库。
但是,真的,先把它们排序。
答案 3 :(得分:1)
答案 4 :(得分:0)
==
上std::vector
的C ++ 11标准
其他have mentioned的operator==
确实比较了矢量内容并起作用,但这是C++11 N3337 standard draft的引言,我相信这是暗示。
我们首先查看第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,以下相应条件成立:*i == *(first2 + (i - first1))
,pred(*i, *(first2 + (i - first1))) != false
,则返回true。否则,返回false。
在我们的案例中,我们关心的是没有BinaryPredicate
版本的重载版本,该版本对应于第一个伪代码定义*i == *(first2 + (i - first1))
,我们看到的只是“所有迭代项的迭代器友好定义”一样”。
对于其他容器的类似问题: