10 Haziran 2019 Pazartesi

std::string Karşılaştırma

C Tarzı String Karşılaştırma
C tarzı kodlamaya alışkın bazı kişiler strcmp() metodunu kullanarak şöyle yapıyor. Bunu yapmamak lazım!
if (strcmp(str1.c_str(), str2.c_str()) == 0) {...}
strcmp karakter karakter karşılaştırma yapar. Locale kullanan strcoll() metodunu da kullanmamak lazım. Bunların yerine std::string sınıfının compare() metodunu kullanmak gerekir.

compare metodu
Eksi bir sayı, 0 veya artı bir sayı döner. Eşitliği kontrol etmek için şöyle yaparız.
if (str1.compare (str2)) == 0) {...}
Eşitliği kontrol etmek için şöyle de yapabiliriz. Bu kodlar biraz tuhaf aslında. == non member function'ı kullanmak daha okunaklı
if (!str1.compare (str2)) {
    // 'str1' and 'str2' are equal.
}
Büyük olduğunu kontrol etmek için şöyle yaparız.
if (str1.compare (str2) > 0)
 == (Eşitlik) metodu - char* + string Non-member function
Metodun içi şöyle. Sol tarafta char*, sağ tarafta std::string var.
/**
  *  @brief  Test equivalence of C string and string.
  *  @param __lhs  C string.
  *  @param __rhs  String.
  *  @return  True if @a __rhs.compare(@a __lhs) == 0.  False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc>
inline bool
operator==(const _CharT* __lhs,
           const basic_string<_CharT, _Traits, _Alloc>& __rhs)
{ return __rhs.compare (__lhs) == 0; }
Şöyle yaparız. char * nesnesinin karşılaştırmanın solunda veya sağında olması fark yaratmaz.
std::string smth = "hello";
char ch[8] = "hello";
if (ch == smth)
    cout << "yes!";
else
    cout << " no ";
Çıktı olarak yes alırız.

 == (Eşitlik) metodu - string + char*  Non-member function
Metodun içi şöyle. Sol tarafta std::string, sağ tarafta char* var.
/**
 *  @brief  Test equivalence of string and C string.
 *  @param __lhs  String.
 *  @param __rhs  C string.
 *  @return  True if @a __lhs.compare(@a __rhs) == 0.  False otherwise.
*/
template<typename _CharT, typename _Traits, typename _Alloc>
inline bool
operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
           const _CharT* __rhs)
{ return __lhs.compare(__rhs) == 0; }
Örnek
Şöyle yaparız.
bool foo(const std::string& s) {
  return s == "hello"; // comparing against a const char* literal
}
== (Eşitlik) metodu - string + string Non-member function
Şöyle yaparız.
if (str1 == str2) {...}
Açıklaması şöyle
Returns: lhs.compare(rhs) == 0.
String sınıfında hem == operatörü hem de compare() metodu var. Aslında == operatoru de allta compare metodunu çağırıyor.
template<class _Elem,
    class _Traits,
    class _Alloc> inline
    bool __cdecl operator==(
            const basic_string<_Elem, _Traits, _Alloc>& _Left,
            const basic_string<_Elem, _Traits, _Alloc>& _Right)
    {
      return (_Left.compare(_Right) == 0);
    }
Örnek
Şöyle yaparız.
bool bar(const std::string& s) {
  return s == "hello"s; // comparing against a std::string literal
}
< metodu - Non-member function
Metodun imzası şöyle
template<class charT, class Traits, class Alloc>
bool operator<(std::basic_string<charT, Traits, Alloc> const& lhs,
               std::basic_string<charT, Traits, Alloc> const& rhs);
Sıralı tutulan veri yapılarında kullanılabilir. Şöyle yaparız.
return (str1 < str2);
> metodu - Non-member function
Şöyle yaparız.
if (str1 > str2) {...}

Hiç yorum yok:

Yorum Gönder