パープルハット

※当サイトではGoogleアドセンス広告を利用しています

C++ map for文


各手法の使い分け方

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