61

第一个例子:

int main(){
    using namespace std;   
    vector<int> v1{10, 20, 30, 40, 50};
    vector<int> v2{10, 20, 30, 40, 50};

    if(v1==v2)
        cout<<"equal";
    else
        cout<<"unequal";
}   // it returns equal 

第二个例子:

int main(){
    using namespace std;   
    vector<int> v1{10, 20, 30, 40, 50};
    vector<int> v2{10, 20, 100000, 40, 50};

    if(v1==v2)
        cout<<"equal";
    else
        cout<<"unequal";
}   // it returns notequal 
4

6 回答 6

87

对两个s起作用重载operator ==std::vector将比较向量大小,false如果它们不同则返回;如果不是,它将逐个元素地比较向量的内容。

如果operator ==为向量的元素类型定义了,那么向量的比较通过operator ==是有效且有意义的。

在形式上,C++11 标准将a == b序列容器的操作语义指定为(表 96,第 23.2.1 节):

==是等价关系。

distance(a.begin(), a.end()) == distance(b.begin(), b.end()) && equal(a.begin(), a.end(), b.begin())

如您所见,序列容器之间的相等性是根据std::equal迭代器对定义的范围之间的算法定义的,而迭代器又operator ==用于比较单个元素。

于 2013-05-07T15:13:23.567 回答
8

是的,你可以operator==用来比较两个std::vectors。true只有当向量大小相同且所有元素比较相等时,它才会返回。

于 2013-05-07T15:12:44.340 回答
5

请注意,向量是有序的,std::equal或者==操作员检查向量是否以相同的顺序具有相同的内容。对于许多用例来说,这可能就足够了。

但是有时您可能想知道两个向量是否具有相同的内容但不一定具有相同的顺序。对于这种情况,您需要另一个功能。

下面是一个不错且简短的实现。此处建议:https ://stackoverflow.com/questions/17394149/how-to-efficiently-compare-vectors-with-c/17394298#17394298 在那里您还将找到有关您可能不想使用它的原因的讨论...

将其放入您选择的头文件中:

#include <algorithm>

template <class T>
static bool compareVectors(std::vector<T> a, std::vector<T> b)
{
   if (a.size() != b.size())
   {
      return false;
   }
   ::std::sort(a.begin(), a.end());
   ::std::sort(b.begin(), b.end());
   return (a == b);
}

这里有一个说明上述理论的例子:

std::vector<int> vector1;
std::vector<int> vector2;

vector1.push_back(100);
vector1.push_back(101);
vector1.push_back(102);

vector2.push_back(102);
vector2.push_back(101);
vector2.push_back(100);

if (vector1 == vector2)
   std::cout << "same" << std::endl;
else
   std::cout << "not same" << std::endl;

if (std::equal(vector1.begin(), vector1.end(), vector2.begin()))
   std::cout << "same" << std::endl;
else
   std::cout << "not same" << std::endl;

if (compareVectors(vector1, vector2))
   std::cout << "same" << std::endl;
else
   std::cout << "not same" << std::endl;

输出将是:

not same
not same
same
于 2016-11-23T16:30:07.317 回答
2

您可以查看operator==for vector 的文档:operator==,!=,<,<=,>,>=(std::vector)

引用链接:

 template< class T, class Alloc >
 bool operator==( vector<T,Alloc>& lhs,
             vector<T,Alloc>& rhs );

比较两个容器的内容。

检查 lhs 和 rhs 的内容是否相等,即 lhs.size() == rhs.size() 和 lhs 中的每个元素是否在 rhs 中的相同位置有相同的元素。

参数:

lhs, rhs 要比较其内容的容器

T 必须满足 EqualityComparable 的要求才能使用版本

返回值

如果容器的内容相等,则为 true,否则为 false

于 2013-05-07T15:14:50.513 回答
1

是的。一个很好的参考是cppreference.com,您可以在其中查找operator==vector<T>例如在此页面上:非会员操作员,您会发现:

检查 lhs 和 rhs 的内容是否相等,即 lhs.size() == rhs.size() 和 lhs 中的每个元素是否在 rhs 中的相同位置有相同的元素。

于 2013-05-07T15:15:03.460 回答
1

只要您的向量包含本身可以比较的元素(具有operator==),就可以了,是的。但是请注意,如果您的向量包含指向相同对象的指针,但不是对象的 SAME 实例,则该向量不被视为相同,因为向量中的元素是被比较的元素,而不是这样的元素,如果这有意义的话。

于 2013-05-07T15:17:03.960 回答