名前空間
変種
操作

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

提供: cppreference.com
< cpp‎ | string‎ | basic string
 
 
 
std::basic_string
 
(1)
int compare( const basic_string& str ) const;
(C++11未満)
int compare( const basic_string& str ) const noexcept;
(C++11以上)
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 noexcept(/* see below */);
(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 と比較します。
2) この文字列の [pos1, pos1+count1) の部分文字列を str と比較します。 count1 > size() - pos1 の場合は部分文字列は [pos1, size()) です。
3) この文字列の [pos1, pos1+count1) の部分文字列を str[pos2, pos2+count2) の部分文字列と比較します。 count1 > size() - pos1 の場合は1つめの部分文字列は [pos1, size()) です。 同様に count2 > str.size() - pos2 の場合は2つめの部分文字列は [pos2, str.size()) です。
4) この文字列を s の指す文字から始まる長さ Traits::length(s) のヌル終端文字シーケンスと比較します。
5) この文字列の [pos1, pos1+count1) の部分文字列を s の指す文字から始まる長さ Traits::length(s) のヌル終端文字シーケンスと比較します。 count1 > size() - pos1 の場合は部分文字列は [pos1, size()) です。
6) この文字列の [pos1, pos1+count1) の部分文字列を範囲 [s, s + count2) 内の文字と比較します。 If count1 > size() - pos1 the substring is [pos1, size()). (Note: the characters in the range [s, s + count2) may include null characters.)
7) std::basic_string_view<CharT, Traits> sv = t; によって行われたかのように、 t を文字列ビュー sv に暗黙に変換し、 この文字列を sv と比較します。 このオーバーロードは、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>(*this).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>(*this).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 である場合にのみ、オーバーロード解決に参加します。

data1 から始まる count1 個の文字からなる文字シーケンスは、 data2 から始まる count2 個の文字からなる文字シーケンスと、以下のように比較されます。 まず、 size_type rlen = std::min(count1, count2) によって行われたかのように、比較する文字数を計算します。 それから、 Traits::compare(data1, data2, rlen) を呼ぶことによってシーケンスを比較します。 標準の文字列の場合、この関数は文字単位の辞書的な比較を行います。 結果がゼロ (文字シーケンスがそこまで等しい) の場合は、そのサイズが以下のように比較されます。

条件 結果 戻り値
Traits::compare(data1, data2, rlen) < 0 data1data2 より小さい <0
Traits::compare(data1, data2, rlen) == 0 size1 < size2 data1data2 より小さい <0
size1 == size2 data1data2等しい 0
size1 > size2 data1data2 より大きい >0
Traits::compare(data1, data2, rlen) > 0 data1data2 より大きい >0

目次

[編集] 引数

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

[編集] 戻り値

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

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

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

[編集] 例外

pos1 または pos2 という名前の引数を取るオーバーロードは、引数が範囲外の場合、 std::out_of_range を投げます。

7)
noexcept 指定:  
noexcept(std::is_nothrow_convertible_v<const T&, std::basic_string_view<CharT, Traits>>)
8-9) basic_string_view への変換によって投げられるあらゆる例外を投げます。

[編集] 欠陥報告

以下の動作変更欠陥報告は以前に発行された 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) 他の文字列と比較します。
    {
        int compare_value{
            std::string{"Batman"}.compare(std::string{"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"
        );
    }
 
    // 2) 部分文字列を他の文字列と比較します。
    {
        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) 部分文字列を他の部分文字列と比較します。
    {
        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"
        );
        // 部分文字列を他の部分文字列と比較します。
        // デフォルト値 (他の文字列の終端まで) を使用しています。
        assert(compare_value == a.compare(3, 3, b, 5));
    }
 
    // 4) char ポインタと比較します。
    {
        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) 部分文字列を char ポインタと比較します。
    {
        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) 部分文字列を char ポインタの部分文字列と比較します。
    {
        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]