Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
std::basic_string::compare(3) C++ Standard Libarystd::basic_string::compare(3)

NAME
       std::basic_string::compare - std::basic_string::compare

Synopsis
							     (noexcept since
	  int compare( const basic_string& str ) const;	 (1) C++11)
							     (constexpr	since
							     C++20)
	  int compare( size_type pos1, size_type count1, (2) (constexpr	since
		       const basic_string& str ) const;	     C++20)
	  int compare( size_type pos1, size_type count1,

		       const		     basic_string&		  str,
       (until C++14)

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

	  int	  compare(     size_type     pos1,	size_type      count1,
       (since C++17)
		       const	  StringViewLike&      t,		   (9)
       (constexpr since
									      C++20)
		       size_type pos2, size_type count2
	  = npos) const;

	  Compares two character sequences.

	  1) Compares this string to str.
	  2) Compares a	[pos1, pos1 + count1) substring	of this	string to str.
	    * If count1	> size() - pos1, the substring is [pos1, size()).
	  3) Compares a	[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()).
	    * If count2	> str.size() - pos2, the second	 substring  is	[pos2,
       str.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	[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()).
	  6) 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 in-
       clude null
	  characters.
	    * If count1	> size() - pos1, the substring is [pos1, size()).
	  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 [pos1,	pos1 + 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  [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)).
	  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)	< 0		 data1 is less
       than <0
							       data2
						 size1 < size2 data1  is  less
       than <0
							       data2
	  Traits::compare(data1,  data2, rlen) == size1	==	data1 is equal
       to  0
	  0					 size2	       data2
						 size1	>   size2   data1   is
       greater	 >0
							       than data2
	  Traits::compare(data1,   data2,  rlen)  >  0		     data1  is
       greater	 >0
							       than data2

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 com-
       pare
	  t	 - object (convertible to std::basic_string_view)  to  compare
       to

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.

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::ba-
       sic_string_view<CharT,
	  Traits>>)
	  8,9)	 Throws	  anything   thrown  by	 the  conversion  to  std::ba-
       sic_string_view.

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

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;
	  }

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.

Example
       // Run this code

	#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",	"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".

	  Defect reports

	  The following	behavior-changing defect reports were applied retroac-
       tively to
	  previously published C++ standards.

	     DR	   Applied to	    Behavior as	published	       Correct
       behavior
			      the parameter count2 of overload	 default argu-
       ment removed,
	  LWG  5     C++98	 (6)				     split  to
       overloads (5) and
			      had a default argument npos	 (6)
	  LWG  847  C++98      there was no exception safety	  added	strong
       exception safety
			      guarantee				 guarantee
	  LWG 2946 C++17      overload (7) caused ambiguity  in	   avoided  by
       making it a
			      some cases			 template
			      noexcept for overload (7)	was
	  P1148R0  C++17      accidentally			 restored
			      dropped by the resolution	of
			      LWG2946

See also
	  operator==
	  operator!=
	  operator<
	  operator>
	  operator<=
	  operator>=		  lexicographically compares two strings
	  operator<=>		  (function template)
	  (removed in C++20)
	  (removed in C++20)
	  (removed in C++20)
	  (removed in C++20)
	  (removed in C++20)
	  (C++20)
	  substr		  returns a substring
				  (public member function)
	  collate		  defines lexicographical comparison and hash-
       ing of strings
				  (class template)
	  strcoll		   compares  two  strings in accordance	to the
       current locale
				  (function)
				  returns true if one range  is	 lexicographi-
       cally less than
	  lexicographical_compare another
				  (function template)
				  compares two views
	  compare		  (public member function of
				  std::basic_string_view<CharT,Traits>)

Category:
	    * conditionally noexcept

http://cppreference.com		  2024.06.10	 std::basic_string::compare(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::u32string::compare&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help