ソートされたstd :: std ::ペアのリストをSTD ::マップに変換する方法
質問
私は持っています std::list< std::pair<std::string,double> >
, 、私が知っていることは、に従ってソートされています std::string element
.
たくさんのことをしたいので std::find_if
に基づく std::string
要素、私は信じていますa std::map<string,double,MyOwnBinaryPredicate>
と lower_bound
と upper_bound
より適切です。
実際、私がしたいということです insert
の要素 std::map
効率的な方法で。だから私は追加のイテレーターを使って insert
もっと早く。
最も簡単な方法は、 const_reverse_iterator
を通過する std::list
そして、それを使用します begin()
の std::map
.
このようにしますか、それとも悪い考えですか?
ありがとう!
解決
すでにソートされたリストがある場合、それは述語に従ってソートされています 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());
他のヒント
std :: copy and std :: inserterを使用できます。
std::copy(the_list.begin(),the_list.end(),std::inserter(the_map,the_map.begin()));
リスト<Paile>のイテレーターには、<x、y>のiteratorsをmap of of fore bale typeが互いに互換性があるためです。
リストを繰り返して、すべてのペアをマップに挿入するか、Luther Blissettが説明したきちんとした方法を使用します。
私があなたがやろうとしていることを理解していないという事実は、それが読み取れないコードにつながるか、あなたがはるかに離れていることを意味します。
なぜあなたはそれをこのようにしているのですか?
そもそもリストの代わりにマップを返すようにコードを変更できますか?