1. ホーム
  2. c++

[解決済み】std::mapからすべてのキー(または値)を取得し、それらをベクトルに入れるには?

2022-03-30 20:34:25

質問

これは、私の出方として考えられることの一つです。

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"));

もちろん、別のファンクタを定義することによって、マップからすべての値を取り出すこともできます。 リトリーババルス .

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

どのように解決するのですか?

解決策はうまくいくはずですが、仲間のプログラマーのスキルレベルによっては読みにくいものになる可能性があります。 さらに、コールサイトから機能が離れてしまいます。 そのため、メンテナンスが少し難しくなる可能性があります。

キーをベクターに取り込むのが目的なのか、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の方がタイプ数が少なく、何をやっているのかが明確なので、好きです。