如何在 C++ 中逐个元素地比较两个向量的相等性?
Posted
技术标签:
【中文标题】如何在 C++ 中逐个元素地比较两个向量的相等性?【英文标题】:How to compare two vectors for equality element by element in C++? 【发布时间】:2011-09-09 00:50:32 【问题描述】:有没有办法比较两个向量?
if (vector1 == vector2)
DoSomething();
注意:目前,这些向量未排序且包含整数值。
【问题讨论】:
您的意思是要比较不考虑向量中元素的顺序?否则,上面的代码应该可以工作。 一个简单的方法来比较您是否有两个要检查的未排序数组是否包含完全相同的值,是对它们进行排序,然后使用任何一个标准库方法进行比较。 要是这么简单就好了。 VS2013 使用std::equals
来实现==
,然后在运行时断言,因为迭代器不是来自同一个容器(!)您必须在所有使用的项目上设置_ITERATOR_DEBUG_LEVEL=1
(或=0
),或者可能会使用,==
。啊!!
cplusplus.com/reference/vector/vector/operators vector
支持==
和<
类型比较
【参考方案1】:
检查C++的std::mismatch
方法。
比较向量已在 DaniWeb 论坛上进行了讨论,并且还回答了。
C++: Comparing two vectors
查看下面的 SO 帖子。会对你有所帮助。他们用 different-2 方法达到了同样的效果。
Compare two vectors C++
【讨论】:
是否需要对范围进行排序?lexicographical_compare
也适用于此,无需处理哪个范围是更长的范围。
请在此处发布您引用的链接的详细信息,如果该链接将来出现故障,整个答案将变得毫无用处。
错误答案。您应该提供代码示例,而不仅仅是链接——如果它们失败了怎么办?
请注意,这对具有任意项目顺序的无序向量没有影响:coliru.stacked-crooked.com/a/b66b432234265b7ecoliru.stacked-crooked.com/a/66300e8d00a16abf【参考方案2】:
如果他们真的必须保持未排序(他们真的没有......如果你正在处理数十万个元素,那么我不得不问你为什么要比较这样的向量),你可以破解一起使用与未排序数组一起使用的比较方法。
我想到的唯一方法是创建一个临时的vector3
并通过添加vector1
的所有元素来假装做set_intersection
,然后搜索@987654324 的每个单独元素@ in vector3
并在找到时将其删除。我知道这听起来很糟糕,但这就是为什么我不会很快编写任何 C++ 标准库。
真的,不过,先对它们进行排序。
【讨论】:
或者可以创建两个set
对象并比较它们?如果真的需要不接触矢量,那不是更容易吗?
取决于向量 (N*O(N)
) 上的 N 个查找和删除操作与对 N 个元素进行排序的 2 个集合构造函数的速度(cplusplus.com 的参考资料显示“对于未排序的序列,线性 (N*logN )..") + 排序比较 (O(N)
)。【参考方案3】:
您的代码 (vector1 == vector2
) 是正确的 C++ 语法。向量有一个==
运算符。
如果要将短向量与较长向量的一部分进行比较,可以对向量使用equal()
运算符。 (documentation here)
这是一个例子:
using namespace std;
if( equal(vector1.begin(), vector1.end(), vector2.begin()) )
DoSomething();
【讨论】:
std::equal() 对普通数组也有效,而相等运算符则无效,例如:int a[1000], b[1000]; if(std::equal(a, a+1000,b)) DoSomething(); 好的答案,除了它鼓励不良做法 (using namespace std
) 而不是使用更清晰的std::equal
。【参考方案4】:
根据here的讨论,你可以直接使用比较两个向量
==
if (vector1 == vector2)
//true
else
//false
【讨论】:
【参考方案5】:==
上针对 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))
,我们看到它只是“所有迭代项都相同”的迭代器友好定义.
其他容器的类似问题:
how to compare two std::set?【讨论】:
以上是关于如何在 C++ 中逐个元素地比较两个向量的相等性?的主要内容,如果未能解决你的问题,请参考以下文章