各手法の使い分け方
C++でのmapに対するforループの方法を3つほど紹介します。
私が使用して感じる各手法のメリット・デメリットを示すので参考にしてください(あくまで個人の感想です)。
| (1)範囲for文 | (2)イテレータ | |
|---|---|---|
| コードのわかりやすさ | 〇 | △ |
| コードの短さ | 〇 | × |
| 全要素に対しての操作 | 〇 | △ |
| findなどの関数との併用 | × | 〇 |
(1) 範囲for文を使う方法
for (std::pair<Keyの型, Valueの型> p : mp) { }
とすると、map型変数mpをpに順に格納することができます。
p.firstがKey、p.secondがValueです。
型名は毎度std::pairと書かずともautoでも代用できます。
使用例1:全要素の列挙
ソースコード
#include <iostream> #include <map> int main() { std::map<std::string, int> mp{ {"A", 4}, {"B", 18}, {"C", 5}, {"D", 6} }; // for(auto p : mp)でも可 for (std::pair<std::string, int> p : mp) { std::cout << "Key = " << p.first << ", Value = " << p.second << std::endl; } }
実行結果
Key = A, Value = 4 Key = B, Value = 18 Key = C, Value = 5 Key = D, Value = 6
使用例2:各Valueを-1倍にする
pに値を渡すまでは同じですが、pをループ内で上書きするので、&で参照するようにします。
ソースコード
#include <iostream> #include <map> int main() { std::map<std::string, int> mp{ {"A", 4}, {"B", 18}, {"C", 5}, {"D", 6} }; // std::pair<std::string, int>ではエラーが出た for (auto& p : mp) { p.second *= -1; } // 値の表示 for (std::pair<std::string, int> p : mp) { std::cout << "Key = " << p.first << ", Value = " << p.second << std::endl; } }
実行結果
Key = A, Value = -4 Key = B, Value = -18 Key = C, Value = -5 Key = D, Value = -6
(2) イテレータを使った方法
- mapはvector, set型と同じコンテナクラスであり、イテレータを持つのでこの方法も使えます。
- map型変数をmpとしたとき、次のようなイテレータが取得できます。
| mp.begin() | 先頭のイテレータ |
|---|---|
| mp.end() | 末尾の次のイテレータ |
イテレータの型名は長いので、autoで受け取るのが無難だと思います。
また、イテレータ型変数をiteとしたとき、そこに格納されている値は*iteとなります。
使用例1:全要素の列挙
ソースコード
#include <iostream> #include <map> int main() { std::map<std::string, int> mp{ {"A", 4}, {"B", 18}, {"C", 5}, {"D", 6} }; // イテレータを使い表示 for (auto ite = mp.begin(); ite != mp.end(); ite++) { std::cout << "Key = " << (*ite).first << ", Value = " << (*ite).second << std::endl; } }
実行結果
Key = A, Value = 4 Key = B, Value = 18 Key = C, Value = 5 Key = D, Value = 6
使用例2:各Valueを2倍する
範囲for文のときと異なり&は不要です。
ソースコード
#include <iostream> #include <map> int main() { std::map<std::string, int> mp{ {"A", 4}, {"B", 18}, {"C", 5}, {"D", 6} }; // イテレータで各Valueを2倍する for (auto ite = mp.begin(); ite != mp.end(); ite++) { (*ite).second *= 2; } // イテレータを使い表示 for (auto ite = mp.begin(); ite != mp.end(); ite++) { std::cout << "Key = " << (*ite).first << ", Value = " << (*ite).second << std::endl; } }
実行結果
Key = A, Value = 8 Key = B, Value = 36 Key = C, Value = 10 Key = D, Value = 12