マップをペアのベクターにコピーしようとしているので、ペアのsecond
データメンバーでベクターを並べ替えることができます。私はこれを次のようにして解決しました:
void mappedWordsListSorter(){
for (auto itr = mappedWordsList.begin(); itr != mappedWordsList.end(); ++itr){
vectorWordsList.Push_back(*itr);
}
sort(vectorWordsList.begin(), vectorWordsList.end(), [=](pair<string, int>& a, pair<string, int>& b){return a.second > b.second;});
}
代わりに標準ライブラリを使用して、生のループを使用せずにこれを行う方法を見つける必要があります。キーまたはマップの値のいずれかを転送するだけでこれを実行する多くの例に遭遇しました。 pairs<string, int>
のベクターにコピーする必要があります。それを行う最良の方法は何ですか?
std::vector
の- assign
メンバー関数。
//no need to call reserve, bidirectional iterators or better will compute the size and reserve internally.
vectorWordsList.assign(mappedWordsList.begin(), mappedWordsList.end());
上書きしたくないベクトルの既存の値がある場合は、代わりに insert
を使用します。
vectorWordsList.reserve(vectorWordsList.size() + mappedWordsList.size()); // make sure we only have a single memory allocation
vectorWordsList.insert(vectorWordsList.end(), mappedWordsList.begin(), mappedWordsList.end());
std::copy
およびstd::back_inserter
を使用できます。
std::copy(mappedWordsList.begin(),
mappedWordsList.end(),
std::back_inserter(vectorWordsList));
正直なところ、range -for
ループの方が明確だと思います。
for(const auto& kv : mappedWordsList)
vectorWordsList.emplace_back(kv);
いずれにしても、std::vector::reserve
を使用してターゲットにメモリを事前に割り当てることができますvector
。不要な再割り当てを回避できます。
この目的でベクターを作成するの場合は、ベクターのコンストラクターを直接使用できます。
std::vector<std::pair<FirstType,SecondType>> vectorWordsList( mappedWordsList.begin(), mappedWordsList.end() );
C++ 17では、ベクターのテンプレート引数を省略して、コンパイラーにそれらを推定させることもできます。
std::vector vectorWordsList( mappedWordsList.begin(), mappedWordsList.end() );