Home C&C++函数库 c++ 语法 程序源码 Linux C库

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 测试已排序范围是否包含另一个已排序范围(函数模板)

联系我们 免责声明 关于CandCplus 网站地图