std::map からすべてのキー (または値) を取得してベクターに格納するにはどうすればよいでしょうか? 質問する

std::map からすべてのキー (または値) を取得してベクターに格納するにはどうすればよいでしょうか? 質問する

これは私がカミングアウトする可能性のある方法の 1 つです。

struct RetrieveKey
{
    template <typename T>
    typename T::first_type operator()(T keyValuePair) const
    {
        return keyValuePair.first;
    }
};

map<int, int> m;
vector<int> keys;

// Retrieve all keys
transform(m.begin(), m.end(), back_inserter(keys), RetrieveKey());

// Dump all keys
copy(keys.begin(), keys.end(), ostream_iterator<int>(cout, "\n"));

もちろん、別の関数RetrieveValuesを定義して、マップからすべての値を取得することもできます。

std::mapこれを簡単に実現できる他の方法はありますか? (そうするためのメンバー関数が含まれていないのはなぜなのか、いつも疑問に思っています。)

ベストアンサー1

ソリューションは動作するはずですが、同僚のプログラマーのスキル レベルによっては読みにくくなる可能性があります。さらに、機能が呼び出しサイトから移動します。これにより、メンテナンスが少し難しくなる可能性があります。

あなたの目標がキーをベクターに取り込むことなのか、それとも cout に印刷することなのかはわかりませんので、私は両方やっています。次のようなことを試してみてください。

std::map<int, int> m;
std::vector<int> key, value;
for(std::map<int,int>::iterator it = m.begin(); it != m.end(); ++it) {
  key.push_back(it->first);
  value.push_back(it->second);
  std::cout << "Key: " << it->first << std::endl;
  std::cout << "Value: " << it->second << std::endl;
}

あるいは、Boost ライブラリを使用している場合はさらに簡単です:

map<int,int> m;
pair<int,int> me; // what a map<int, int> is made of
vector<int> v;
BOOST_FOREACH(me, m) {
  v.push_back(me.first);
  cout << me.first << "\n";
}

個人的には、入力が少なく、何を実行しているかが非常に明確であるため、BOOST_FOREACH バージョンが気に入っています。

おすすめ記事