2013-09-16 13 views
9

文字列ベクトルのソート方法を知りたかったので、最小文字数の文字列がベクターの上にくるようにしました。たとえば、ベクトルにABCD、ABCDE、ABCがある場合ABCがトップに到達しました。私はsort_ifでどのように達成できるのか、述語はどのように見えるのでしょうか?任意の他の方法もある文字列サイズに基づいて文字列ベクトルをソートする

+0

これは 'std :: sort_if()'ではありません。しかし、 'std :: sort()'の述語には過度の負担がかかります。述語は明らかに引数の長さを比較し、等しい場合は文字列の辞書順と比較します。それ以外の場合は、最初の引数が短い場合は 'true'を返します。 –

+0

FYI - これらの回答は古くなりました。過負荷のオペレータは必要ありません。単にラムダを使用してください! –

答えて

10

文字列(複数可)の大きさを比較するために、独自のカスタム数子を作成し、にそれを使用します文字列をソートします。

struct compare { 
    bool operator()(const std::string& first, const std::string& second) { 
     return first.size() < second.size(); 
    } 
}; 

std::vector<std::string> v; 
compare c; 
std::sort(v.begin(), v.end(), c); 
+1

文字列の長さが同じであれば、その文字列を辞書順に並べ替えることをお勧めします。関数呼び出し演算子はおそらく 'const'でなければなりません。 –

+0

これを行うには、ファンクタを作成する必要はありません。単純な比較関数も同様に行います。 –

+0

@DietmarKühl私はあなたがちょうど同じ長さであれば安定したいと思うだろう。それは尋ねる人のことだと思います。 – BoBTFish

5

は定期的std::sort(first, last, compare)を使用することができるはず歓迎し、このように機能を比較します

bool compareLen(const std::string& a, const std::string& b) 
{ 
    return (a.size() < b.size()); 
} 
2

std::sortあなただけの長さに基づいて比較する関数を定義することができますカスタム比較

template< class RandomIt, class Compare > 
void sort(RandomIt first, RandomIt last, Compare comp); 

のためのオプションの引数を取ります。

関連する問題