C ++:比较两个向量

时间:2011-06-06 05:17:19

标签: c++ stdvector

有没有办法比较两个载体?

if (vector1 == vector2)
    DoSomething();

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

5 个答案:

答案 0 :(得分:62)

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

如果要将短矢量与较长矢量的一部分进行比较,可以使用equal()运算符作为矢量。 (documentation here

以下是一个例子:

using namespace std;

if( equal(vector1.begin(), vector1.end(), vector2.begin()) )
    DoSomething();

答案 1 :(得分:27)

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

DaniWeb论坛以及已回答讨论了比较向量。

C++: Comparing two vectors

检查以下SO帖子。会对你有所帮助。他们用不同的方法实现了同样的目标。

Compare two vectors C++

答案 2 :(得分:1)

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

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

但是,真的,先把它们排序。

答案 3 :(得分:1)

根据讨论here,您可以使用

直接比较两个向量
  

==

if (vector1 == vector2){
   //true
}
else{
   //false
}

答案 4 :(得分:0)

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

其他have mentionedoperator==确实比较了矢量内容并起作用,但这是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)),我们看到的只是“所有迭代项的迭代器友好定义”一样”。

对于其他容器的类似问题: