如何在C ++中逐个元素地比较两个向量的相等性?


75

有什么方法可以比较两个向量吗?

if (vector1 == vector2)
    DoSomething();

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


25
您的意思是不管矢量中元素的顺序如何,都要进行比较?否则,上面的代码应该起作用。
Naveen

1
如果要检查两个未排序的数组是否包含完全相同的值,比较是一种简单的方法,即对它们进行排序,然后使用任何一种标准库方法进行比较。

如果只是这么简单。VS2013用于std::equals实现==,然后在运行时声明,因为迭代器不是来自同一容器(!)。您必须在使用或可能使用的所有项目上进行设置_ITERATOR_DEBUG_LEVEL=1(或=0==。啊!
卡梅伦

Answers:


23

std::mismatchC ++的检查 方法。

比较向量已在DaniWeb论坛讨论得到解答

C ++:比较两个向量

检查下面的SO帖子。对您有帮助。他们使用不同2方法获得了相同的效果。

比较两个向量C ++


是否需要对范围进行排序?
Naveen

2
lexicographical_compare在这里也可以使用,并且无需处理较大范围的那个范围。
Billy ONeal

15
请在此处发布您引用的链接的详细信息,如果将来该链接断开,整个答案将无用。
Alok保存

37
错误的答案。您不仅应该提供代码示例,还应该提供链接-如果链接失败了该怎么办?
2013年

请注意,这对具有任意项目顺序的无序向量没有影响:coliru.stacked-crooked.com/a/b66b432234265b7e coliru.stacked-crooked.com/a/66300e8d00a16abf
Zoe

73

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

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

这是一个例子:

using namespace std;

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

3
std :: equal()对纯数组也有效,而相等运算符无效,例如:int a [1000],b [1000]; if(std :: equal(a,a + 1000,b))DoSomething();
Mohamed El-Nakib

4
好的答案,除了它鼓励不好的做法(using namespace std)而不是使用更清晰的std::equal
Fritz

4

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)),我们看到的只是“对所有迭代项都相同”的迭代器友好定义。

其他容器的类似问题:



1

如果它们确实绝对必须保持未排序状态(它们实际上并不需要..并且如果您要处理成千上万个元素,那么我不得不问为什么要比较像这样的向量),则可以一起比较与未排序数组一起使用的方法。

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

确实,不过,请先对它们进行排序。


还是可以创建两个set对象并进行比较?如果确实需要不触摸矢量,那会不会更容易。
Naveen

取决于向量(N*O(N))上N个查找和删除操作的速度与2个集合构造函数对N个元素进行排序的速度有关(cplusplus.com的参考资料为“对于未排序的序列,线性运算(N * logN)。”)+排序的比较(O(N)) 。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.