2016-07-17 10 views
-7

タイトルが言ったように、私はテストのデモを書いたstd :: sort()compare関数で "return lhs.size()== rhs.size()"を使用できないのはなぜですか?

bool comp(string lhs, string rhs) { 
    return lhs.size() < rhs.size(); 
} 

bool comp1(string lhs, string rhs) { 
    return lhs.size() == rhs.size(); 
} 

int main(int argc, const char *argv[]) { 
    string str[] = {"dog", "is", "cat", "elephant", "fish", "cow"}; 
    std::sort(str, str + 6, comp1); 
    output(); 
} 

出力:期待cat dog is elephant fish cow

:何、...cat dog cow...

は、私が一緒に、同じ大きさの文字列を入れたいが、それは動作しませんでしたが問題?

+1

https://en.wikipedia.org/wiki/Weak_ordering#Strict_weak_orderings – LogicStuff

+0

受信した出力は何ですか? –

+2

「同じサイズの文字列をまとめて」とはどういう意味ですか?あなたの最初の 'comp'関数を使ってソートしていないのですか? – Jezor

答えて

3

comp1(a,b)comp1(b,a)はどちらも返すことができません。trueは許可されていません。 std::sortは述べている:

COMP - 最初の引数は、第二の(すなわち前に順序付けされる)未満である場合に真を返す比較関数オブジェクト(Compareの要件を満たし、すなわちオブジェクト)。

そして、我々はまた、参照Compareへのリンク次

はすべて、COMP(A)== falseを
*カンプた場合については、次の特性
*とstrict weak ordering関係を確立(a、b)== trueの場合、comp(b、c)== true then comp(a、b)== trueの場合、comp(b、a)== false
* true

最初の関数compは、次の要件を満たしています.2つのオブジェクトがtrueを返すことはできません。 comp(a,b)true,を返した場合、comp(b,a)falseを返します。ただし、これは2番目の関数comp1には当てはまりません。 comp1(a,b)trueを返します。comp(b,a)となるため、sortは決して終了しないため、コンパイルされません。同じサイズが一緒にグループ化される任意の文字列:

あなたが

は、私が一緒に

しかし、単にoperator<は、それらの結果を達成する使用して、同じ大きさの文字列を入れたいと述べています。

+2

'comp(a、b)'と 'comp(b、a)'は同じ結果を返すことができます。その結果が偽である限り、それは同等の値の場合であろう。 –

2

==は、strict weak orderを形成しません。

bool comp(string const& lhs, string const& rhs) { 
    return lhs.size() < rhs.size(); 
} 

それとも、同じ長さの文字列のソート辞書式をしたい場合:以下はあなたの説明ごとに理想的である必要があり

bool comp(string const& lhs, string const& rhs) { 
    return 
     lhs.size() < rhs.size() 
    || (lhs.size() == rhs.size() && lhs < rhs); 
} 

さらに読書のために、ここでのトピックの私のお気に入りの記事があります:Order I Say!

+0

パラメータの型を 'const 'に変更するなどの無関係の変更を導入するときは、その理由を説明すると役に立ちます。それ以外に、あなたの変更された 'comp1'はOPが動作することを知っています:OPの' comp'関数です。 – hvd

関連する問題