public static member function
<string>
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;
}
|
输出
异常安全
除非p或q未指向足够长的数组,否则此成员函数在任何标准专门化中都不会引发异常(无throw保证)。
否则,将导致未定义行为。