2011-01-05 20 views

答えて

33
std::vector<std::pair<std::string, bool> > v; 
std::sort(v.begin(), v.end()); 

std::pair過負荷operator<second要素によってその後first要素によって第一ソートします。したがって、デフォルトの並べ替え順序(operator<)を使用してvectorを並べ替えるだけで、希望の順序が得られます。

+1

これはC++ 0xのみの回答です。 ;)編集:2つのネストされたテンプレート '<>'を閉じる '' ''トークンはC++ 0xのみです。 –

+0

@Charles:Ha!ええ、私はおそらく多くの答えでそれを行います。私は '>>'をサポートするコンパイラの使用にも慣れています。 –

+4

+1:私は 'std :: pair :: operator <()'が多重定義されていることを知らなかった。今やる! –

0

カスタムコンパレータを使用して、ペア '.firstのみを注文することができます。

sort(begin, end, 
    compose2(less<string>(), 
       select1st<pair<string, bool> >(), 
       select1st<pair<string, bool> >())); 
+2

'select1st'はC++標準ライブラリの一部ではないことに注意してください。 –

+0

Mmm。幸いなことに、次のように書くのは簡単です: 'template struct select1st:public unary_function {const typename T :: first_type&operator()(const T&x)const {return x.first;}};' – ephemient

2

本当にジェームズの答えのような私が、あなたが考慮する必要があります一つの他の選択肢があります - ちょうどstd::mapにすべてを注ぎ込む:あなたが重複している文字列を持っている場合、

std::map<std::string, bool> myMap(v.begin(), v.end()); 

または、std::multimap

std::multimap<std::string, bool> myMultiMap(v.begin(), v.end()); 

これはOとは反対にするために(n)は、あなたは、新しいキー/値のペアを追加または削除する必要がある場合、あなたはO(LG n)がでそうすることができるという追加の利点を持っていますソートされたベクトル。

本当にベクトルを使用する必要がある場合は、Jamesの答えを参照してください。しかし、ペアのベクトルがある場合は、実際にはstd::mapが必要になる可能性があります。

+0

私は、ユーザーがそれらを並べ替えることを望んでいない場合と、ユーザーが並べ替えることを望んでいない場合を考慮する必要があります。 – jmasterx

+1

ベクトル+ソートは実際にはbig-O表記の内容にかかわらず、たくさんのものを(マルチ)マップに挿入するよりもはるかに高速です。 – Reunanen

関連する問題