说明
lexicographical_compare
按照字典顺序来判断第一个范围的序列是否小于第二个范围的序列。
常用的函数原型有两种:
template< class InputIt1, class InputIt2 >
bool lexicographical_compare( InputIt1 first1, InputIt1 last1,
InputIt2 first2, InputIt2 last2 );
和
template< class InputIt1, class InputIt2, class Compare >
bool lexicographical_compare( InputIt1 first1, InputIt1 last1,
InputIt2 first2, InputIt2 last2,
Compare comp );
第一种是用operator<
比较元素。第二种是用给定的二元比较函数comp
来比较元素。
函数的前面四个参数分别用于指定两个序列的起止范围。
返回值:
若第一范围按字典顺序小于第二个则为 true
,否则为 false
。
关于按照字典顺序比较的说明
- 逐元素比较二个范围
- 首个不相等元素定义范围是否按字典序小于或大于另一个
- 若一个范围是另一个的前缀,则较短的范围小于另一个
- 若二个范围拥有等价元素和相同长度,则范围按字典序相等
- 空范围按字典序小于任何非空范围
- 二个空范围按字典序相等
头文件
#include <algorithm>
例子
#include <iostream>
#include <vector>
#include <algorithm>
int main()
{
// v1 < v2
std::vector<char> v1{ 'a', 'b', 'c', 'd' };
std::vector<char> v2{ 'm', 'a', 'c' };
if(std::lexicographical_compare(v1.begin(), v1.end(), v2.begin(), v2.end())) {
for (auto c : v1) std::cout << c << ' ';
std::cout << "< ";
for (auto c : v2) std::cout << c << ' ';
std::cout << '\n';
}
else {
for (auto c : v1) std::cout << c << ' ';
std::cout << ">= ";
for (auto c : v2) std::cout << c << ' ';
std::cout << '\n';
}
// v3 >= v4
std::vector<char> v3{ 'a', 'b', 'c', 'd' };
std::vector<char> v4{ 'a', 'a', 'b', 'c', 'e' };
if (std::lexicographical_compare(v3.begin(), v3.end(), v4.begin(), v4.end())) {
for (auto c : v3) std::cout << c << ' ';
std::cout << "< ";
for (auto c : v4) std::cout << c << ' ';
std::cout << '\n';
}
else {
for (auto c : v3) std::cout << c << ' ';
std::cout << ">= ";
for (auto c : v4) std::cout << c << ' ';
std::cout << '\n';
}
return 0;
}
结果:
a b c d < m a c
a b c d >= a a b c e
参考
https://zh.cppreference.com/w/cpp/algorithm/lexicographical_compare
http://www.cplusplus.com/reference/algorithm/lexicographical_compare/
网友评论