C++:比较两个向量

Jam*_*ame 68 c++ stdvector

有没有办法比较两个向量?

if (vector1 == vector2)
    DoSomething();
Run Code Online (Sandbox Code Playgroud)

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

sol*_*les 63

您的code(vector1 == vector2)是正确的C++语法.有一个==矢量运算符.

如果要将短向量与较长向量的一部分进行比较,可以使用equal()运算符作为向量.(这里的文件)

这是一个例子:

using namespace std;

if( equal(vector1.begin(), vector1.end(), vector2.begin()) )
    DoSomething();
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案,除了它鼓励不好的做法(`using namespace std`)而不是使用更清晰的`std::equal`。 (5认同)
  • std :: equal()对于普通数组也有效,而等号运算符不是,例如:int a [1000],b [1000]; if(std :: equal(a,a + 1000,b))DoSomething(); (3认同)

Jha*_*iya 25

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

DaniWeb论坛上讨论了比较向量并回答了问题.

C++:比较两个向量

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

比较两个向量C++

  • 答案不好.您应该提供代码示例而不仅仅是链接 - 如果它们发生了什么? (25认同)
  • 请发布您在这里提供的链接的详细信息,如果该链接将来发生故障,整个答案将变得毫无用处. (11认同)
  • `lexicographical_compare`也在这里工作,并且消除了必须处理哪个范围是更长的范围. (2认同)

小智 5

根据此处的讨论,您可以使用直接比较两个向量

==

if (vector1 == vector2){
   //true
}
else{
   //false
}
Run Code Online (Sandbox Code Playgroud)


Cir*_*四事件 5

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())
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

1 返回: 如果对于范围内[first1,last1)的每个迭代器 i 都满足以下相应条件*i == *(first2 + (i - first1)),则为 true :, pred(*i, *(first2 + (i - first1))) != false。否则,返回假。

在我们的例子中,我们关心没有BinaryPredicate版本的重载版本,它对应于第一个伪代码定义*i == *(first2 + (i - first1)),我们看到它只是“所有迭代项都相同”的迭代器友好定义。

其他容器的类似问题: