Namespaces
Variants
Actions

std::basic_string<CharT,Traits,Allocator>::compare

From cppreference.com
< cpp‎ | string‎ | basic string
 
 
 
std::basic_string
 
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 )constnoexcept(/* 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 [pos1pos1 + count1) substring of this string to str.
  • If count1 > size()- pos1, the substring is [pos1size()).
3) Compares a [pos1pos1 + count1) substring of this string to a substring [pos2pos2 + count2) of str.
  • If count1 > size()- pos1, the first substring is [pos1size()).
  • If count2 > str.size()- pos2, the second substring is [pos2str.size()).
4) Compares this string to the null-terminated character sequence beginning at the character pointed to by s with length Traits::length(s).
5) Compares a [pos1pos1 + 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 [pos1size()).
6) Compares a [pos1pos1 + count1) substring of this string to the characters in the range [ss + count2). The characters in [ss + count2) may include null characters.
  • If count1 > size()- pos1, the substring is [pos1size()).
7-9) Implicitly converts t to a string view sv as if by std::basic_string_view<CharT, Traits> sv = t;, then
7) compares this string to sv;
8) compares a [pos1pos1 + count1) substring of this string to sv, as if by std::basic_string_view<CharT, Traits>(*this).substr(pos1, count1).compare(sv);
9) compares a [pos1pos1 + count1) substring of this string to a substring [pos2pos2 + count2) of sv, as if by std::basic_string_view<CharT, Traits>(*this)
    .substr(pos1, count1).compare(sv.substr(pos2, count2))
.
These overloads participate in overload resolution only if 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:

  • 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) < 0data1 is less than data2<0
Traits::compare(data1, data2, rlen) == 0size1 < size2data1 is less than data2<0
size1 == size2data1 is equal to data20
size1 > size2data1 is greater than data2>0
Traits::compare(data1, data2, rlen) > 0data1 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

  • 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.

[edit]Exceptions

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

7)
noexcept specification:  
noexcept(std::is_nothrow_convertible_v<const T&, std::basic_string_view<CharT, Traits>>)
8,9) Throws anything thrown by the conversion to std::basic_string_view.

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>intstd::basic_string<CharT, Traits, Alloc>::compare(conststd::basic_string& s)constnoexcept{ 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)return1;return0;}

[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 <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";elseif(compare_result >0)std::cout<<std::quoted(str2)<<" comes before "<<std::quoted(str1)<<".\n";elsestd::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 stringassert(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 5C++98 the parameter count2 of overload (6)
had a default argument npos
default argument removed,
split to overloads (5) and (6)
LWG 847C++98 there was no exception safety guarantee added strong exception safety guarantee
LWG 2946C++17 overload (7) caused ambiguity in some cases avoided by making it a template
P1148R0C++17 noexcept for overload (7) was accidentally
dropped by the resolution of LWG2946
restored

[edit]See also

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