今時の C++ で連想配列を扱う
今時と書いたんですがあんまり今時の C++ は知らないのでもっといい書き方ってありますかね?
C++ の例が載っていなかったので簡単にかいてみました。
一応 C++17 で動作するコードとなっています。
#include <iostream> #include <vector> #include <string> #include <unordered_map> int main(){ using namespace std::literals; // 出力用関数 auto output = [](auto hash) { std::cout << "---" << std::endl; for(auto [key, value] : hash){ std::cout << "key = " << key << ", value = " << value << std::endl; } }; // 連想配列の定義 std::unordered_map hash{ std::pair{ "apple"s, "りんご"s }, std::pair{ "peach"s, "もも"s } }; // 明示的に型を定義する場合 // std::unordered_map<std::string, std::string> hash{ // // std::pair は不要 // { "apple"s, "りんご"s }, // { "peach"s, "もも"s } // }; // 参照 auto a = hash["apple"s]; std::cout << hash["apple"s] << std::endl; // 更新 hash["apple"s] = "林檎"; output(hash); // 追加 hash["pear"s] = "なし"s; output(hash); // 削除 hash.erase("pear"); output(hash); return 0; } // output // りんご // --- // key = peach, value = もも // key = apple, value = 林檎 // --- // key = apple, value = 林檎 // key = pear, value = なし // key = peach, value = もも // --- // key = apple, value = 林檎 // key = peach, value = もも
C++17 でも連想配列専用のリテラルはないんですが、上記のように書くことで割と簡単に定義することができますね。
どうせなら {}
に対してユーザ定義リテラルとか定義できるようにならないですかね…。
ちなみに C++11 で標準ライブラリに <unordered_map>
が追加されましたが C++ 以前でも標準ライブラリには <map>
があるのでそちらを利用することもできます。