名前空間
変種
操作

std::basic_string::compare

提供: cppreference.com
< cpp‎ | string‎ | basic string
 
 
 
std::basic_string
 
int compare( const basic_string& str ) const;
(1)
int compare( size_type pos1, size_type count1,
             const basic_string& str ) const;
(2)
(3)
int compare( size_type pos1, size_type count1,

             const basic_string& str,

             size_type pos2, size_type count2 ) const;
(C++14以前)
int compare( size_type pos1, size_type count1,

             const basic_string& str,

             size_type pos2, size_type count2 = npos ) const;
(C++14およびそれ以降)
int compare( const CharT* s ) const;
(4)
int compare( size_type pos1, size_type count1,
             const CharT* s ) const;
(5)
int compare( size_type pos1, size_type count1,
             const CharT* s, size_type count2 ) const;
(6)
template < class T >
int compare( const T& t ) const;
(7) (C++17およびそれ以降)
template < class T >

int compare( size_type pos1, size_type count1,

             const T& t ) const;
(8) (C++17およびそれ以降)
template < class T >

int compare( size_type pos1, size_type count1,
             const T& t,

             size_type pos2, size_type count2 = npos) const;
(9) (C++17およびそれ以降)

2つの文字シーケンスを比較します。

1) この文字列を str と比較します。 まず、 size_type rlen = std::min(size(), str.size()) によって行われたかのように、比較する文字数が計算されます。 その後、 Traits::compare(data(), str.data(), rlen) を呼ぶことによって比較を行います。 標準の文字列の場合、この関数は文字単位の辞書的な比較を行います。 結果がゼロ (ここまでのところ文字列は等しい) の場合、サイズが以下のように比較されます。
条件 結果 戻り値
Traits::compare(data, arg, rlen) < 0 dataarg より小さい <0
Traits::compare(data, arg, rlen) == 0 size(data) < size(arg) dataarg より小さい <0
size(data) == size(arg) dataarg等しい 0
size(data) > size(arg) dataarg より大きい >0
Traits::compare(data, arg, rlen) > 0 dataarg より大きい >0
2) basic_string(*this, pos1, count1).compare(str) (C++17以前)compare(pos1, count1, std::basic_string_view<CharT, Traits>(str)) (C++17およびそれ以降) によって行われたかのように、この文字列の [pos1, pos1+count1) の部分文字列を str と比較します。
3) basic_string(*this, pos1, count1).compare(basic_string(str, pos2, count2)) (C++17以前)compare(pos1, count1, std::basic_string_view<CharT, Traits>(str), pos2, count2) (C++17およびそれ以降) によって行われたかのように、この文字列の [pos1, pos1+count1) の部分文字列を str の部分文字列 [pos2, pos2+count2) と比較します。
4) compare(basic_string(s)) によって行われたかのように、この文字列を s の指す文字から始まるNULL終端文字シーケンスと比較します。
5) basic_string(*this, pos, count1).compare(basic_string(s)) によって行われたかのように、この文字列の [pos1, pos1+count1) の部分文字列を s の指す文字から始まるNULL終端文字シーケンスと比較します。
6) basic_string(*this, pos, count1).compare(basic_string(s, count2)) によって行われたかのように、この文字列の [pos1, pos1+count1) の部分文字列を s の指す文字を先頭に持つ文字配列の最初の count2 個の文字と比較します。 (ノート: s から s+count2 の文字にはNULL文字を含めることができます)
7) std::basic_string_view<CharT, Traits> sv = t; によって行われたかのように、 t を文字列ビュー sv に暗黙に変換し、 この文字列を sv と比較します。 (1) と同様ですが、 str.size() および str.data() の代わりに sv.size() および sv.data() を使用します。 このオーバーロードは、std::is_convertible_v<const T&, std::basic_string_view<CharT, Traits>>true であり、 std::is_convertible_v<const T&, const CharT*>false である場合にのみ、オーバーロード解決に参加します。
8) std::basic_string_view<CharT, Traits> sv = t; によって行われたかのように、 t を文字列ビュー sv に暗黙に変換し、 std::basic_string_view<CharT, Traits>(data(), size()).substr(pos1, count1).compare(sv) によって行われたかのように、この文字列の [pos1, pos1+count1) の部分文字列を sv の文字列と比較します。 このオーバーロードは、std::is_convertible_v<const T&, std::basic_string_view<CharT, Traits>>true であり、 std::is_convertible_v<const T&, const CharT*>false である場合にのみ、オーバーロード解決に参加します。
9) std::basic_string_view<CharT, Traits> sv = t; によって行われたかのように、 t を文字列ビュー sv に暗黙に変換し、 std::basic_string_view<CharT, Traits>(data(), size()).substr(pos1, count1).compare(sv.substr(pos2, count2)) によって行われたかのように、この文字列の [pos1, pos1+count1) の部分文字列を sv の部分文字列 [pos2, pos2+count2) と比較します。 このオーバーロードは、std::is_convertible_v<const T&, std::basic_string_view<CharT, Traits>>true であり、 std::is_convertible_v<const T&, const CharT*>false である場合にのみ、オーバーロード解決に参加します。

目次

[編集] 引数

str - 比較する他の文字列
s - 比較する文字列を指すポインタ
count1 - 比較するこの文字列の文字数
pos1 - 比較するこの文字列の最初の文字の位置
count2 - 比較する指定された文字列の文字数
pos2 - 比較する指定された文字列の最初の文字の位置
t - 比較する (std::basic_string_view に変換可能な) オブジェクト

[編集] 戻り値

*this が引数で指定された文字シーケンスより辞書順で前に来る場合は負の値。

両方の文字シーケンスを比較して等しい場合はゼロ。

*this が引数で指定された文字シーケンスより辞書順で後に来る場合は正の値。

[編集] 例外

1)

(なし)

(C++11以前)
noexcept 指定:  
noexcept
  
(C++11およびそれ以降)
2-6) 対応する basic_string のコンストラクタによって投げられる例外を投げるかもしれません。
7) sv の初期化が例外を投げなければ何も投げません。
(C++17およびそれ以降)

[編集] 欠陥報告

以下の動作変更欠陥報告は以前に発行された C++ 標準に遡って適用されました。

DR 適用先 発行時の動作 正しい動作
LWG 2946 C++17 string_view overload causes ambiguity in some cases avoided by making it a template

[編集] 実装例

template<class CharT, class Traits, class Alloc>
int 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;
}

[編集] ノート

三方比較が要求されない状況では、 std::basic_string は通常の関係演算子 (<, <=, ==, > など) を提供します。

デフォルトでは (デフォルトの std::char_traits を用いる場合)、この関数はロケールの影響を受けません。 ロケール対応の三方文字列比較については std::collate::compare を参照してください。

[編集]

#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 ? "Batman comes before Superman\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"
        );
    }
}

出力:

Batman comes before Superman
Superman comes before man
man and man are the same.
Batman comes before Superman
Superman comes before man
Bat comes before Super

[編集] 関連項目

2つの文字列を辞書的に比較します
(関数テンプレート) [edit]
部分文字列を返します
(パブリックメンバ関数) [edit]
文字列の辞書的な比較とハッシュ値の計算を定義します
(クラステンプレート) [edit]
現在のロケールに従って2つの文字列を比較します
(関数) [edit]
ある範囲が別の範囲より辞書的に小さいかどうか調べます
(関数テンプレート) [edit]