有什么方法可以比较两个向量吗?
if (vector1 == vector2)
DoSomething();
注意:当前,这些向量未排序,并且包含整数值。
Answers:
lexicographical_compare
在这里也可以使用,并且无需处理较大范围的那个范围。
您的代码(vector1 == vector2
)是正确的C ++语法。有一个==
向量运算符。
如果要将短向量与较长向量的一部分进行比较,可以使用equal()
对向量运算符。(此处的文档)
这是一个例子:
using namespace std;
if( equal(vector1.begin(), vector1.end(), vector2.begin()) )
DoSomething();
using namespace std
)而不是使用更清晰的std::equal
。
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返回:如果对于每个迭代i的范围
[first1,last1)
以下相应条件成立:*i == *(first2 + (i - first1))
,pred(*i, *(first2 + (i - first1))) != false
。否则,返回false。
在我们的例子中,我们关心的是没有BinaryPredicate
版本的重载版本,该版本对应于第一个伪代码定义*i == *(first2 + (i - first1))
,我们看到的只是“对所有迭代项都相同”的迭代器友好定义。
其他容器的类似问题:
如果它们确实绝对必须保持未排序状态(它们实际上并不需要..并且如果您要处理成千上万个元素,那么我不得不问为什么要比较像这样的向量),则可以一起比较与未排序数组一起使用的方法。
我要做的唯一方法是创建一个临时vector3
实例,并假装set_intersection
通过添加其所有元素vector1
,然后搜索vector2
in中的每个单独元素vector3
并将其删除(如果找到)。我知道这听起来很糟糕,但是这就是为什么我不会很快编写任何C ++标准库的原因。
确实,不过,请先对它们进行排序。
set
对象并进行比较?如果确实需要不触摸矢量,那会不会更容易。