これは私がカミングアウトする可能性のある方法の 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 バージョンが気に入っています。