web-dev-qa-db-ja.com

std :: mapをstd :: vectorのペアにコピーする

マップをペアのベクターにコピーしようとしているので、ペアの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>のベクターにコピーする必要があります。それを行う最良の方法は何ですか?

19
Victor

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());
23
NathanOliver

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。不要な再割り当てを回避できます。

7
Vittorio Romeo

この目的でベクターを作成するの場合は、ベクターのコンストラクターを直接使用できます。

std::vector<std::pair<FirstType,SecondType>> vectorWordsList( mappedWordsList.begin(), mappedWordsList.end() );

C++ 17では、ベクターのテンプレート引数を省略して、コンパイラーにそれらを推定させることもできます。

std::vector vectorWordsList( mappedWordsList.begin(), mappedWordsList.end() );
7
Drew Dormann