Compares two character sequences.
[pos1, pos1+count1)
substring of this string to str. If count1 > size() - pos1
the substring is [pos1, size())
.[pos1, pos1+count1)
substring of this string to a substring [pos2, pos2+count2)
of str. If count1 > size() - pos1
the first substring is [pos1, size())
. Likewise, count2 > str.size() - pos2
the second substring is [pos2, str.size())
.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)
If count1 > size() - pos1
the substring is [pos1, size())
.[pos1, pos1+count1)
substring of this string to the characters in the range [s, s + count2)
. If count1 > size() - pos1
the substring is [pos1, size())
. (Note: the characters in the range [s, s + count2)
may include null characters.)t
to a string view sv
as if by std::basic_string_view<CharT, Traits> sv = t;
, then compares this string to sv
. This overload only participates in overload resolution if std::is_convertible_v<const T&, std::basic_string_view<CharT, Traits>>
is true
and std::is_convertible_v<const T&, const CharT*>
is false
.t
to a string view sv
as if by std::basic_string_view<CharT, Traits> sv = t;
, then compares a [pos1, pos1+count1)
substring of this string to sv
, as if by std::basic_string_view<CharT, Traits>(*this).substr(pos1, count1).compare(sv)
. This overload only participates in overload resolution if std::is_convertible_v<const T&, std::basic_string_view<CharT, Traits>>
is true
and std::is_convertible_v<const T&, const CharT*>
is false
.t
to a string view sv
as if by std::basic_string_view<CharT, Traits> sv = t;
, then compares a [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))
. This overload only participates in overload resolution if std::is_convertible_v<const T&, std::basic_string_view<CharT, Traits>>
is true
and std::is_convertible_v<const T&, 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. First, calculate the number of characters to compare, as if by size_type rlen = std::min(count1, count2)
. Then compare the sequences by calling 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 |
negative value if *this
appears before the character sequence specified by the arguments, in lexicographical order.
zero if both character sequences compare equivalent.
positive value if *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>>)
basic_string_view
.The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 2946 | C++17 | string_view overload causes ambiguity in some cases | avoided by making it a template |
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 <string> #include <iostream> int main() { // 1) Compare with other string { int compare_value{ std::string{"Batman"}.compare(std::string{"Superman"}) }; std::cout << ( compare_value < 0 ? "Batman comes before Superman\n" : compare_value > 0 ? "Superman comes before Batman\n" : "Superman and Batman are the same.\n" ); } // 2) Compare substring with other string { int compare_value{ std::string{"Batman"}.compare(3, 3, std::string{"Superman"}) }; std::cout << ( compare_value < 0 ? "man comes before Superman\n" : compare_value > 0 ? "Superman comes before man\n" : "man and Superman are the same.\n" ); } // 3) Compare substring with other substring { std::string a{"Batman"}; std::string b{"Superman"}; int compare_value{a.compare(3, 3, b, 5, 3)}; std::cout << ( compare_value < 0 ? "man comes before man\n" : compare_value > 0 ? "man comes before man\n" : "man and man are the same.\n" ); // Compare substring with other substring // defaulting to end of other string assert(compare_value == a.compare(3, 3, b, 5)); } // 4) Compare with char pointer { int compare_value{std::string{"Batman"}.compare("Superman")}; std::cout << ( compare_value < 0 ? "Batman comes before Superman\n" : compare_value > 0 ? "Superman comes before Batman\n" : "Superman and Batman are the same.\n" ); } // 5) Compare substring with char pointer { int compare_value{std::string{"Batman"}.compare(3, 3, "Superman")}; std::cout << ( compare_value < 0 ? "man comes before Superman\n" : compare_value > 0 ? "Superman comes before man\n" : "man and Superman are the same.\n" ); } // 6) Compare substring with char pointer substring { int compare_value{std::string{"Batman"}.compare(0, 3, "Superman", 5)}; std::cout << ( compare_value < 0 ? "Bat comes before Super\n" : compare_value > 0 ? "Super comes before Bat\n" : "Super and Bat are the same.\n" ); } }
Output:
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) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
http://en.cppreference.com/w/cpp/string/basic_string/compare