std::lexicographical_compare
在标头 <algorithm> 定义
|
||
(1) | ||
template< class InputIt1, class InputIt2 > bool lexicographical_compare( InputIt1 first1, InputIt1 last1, |
(C++20 前) | |
template< class InputIt1, class InputIt2 > constexpr bool lexicographical_compare( InputIt1 first1, InputIt1 last1, |
(C++20 起) | |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 > bool lexicographical_compare( ExecutionPolicy&& policy, |
(2) | (C++17 起) |
(3) | ||
template< class InputIt1, class InputIt2, class Compare > bool lexicographical_compare( InputIt1 first1, InputIt1 last1, |
(C++20 前) | |
template< class InputIt1, class InputIt2, class Compare > constexpr bool lexicographical_compare( InputIt1 first1, InputIt1 last1, |
(C++20 起) | |
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2, class Compare > |
(4) | (C++17 起) |
检查第一个范围 [
first1,
last1)
是否按字典序小于 第二个范围 [
first2,
last2)
。
std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> |
(C++20 前) |
std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> |
(C++20 起) |
字典序比较是拥有下列属性的操作:
- 逐元素比较两个范围。
- 首个不匹配元素定义范围是否按字典序小于 或大于 另一个。
- 如果一个范围是另一个的前缀,那么较短的范围小于 另一个。
- 如果两个范围拥有等价元素和相同长度,那么范围按字典序相等。
- 空范围按字典序小于 任何非空范围。
- 两个空范围按字典序相等。
参数
first1, last1 | - | 要检验的第一个元素范围 |
first2, last2 | - | 要检验的第二个元素范围 |
policy | - | 所用的执行策略。细节见执行策略。 |
comp | - | 比较函数对象(即满足比较 (Compare) 要求的对象),如果首个参数小于 第二个,那么返回 true。 比较函数的签名应等价于如下: bool cmp(const Type1 &a, const Type2 &b); 虽然签名不必有 const &,函数也不能修改传递给它的对象,而且必须接受(可有 const 限定的)类型 |
类型要求 | ||
-InputIt1, InputIt2 必须符合老式输入迭代器 (LegacyInputIterator) 的要求。
| ||
-ForwardIt1, ForwardIt2 必须符合老式向前迭代器 (LegacyForwardIterator) 的要求。
| ||
-Compare 必须符合比较 (Compare) 的要求。
|
返回值
第一范围按字典序小于 第二个时返回 true,否则返回 false。
复杂度
给定 N1 为 std::distance(first1, last1),N2 为 std::distance(first2, last2):
异常
拥有名为 ExecutionPolicy
的模板形参的重载按下列方式报告错误:
- 如果作为算法一部分调用的函数的执行抛出异常,且
ExecutionPolicy
是标准策略之一,那么调用 std::terminate。对于任何其他ExecutionPolicy
,行为由实现定义。 - 如果算法无法分配内存,那么抛出 std::bad_alloc。
可能的实现
版本一 |
---|
template<class InputIt1, class InputIt2> bool lexicographical_compare(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2) { for (; (first1 != last1) && (first2 != last2); ++first1, (void) ++first2) { if (*first1 < *first2) return true; if (*first2 < *first1) return false; } return (first1 == last1) && (first2 != last2); } |
版本二 |
template<class InputIt1, class InputIt2, class Compare> bool lexicographical_compare(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, Compare comp) { for (; (first1 != last1) && (first2 != last2); ++first1, (void) ++first2) { if (comp(*first1, *first2)) return true; if (comp(*first2, *first1)) return false; } return (first1 == last1) && (first2 != last2); } |
示例
#include <algorithm> #include <iostream> #include <random> #include <vector> void print(std::vector<char> const& v, auto suffix) { for (char c : v) std::cout << c << ' '; std::cout << suffix; } int main() { std::vector<char> v1{'a', 'b', 'c', 'd'}; std::vector<char> v2{'a', 'b', 'c', 'd'}; for (std::mt19937 g{std::random_device{}()}; !std::lexicographical_compare(v1.begin(), v1.end(), v2.begin(), v2.end());) { print(v1, ">= "); print(v2, '\n'); std::shuffle(v1.begin(), v1.end(), g); std::shuffle(v2.begin(), v2.end(), g); } print(v1, "< "); print(v2, '\n'); }
可能的输出:
a b c d >= a b c d d a b c >= c b d a b d a c >= a d c b a c d b < c d a b
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 142 | C++98 | 最多只能进行 min(N1,N2) 次比较,但实际上无法实现(需要两次比较才能确定相等) | 比较次数上限翻倍 |
LWG 1205 | C++98 | 涉及空范围的字典序比较的结果不明确 | 使之明确 |
参阅
确定两个元素集合是否是相同的 (函数模板) | |
用三路比较比较两个范围 (函数模板) | |
当一个范围按字典顺序小于另一个范围时,返回 true (niebloid) |