equal()算法用来比较两个序列是否相等
equal(序列1首元素迭代器,序列1尾元素后面的位置的迭代器,序列2首元素迭代器)
序列1和序列2可以是不同类型的序列。比较的前提是元素可以使用“==”比较,对于自定义的数据,必须重载“==运算符”。
struct ceshi
{
int frist = 0;
int second = 0;
bool operator==(const ceshi &b) const
{
if(b.frist == this->frist && b.second == this->second)
return true;
return false;
}
};
自定义一个结构体,重载“==”运算符,当该结构体对象的frist和second都相等时才认为两个对象是相等的。
std::list<ceshi> list1;
QList<ceshi> list2;
ceshi c1;
c1.frist = 10;
c1.second = 20;
list1.push_back(c1);
list2 << c1;
ceshi c2;
c2.frist = 30;
c2.second = 40;
list1.push_back(c2);
list2 << c2;
ceshi c3;
c3.frist = 50;
c3.second = 60;
list1.push_back(c3);
list2 << c3;
bool result = std::equal(std::begin(list1),std::end(list1),std::begin(list2));
qDebug()<<result;
用一个标准库的list和一个qt的list分别储存相同的数据,比较两个list的结果是相等。
分别存一个不同是数据,结果变成不相等:
再举个例子:
std::list<ceshi> list1;
QMap<int,ceshi> map;
ceshi c1;
c1.frist = 10;
c1.second = 20;
list1.push_back(c1);
map.insert(1,c1);
ceshi c2;
c2.frist = 30;
c2.second = 40;
list1.push_back(c2);
map.insert(2,c2);
ceshi c3;
c3.frist = 50;
c3.second = 60;
list1.push_back(c3);
map.insert(3,c3);
ceshi c5;
c5.frist = 90;
c5.second = 100;
list1.push_back(c5);
ceshi c6;
c6.frist = 110;
c6.second = 120;
list1.push_back(c6);
bool result = std::equal(std::begin(list1),std::end(list1),std::begin(map));
qDebug()<<result;
std::list和QMap也能比较,实际上是std::list和QMap的每个元素的value比较。
注意:
1、第二个序列中元素的个数不能少于第一个序列中元素的个数,否则程序会报错。标准库中像这样第二个序列只用一个迭代器表示的算法都有这样的要求
2、假如第1个序列中的元素个数少于第2个序列中元素个数,且第一个序列中的元素全部和第二个序列中元素相同(序列1是序列2的真子集),那么比较结果也是true