Compares two character sequences.
str
.[
pos1
,
pos1 + count1
)
substring of this string to str
. count1 > size() - pos1
, the substring is [
pos1
,
size()
)
.[
pos1
,
pos1 + count1
)
substring of this string to a substring [
pos2
,
pos2 + count2
)
of str
. count1 > size() - pos1
, the first substring is [
pos1
,
size()
)
. count2 > str.size() - pos2
, the second substring is [
pos2
,
str.size()
)
.s
with length Traits::length(s)
.[
pos1
,
pos1 + count1
)
substring of this string to the null-terminated character sequence beginning at the character pointed to by s
with length Traits::length(s)
. count1 > size() - pos1
, the substring is [
pos1
,
size()
)
.[
pos1
,
pos1 + count1
)
substring of this string to the characters in the range [
s
,
s + count2
)
. The characters in [
s
,
s + count2
)
may include null characters. count1 > size() - pos1
, the substring is [
pos1
,
size()
)
.t
to a string view sv
as if by std::basic_string_view<CharT, Traits> sv = t;
, then sv
;[
pos1
,
pos1 + count1
)
substring of this string to sv
, as if by std::basic_string_view<CharT, Traits>(*this).substr(pos1, count1).compare(sv)
;[
pos1
,
pos1 + count1
)
substring of this string to a substring [
pos2
,
pos2 + count2
)
of sv
, as if by std::basic_string_view<CharT, Traits>(*this)
.substr(pos1, count1).compare(sv.substr(pos2, count2))
.std::is_convertible_v<const StringViewLike&,
std::basic_string_view<CharT, Traits>>
is true
and std::is_convertible_v<const StringViewLike&, const CharT*>
is false
.A character sequence consisting of count1
characters starting at data1
is compared to a character sequence consisting of count2
characters starting at data2
as follows:
size_type rlen = std::min(count1, count2)
. Traits::compare(data1, data2, rlen)
. For standard strings this function performs character-by-character lexicographical comparison. If the result is zero (the character sequences are equal so far), then their sizes are compared as follows: Condition | Result | Return value | |
---|---|---|---|
Traits::compare(data1, data2, rlen) < 0 | data1 is less than data2 |
<0 |
|
Traits::compare(data1, data2, rlen) == 0 | size1 < size2 | data1 is less than data2 |
<0 |
size1 == size2 | data1 is equal to data2 |
0 |
|
size1 > size2 | data1 is greater than data2 |
>0 |
|
Traits::compare(data1, data2, rlen) > 0 | data1 is greater than data2 |
>0 |
str | - | other string to compare to |
s | - | pointer to the character string to compare to |
count1 | - | number of characters of this string to compare |
pos1 | - | position of the first character in this string to compare |
count2 | - | number of characters of the given string to compare |
pos2 | - | position of the first character of the given string to compare |
t | - | object (convertible to std::basic_string_view ) to compare to |
*this
appears before the character sequence specified by the arguments, in lexicographical order. *this
appears after the character sequence specified by the arguments, in lexicographical order. The overloads taking parameters named pos1
or pos2
throws std::out_of_range
if the argument is out of range.
noexcept
specification: noexcept(std::is_nothrow_convertible_v<const T&, std::basic_string_view<CharT, Traits>>)
std::basic_string_view
.If an exception is thrown for any reason, this function has no effect (strong exception safety guarantee).
For the situations when three-way comparison is not required, std::basic_string
provides the usual relational operators (<
, <=
, ==
, >
, etc).
By default (with the default std::char_traits
), this function is not locale-sensitive. See std::collate::compare
for locale-aware three-way string comparison.
#include <cassert> #include <iomanip> #include <iostream> #include <string> #include <string_view> void print_compare_result(std::string_view str1, std::string_view str2, int compare_result) { if (compare_result < 0) std::cout << std::quoted(str1) << " comes before " << std::quoted(str2) << ".\n"; else if (compare_result > 0) std::cout << std::quoted(str2) << " comes before " << std::quoted(str1) << ".\n"; else std::cout << std::quoted(str1) << " and " << std::quoted(str2) << " are the same.\n"; } int main() { std::string batman{"Batman"}; std::string superman{"Superman"}; int compare_result{0}; // 1) Compare with other string compare_result = batman.compare(superman); std::cout << "1) "; print_compare_result("Batman", "Superman", compare_result); // 2) Compare substring with other string compare_result = batman.compare(3, 3, superman); std::cout << "2) "; print_compare_result("man", "Superman", compare_result); // 3) Compare substring with other substring compare_result = batman.compare(3, 3, superman, 5, 3); std::cout << "3) "; print_compare_result("man", "man", compare_result); // Compare substring with other substring // defaulting to end of other string assert(compare_result == batman.compare(3, 3, superman, 5)); // 4) Compare with char pointer compare_result = batman.compare("Superman"); std::cout << "4) "; print_compare_result("Batman", "Superman", compare_result); // 5) Compare substring with char pointer compare_result = batman.compare(3, 3, "Superman"); std::cout << "5) "; print_compare_result("man", "Superman", compare_result); // 6) Compare substring with char pointer substring compare_result = batman.compare(0, 3, "Superman", 5); std::cout << "6) "; print_compare_result("Bat", "Superman", compare_result); }
Output:
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 5 | C++98 | the parameter count2 of overload (6)had a default argument npos | default argument removed, split to overloads (5) and (6) |
LWG 847 | C++98 | there was no exception safety guarantee | added strong exception safety guarantee |
LWG 2946 | C++17 | overload (7) caused ambiguity in some cases | avoided by making it a template |
P1148R0 | C++17 | noexcept for overload (7) was accidently dropped by the resolution of LWG2946 | restored |
(removed in C++20)(removed in C++20)(removed in C++20)(removed in C++20)(removed in C++20)(C++20) | lexicographically compares two strings (function template) |
returns a substring (public member function) |
|
defines lexicographical comparison and hashing of strings (class template) |
|
compares two strings in accordance to the current locale (function) |
|
returns true if one range is lexicographically less than another (function template) |
|
(C++17) | compares two views (public member function of std::basic_string_view<CharT,Traits> ) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/string/basic_string/compare