public static member function
<string>

std::char_traits::compare

static int compare (const char_type* p, const char_type* q, size_t n);
比较字符序列
比较由p指向的n个字符的序列与由q指向的n个字符的序列。

该函数执行字典序比较,其中如果成员eq返回,则认为两个字符相等true,如果成员lt返回,则认为一个字符小于另一个字符true.

对于所有字符特征类型,其行为应类似于定义为
1
2
3
4
static int compare (const char_type* p, const char_type* q, size_t n) {
  while (n--) {if (!eq(*p,*q)) return lt(*p,*q)?-1:1; ++p; ++q;}
  return 0;
}
尽管具体签名可能有所不同。

参数

p, q
指向每个具有字符序列的数组的指针。
请注意,该函数将认为两个序列的长度均为n个字符,而不管其中任何一个是否包含空字符。
成员类型char_type字符类型(即,char_traits 中的类模板参数)。
n
要比较的字符序列的长度(以字符为单位)。
size_t 是一个无符号整数类型。

返回值

返回一个有符号整数,指示序列之间的关系
relation
0所有字符的比较结果相等
<0第一个比较结果不相等的字符在p中较小。
>0第一个比较结果不相等的字符在p中较大。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// char_traits::compare
#include <iostream>   // std::cout
#include <string>     // std::basic_string, std::char_traits
#include <cctype>     // std::tolower
#include <cstddef>    // std::size_t

// case-insensitive traits:
struct custom_traits: std::char_traits<char> {
  static bool eq (char c, char d) { return std::tolower(c)==std::tolower(d); }
  static bool lt (char c, char d) { return std::tolower(c)<std::tolower(d); }
  static int compare (const char* p, const char* q, std::size_t n) {
    while (n--) {if (!eq(*p,*q)) return lt(*p,*q)?-1:1; ++p; ++q;}
    return 0;
  }
};

int main ()
{
  std::basic_string<char,custom_traits> foo,bar;
  foo = "Test";
  bar = "test";
  if (foo==bar) std::cout << "foo and bar are equal\n";
  return 0;
}

输出
foo and bar are equal


复杂度

直到n的线性时间。

异常安全

除非pq未指向足够长的数组,否则此成员函数在任何标准专门化中都不会引发异常(无throw保证)。
否则,将导致未定义行为

另见