7

を持っていますがstd::list< std::pair<std::string,double> >、これは に従ってソートされていることがわかっていstd::string elementます。

要素にstd::find_if基づいて多くのことをしたいので、 withとがより適切であると考えています。std::stringstd::map<string,double,MyOwnBinaryPredicate>lower_boundupper_bound

事実は、効率的な方法でinsert要素を追加したいということです。std::mapしたがって、追加のイテレータを使用して高速化したいと考えていinsertます。

最も簡単な方法は、 を使用しconst_reverse_iteratorて を通過し、 のをstd::list使用することだと思います。begin()std::map

このようにしますか、それとも悪い考えですか?

ありがとう!

4

3 に答える 3

11

predicate に従ってソートされたソート済みリストがすでにある場合Predicateは、次の操作を実行できます。

std::list< std::pair<std::string, double> > sorted_list;
std::map<string, double, Predicate> map(sorted_list.begin(), sorted_list.end());

リストがすでにソートされている場合、mapコンストラクターは線形時間の複雑さを持ち、そうでない場合は O(n*log n) になります。その後、他の作業と同じようにマップを直接操作できます。

後で結果をリストに戻したい場合は、反対のことを行うことができます。

sorted_list.assign(map.begin(), map.end());
于 2010-08-05T07:51:50.513 に答える
4

std::copy と std::inserter を使用できます。

std::copy(the_list.begin(),the_list.end(),std::inserter(the_map,the_map.begin()));  

list< pair > の反復子は、map< X,Y > の反復子と互換性のある値の型を持っているためです。

于 2010-08-05T07:49:53.217 に答える
0

リストを反復処理してすべてのペアをマップに挿入するか、Luther Blissett が説明した巧妙な方法を使用します。
あなたが何をしようとしているのかわからないという事実は、コードが読めないか、あなたが道を外れていることを意味します。
なんでこんなことしてるの?
そもそもリストの代わりに地図を返すようにコードを変更できますか?

于 2010-08-05T07:50:50.877 に答える