C++初学者指南-5.标准库(第一部分)--标准库范围比较算法

C++初学者指南-5.标准库(第一部分)–标准库范围比较算法


不熟悉 C++ 的标准库算法? ⇒ 简介

equal

在这里插入图片描述
如果在两个范围内的所有元素都相等则返回true
可以使用 == 运算符来比较元素;也可以作为额外参数传递自定义函数(对象)。
cppreference

std::vector<int> r1 {0,1,2,3,4,5,6,7,8,9};
std::vector<int> r2 {1,2,3,4,5,6,0,0};
// 比较子范围,如图所示:
cout << equal(begin(r1)+2, begin(r1)+7, begin(r2)+1);  // true
// 比较整个容器:
cout << equal(begin(r1), end(r1), begin(r2));  // false
// 比较其它子范围:
cout << equal(begin(r1)+1, begin(r1)+7, begin(r2), begin(r2)+6);  // true
// 自定义类型:
struct P { int x; char q; };
std::vector<P> a { P{1,'n'}, P{2,'m'} };
std::vector<P> b { P{1,'y'}, P{2,'z'} };
// 用成员x比较类型P:
cout << equal(begin(a),end(a), begin(b),end(b), 
 [](P p1, P p2) { return p1.x == p2.x; } );  // true

运行示例代码

在这里插入图片描述
可以使用 operator == 来比较元素;或者可以将自定义函数(对象) 作为第三个参数传递。
cppreference

std::vector<int> range1 {2,3,4,5,6};
std::vector<int> range2 {2,3,4,5,6};
// compare subranges (as shown in image):
cout << std::ranges::equal(range1, range2);  // true

运行示例代码

mismatch

在这里插入图片描述
返回一个 std::pair,指向两个范围内第一个不匹配元素的迭代器
使用 operator == 来比较元素;另外,可以作为额外参数传入一个自定义函数(对象)
cppreference

std::vector<int> r1 {0,1,2,3,4,5,6,7,8,9};
std::vector<int> r2 {1,2,3,4,5,7,8,8};
// 比较子范围,如图所示:
auto p = mismatch(begin(r1)+2, begin(r1)+9, begin(r2)+1);
// != 范围结尾 ⇒ 返回不匹配的第一个元素的迭代器
if (p.first  != begin(r1)+9) { auto p1value = *p.first;  }  // 6
if (p.second != end(r2))     { auto p2value = *p.second; }  // 7
// 整个容器比较:
auto q = mismatch(begin(r1), end(r1), begin(r2));
if (q.first != end(r1)) {
 auto q1value = *q.first;  // 0
 auto q1index = distance(begin(r1), q.first);  // 0
}
if (q.second != end(r2)) {
 auto q2value = *q.second;  // 1
 auto q2index = distance(begin(r2), q.second);  // 0
}

运行示例代码

在这里插入图片描述
使用operator == 来比较元素;另外可以将自定义函数(对象)作为额外参数传入。
cppreference

std::vector<int> range1 {1,5,4,6,3};
std::vector<int> range2 {1,5,4,7,3};
auto [p1,p2] = std::ranges::mismatch(range1, range2);
auto const value1 = *p1;  // 6
auto const value2 = *p2;  // 7

运行示例代码

lexicographical_compare

在这里插入图片描述
如果范围1排序在范围2之前则返回true
使用operator < 来比较元素;另外,可以作为额外参数传递自定义函数(对象)。
cppreference

std::string r1 = "xalgori";
std::string r2 = "abced";
// 比较子范围,如图所示:
cout << lexicographical_compare(begin(r1)+1, begin(r1)+5,
                               begin(r2)+1, begin(r2)+4);  // true (r1 before r2)
// 比较整个容器:
cout << lexicographical_compare(begin(r1), end(r1),
                               begin(r2), end(r2));  // false (r1 after r2)
// 字符串实际上已经可以比较了:
cout << (r1 < r2);  // false
cout << (r1 > r2);  // true (r1 after r2)
// 自定义类型
struct P { int x; int y; };
std::vector<P> a { P{1,9}, P{2,9} };
std::vector<P> b { P{1,8}, P{3,8} };
// 仅通过成员 'x' 比较 'P':
cout << lexicographical_compare(begin(a),end(a), begin(b),end(b), 
 [](P p1, P p2) { return p1.x < p2.x; } );  // true

运行示例代码

在这里插入图片描述
使用operator < 来比较元素;另外,可以作为额外参数传递自定义函数(对象)。
cppreference

std::vector<char> range1 = {'a','l','g','o'};
std::vector<char> range2 = {'b','c','e'};
cout << std::ranges::lexicographical_compare(range1, range2);  // true
cout << std::ranges::lexicographical_compare(range1, range2, std::greater<>{});  // false

运行示例代码

lexicographical_compare_three_way

在这里插入图片描述
3种比较结果
结果 <0 则范围1在范围2之前
结果 =0 则范围1和范围2排序相同
结果 >0 则范围1在范围2之后
使用三向比较比较两个范围,并将结果作为最适用的比较类别的值返回(std::strong_ordering, std::weak_ordering或std::partial_ordering)
cppreference

std::string r1 = "xalgori";
std::string r2 = "abced";
// 比较子范围,如图所示:
auto const lcA = lexicographical_compare_three_way(
 begin(r1)+1, begin(r1)+5, begin(r2)+1, begin(r2)+4);
cout << (lcA <  0);  // true
cout << (lcA == 0);  // false
cout << (lcA >  0);  // false
// 比较整个字符数,使用C++20的太空船操作符:
auto const lcB = r1 <=> r2;
cout << (lcB <  0);  // false
cout << (lcB == 0);  // false
cout << (lcB >  0);  // true

运行示例代码

相关内容

标准算法概述
C++标准库算法介绍
标准序列容器(vector、deque、list、…)
标准关联容器(map、set、…)
标准序列视图
cppreference:算法库
cppreference:容器库
视频:什么是 C++ 标准库?
视频:一小时内掌握 105 个 STL 算法 (Jonathan Boccara,2018)
C++ 之旅:容器和算法
算法概述表:
在这里插入图片描述

[附上原文链接[(https://hackingcpp.com/cpp/std/algorithms/comparing_ranges.html)
如果文章对您有用,请随手点个赞,谢谢!^_^

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值