2017-07-09 9 views
1

タイトルに見られるように、いつSTL std :: sort()は比較を停止しますか?私はすでにそれらを試してみたいつstd :: sortは比較を中止しますか

city name :: Marseille 
city name :: Mont de Marsan 
city name :: Mont Saint Martin 

city name :: Marseille 
city name :: Mont Saint Martin 
city name :: Mont de Marsan 

とソートがこの順序を変更しない、私にとって、それは次のようになります。私はそのようなベクトルを持っている意味

構文:STD ::並べ替え()は最初のスペースで停止した場合

std::sort(vector.begin(), vector.end()); 
std::sort(vector.begin(), vector.end(), std::less<std::string>()); 

、それは、どのようにして回避する方法してくださいますか?

+4

大文字は小文字より小文字です – harold

+0

デフォルトの比較機能と同じくらい比較が終わっても問題はありません。異なる方法でソートする場合は、いつでも独自のものを提供できます。 –

+0

さて、私は理解していると思います。 –

答えて

3

最も一般的なシステムは、ASCIIまたはその派生物を使用します。 ASCIIでは、すべて小文字がすべての大文字の後ろに来るため、'A' < 'Z''a' < 'z'(以前は予想していない部分)'Z' < 'a'です。つまり、その順序(その間に散在する)はA..Za..zです。アルファベット順に並べたとき

は、(明らかにあなたを含む)ほとんどの人は一般的に代わりAaBbCc...Zzのようなものを好むだろう

我々私たちが望む相対的な順序を指定するテーブルでこれを実装することができ - 。しかし、この要件は、十分なことが一般的ですstd::localeにはcollateファセットが含まれていますが、そのロケールに適した比較を行うためにoperator()をオーバーロードします。我々は比較演算子としてのロケールを指定する場合に過負荷がstd::sortによって自動的に使用されますので、我々はこのような何かを行うことができます。

std::sort(cities.begin(), cities.end(), std::locale("")); 

「名前のないロケールが」コンピュータが設定されたロケールを選択しますしたがって、通常はかなり節約されます。フランス語を扱っているようですが、アクセントや墓などの手紙もあります。ロケールに正しく分類する方法も知っているはずです。

特定のロケールのソートを指定する必要がある場合(ユーザーのコンピュータの設定方法に関係なく)、ソートを指定することもできます。私は私のコンピュータは、米国英語用に設定されているにもかかわらず、フランス系カナダ人の並べ替えを使用したい場合たとえば、私が指定することができます。

std::sort(cities.begin(), cities.end(), std::locale("fr-CA")); 

受け入れられる文字列の正確なセットは、コンパイラによって異なります。標準で列挙されているのは "C"(これはあなたが既にデフォルトしているものです)と ""です。実装者は、他者がサポートするものを決定することができます。上記で使用した"fr-CA"はMicrosoftのコンパイラでサポートされていますが、Linuxでgccを使用している場合(たとえば)、同じ結果を得るには他の文字列を指定する必要があります。

少なくともMicrosoftの現在のコンパイラと、どちらか""または"fr-CA"は、あなたがそれらをしたいとこれらの文字列をソートするために行います。これらの文字については

Marseille 
Mont de Marsan 
Mont Saint Martin 

、ほとんど「C」以外のロケールは、おそらく仕事をします。しかし、発音記号がある場合は、正しいロケールが必要になります。

関連する問題