[解決済み】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の方がタイプ数が少なく、何をやっているのかが明確なので、好きです。
関連
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み] std::vector にある項目が存在するかどうかを調べるには?
-
[解決済み] std::vector<> からインデックスで要素を消すにはどうしたらいいですか?
-
[解決済み] C++ std::map に指定されたキーが存在するかどうかを調べる方法
-
[解決済み] JavaScriptで(キー、値)を反復する方法は?
-
[解決済み] Mapのキーを配列に変換するには?
-
[解決済み] マップの全キーに対する反復処理
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】クラステンプレートの引数リストがない
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない