当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


C++ Algorithm lexicographical_compare()用法及代码示例


C++算法lexicographical_compare()函数用于检查第一个范围[first1,last1)在字典序上是否小于第二个范围[first2,last2)。

第一个版本使用 operator< 比较元素,第二个版本使用给定的二进制比较函数 comp 比较元素。

字典比较是一种具有以下特性的操作:

  • 比较是在两个范围内逐个元素进行的。
  • 第一个不匹配的元素定义哪个范围在字典上大于或小于另一个。
  • 如果一个范围是另一个范围的前缀,则较短的范围在字典序上比另一个范围小。
  • 如果两个范围包含等效元素且长度相同,则范围在字典序上相等。
  • 空范围按字典顺序小于任何其他非空范围。
  • 两个空范围在字典上是相等的。

用法

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:一个输入迭代器,指向要比较的第二个范围中最后一个元素之后的位置。

comp: 一个用户定义的二元谓词函数,它接受两个参数,如果两个参数按顺序返回真,否则返回假。它遵循严格的弱排序来对元素进行排序。

返回值

如果第一个范围按字典顺序小于第二个范围,则返回 true,否则返回 false。

复杂度

复杂性是线性的,最多对 comp 执行 2*min (count1, count2) 次比较。其中 count1 = last1- first1 和 count2 = last2 - first2。

异常

如果元素比较或迭代器抛出异常,则此函数将抛出异常。

请注意,无效参数会导致未定义的行为。

例子1

让我们看一个简单的例子来演示 lexicographical_compare() 的使用:

#include <iostream>     // std::cout, std::boolalpha
#include <algorithm>    // std::lexicographical_compare
#include <cctype>       // std::tolower
using namespace std;
// a case-insensitive comparison function:
bool mycomp (char c1, char c2)
{ return tolower(c1)<tolower(c2); }

int main () {
  char foo[]="Apple";
  char bar[]="apartment";

  cout << boolalpha;

  cout << "Comparing foo and bar lexicographically (foo<bar):\n";

  cout << "Using default comparison (operator<):";
  cout << lexicographical_compare(foo,foo+5,bar,bar+9);
  cout << '\n';

  cout << "Using mycomp as comparison object:";
  cout << lexicographical_compare(foo,foo+5,bar,bar+9,mycomp);
  cout << '\n';

  return 0;
}

输出:

Comparing foo and bar lexicographically (foo

例子2

让我们看另一个简单的例子:

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

using namespace std;

int main(void) {
   vector<string> v1 = {"One", "Two", "Three"};
   vector<string> v2 = {"one", "two", "three"};
   bool result;

   result = lexicographical_compare(v1.begin(), v1.end(), v2.begin(), v2.end());

   if (result == true)
      cout << "v1 is less than v2." << endl;

   v1[0] = "two";

   result = lexicographical_compare(v1.begin(), v1.end(), v2.begin(), v2.end());

   if (result == false)
      cout << "v1 is not less than v2." << endl;

   return 0;
}

输出:

v1 is less than v2.
v1 is not less than v2.

例子3

让我们看另一个简单的例子:

#include <algorithm>
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>

using namespace std;

int main()
{
    vector<char> v1 {'a', 'b', 'c', 'd'};
    vector<char> v2 {'a', 'b', 'c', 'd'};
 
    srand(time(0));
    while (!lexicographical_compare(v1.begin(), v1.end(),
                                         v2.begin(), v2.end())) {
        for (auto c:v1) cout << c << ' ';
        cout << ">= ";
        for (auto c:v2) cout << c << ' ';
        cout << '\n';
 
        random_shuffle(v1.begin(), v1.end());
        random_shuffle(v2.begin(), v2.end());
    }
 
    for (auto c:v1) cout << c << ' ';
    cout << "< ";
    for (auto c:v2) cout << c << ' ';
    cout << '\n';
    
    return 0;
}

输出:

a b c d >= a b c d 
d b c a >= d a c b 
a c b d >= a c b d 
c d a b >= b c d a 
d a c b >= c a b d 
a b c d < b d a c

示例 4

让我们看一个简单的例子:

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

template <class X, class Y>
void compare_test(const X& x, const Y& y)
{
  if (lexicographical_compare(x.begin(), x.end(), y.begin(), y.end())) {
    cout << "x less than y" << endl;
  }
  else {
    cout << "x not less than y" << endl;
  }

  if (lexicographical_compare(x.begin(), x.end(),
                                   y.begin(), y.end(), greater<char>())) {
    cout << "x less than y" << endl;
  }
  else {
    cout << "x not less than y" << endl;
  }
}

int main()
{
  {
    string x = "heilo";
    string y = "hello";

    cout << "same length string compare:" << endl;
    compare_test(x, y);
  }
  cout << endl;

  {
    string x = "hell";
    string y = "hello";

    cout << "not same length string compare:" << endl;
    compare_test(x, y);
  }
  
  return 0;
}

输出:

same length string compare:
x less than y
x not less than y

not same length string compare:
x less than y
x less than y





相关用法


注:本文由纯净天空筛选整理自 C++ Algorithm lexicographical_compare ()。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。