當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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 ()。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。