std::basic_string<CharT,Traits,Allocator>::compare - cppreference.com (original) (raw)

int compare( const basic_string& str ) const; (1) (noexcept since C++11) (constexpr since C++20)
int compare( size_type pos1, size_type count1, const basic_string& str ) const; (2) (constexpr since C++20)
(3)
int compare( size_type pos1, size_type count1, const basic_string& str, size_type pos2, size_type count2 ) const; (until C++14)
int compare( size_type pos1, size_type count1, const basic_string& str, size_type pos2, size_type count2 = npos ) const; (since C++14) (constexpr since C++20)
int compare( const CharT* s ) const; (4) (constexpr since C++20)
int compare( size_type pos1, size_type count1, const CharT* s ) const; (5) (constexpr since C++20)
int compare( size_type pos1, size_type count1, const CharT* s, size_type count2 ) const; (6) (constexpr since C++20)
template< class StringViewLike > int compare( const StringViewLike& t ) const noexcept(/* see below */); (7) (since C++17) (constexpr since C++20)
template< class StringViewLike > int compare( size_type pos1, size_type count1, const StringViewLike& t ) const; (8) (since C++17) (constexpr since C++20)
template< class StringViewLike > int compare( size_type pos1, size_type count1, const StringViewLike& t, size_type pos2, size_type count2 = npos) const; (9) (since C++17) (constexpr since C++20)

Compares two character sequences.

  1. Compares this string to str.

  2. Compares a [pos1, pos1 + count1) substring of this string to str.

  1. Compares a [pos1, pos1 + count1) substring of this string to a substring [pos2, pos2 + count2) of str.
  1. Compares this string to the null-terminated character sequence beginning at the character pointed to by s with length Traits::length(s).

  2. Compares a [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).

  1. Compares a [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.

7-9) Implicitly converts t to a string view sv as if by std::basic_string_view<CharT, Traits> sv = t;, then

  1. compares this string to sv;

  2. 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);

  3. 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)).

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:

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

Contents

[edit] Parameters

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

[edit] Return value

[edit] Exceptions

The overloads taking parameters named pos1 or pos2 throws std::out_of_range if the argument is out of range.

If an exception is thrown for any reason, this function has no effect (strong exception safety guarantee).

[edit] Possible implementation

overload (1)
template<class CharT, class Traits, class Alloc> int std::basic_string<CharT, Traits, Alloc>::compare (const std::basic_string& s) const noexcept { size_type lhs_sz = size(); size_type rhs_sz = s.size(); int result = traits_type::compare(data(), s.data(), std::min(lhs_sz, rhs_sz)); if (result != 0) return result; if (lhs_sz < rhs_sz) return -1; if (lhs_sz > rhs_sz) return 1; return 0; }

[edit] Notes

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.

[edit] Example

#include #include #include #include #include   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", "Super", compare_result); }

Output:

  1. "Batman" comes before "Superman".
  2. "Superman" comes before "man".
  3. "man" and "man" are the same.
  4. "Batman" comes before "Superman".
  5. "Superman" comes before "man".
  6. "Bat" comes before "Super".

[edit] Defect reports

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 accidentallydropped by the resolution of LWG2946 restored

[edit] See also

operator==operator!=operatoroperator<=operator>=operator<=>(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) [edit]
substr returns a substring (public member function) [edit]
collate defines lexicographical comparison and hashing of strings (class template) [edit]
strcoll compares two strings in accordance to the current locale (function) [edit]
lexicographical_compare returns true if one range is lexicographically less than another (function template) [edit]
compare compares two views (public member function of std::basic_string_view<CharT,Traits>) [edit]