std::
lexicographical_compare
函数模板 <algorithm>
default (1) |
template <class InputIterator1, class InputIterator2>
bool lexicographical_compare (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2); |
custom (2) |
template <class InputIterator1, class InputIterator2, class Compare>
bool lexicographical_compare (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2,
Compare comp); |
字典序小于比较
如果范围[first1,last1)在字典顺序上比范围[first2,last2)小,则返回true。
字典比较是一种比较方式,通常用于在字典中按字母顺序对单词进行排序;
它涉及到顺序地比较两个范围中位置相同的元素,直到其中一个元素与另一个元素不相等。
比较第一个不匹配元素的结果是字典序比较的结果。
如果两个序列比较相等,直到其中一个结束,则较短的序列在字典序上小于较长的序列。
第一个版本使用operator<比较元素,第二个版本使用comp操作符比较元素。
if (!(a<b) && !(b<a))或if (!comp(a,b) && !comp(b,a)),
两个元素a和b被认为是等价的。
这个函数模板的行为相当于:
template <class InputIterator1, class InputIterator2>
bool lexicographical_compare (InputIterator1 first1, InputIterator1 last1,
InputIterator2 first2, InputIterator2 last2)
{
while (first1!=last1)
{
if (first2==last2 || *first2<*first1) return false;
else if (*first1<*first2) return true;
++first1; ++first2;
}
return (first2!=last2);
} |
☲ 参数
-
first1, last1
-
指向第一个序列的初始和最终位置的输入迭代器。使用的范围是[first1,last1),
它包含first1和last1之间的所有元素,包括first1所指的元素,
但不包括last1所指的元素。
-
first2, last2
-
指向第二个序列的初始和最终位置的输入迭代器。使用的范围是[first2,last2)
-
comp
-
接受迭代器所指向类型的元素作为参数,并返回可转换为bool类型的值的二元函数。
返回的值表明在它定义的特定严格弱排序中,第一个参数是否被认为在第二个参数之前。
函数不能修改它的任何参数。
它可以是一个函数指针,也可以是一个函数对象。
☉ 返回值
如果第一个范围按字典序比第二个范围小,则为True。
否则为False(包括当两个范围的所有元素都相等时)。
☣ 示例
// lexicographical_compare example
#include <iostream> // std::cout, std::boolalpha
#include <algorithm> // std::lexicographical_compare
#include <cctype> // std::tolower
// a case-insensitive comparison function:
bool mycomp (char c1, char c2)
{ return std::tolower(c1)<std::tolower(c2); }
int main () {
char foo[]="Apple";
char bar[]="apartment";
std::cout << std::boolalpha;
std::cout << "Comparing foo and bar lexicographically (foo<bar):\n";
std::cout << "Using default comparison (operator<): ";
std::cout << std::lexicographical_compare(foo,foo+5,bar,bar+9);
std::cout << '\n';
std::cout << "Using mycomp as comparison object: ";
std::cout << std::lexicographical_compare(foo,foo+5,bar,bar+9,mycomp);
std::cout << '\n';
return 0;
} |
默认比较纯ASCII字符码,其中'A'(65)比较小于'A'(97)。
我们的mycomp函数在比较字母之前将它们转换成小写字母,
所以这里第一个不匹配的字母是第三个('a' vs 'p')。
输出:
Comparing foo and bar lexicographically (foo<bar):
Using default comparison (operator<): true
Using mycomp as comparison object: false
✥ 复杂度
最多执行2*min(count1,count2)比较或comp的应用程序(countX是firstX和lastX之间的距离)。
⇄ 数据竞争
范围[first1,last1)和[first2,last2)中的对象被访问。
☂ 异常安全性
如果元素比较或迭代器操作抛出,则抛出。
注意,无效的参数会导致未定义的行为。
🍄 另请参阅
mismatch |
返回两个范围不匹配元素的第一个位置(函数模板) |
equal |
测试两个范围内的元素是否相等(函数模板) |
search |
搜索范围的子序列(函数模板) |
find_end |
求范围内的最后一个子序列(函数模板) |
includes |
测试已排序范围是否包含另一个已排序范围(函数模板) |