#16 C++で学ぶ辞書型(マップ)の基本
C++で名前と値の組み合わせを扱うには、std::mapという仕組みを使います。この記事では、C++における辞書に相当する使い方と、安全な値の取り出し方を解説します。
mapを作ってみる
#include
値を取り出す
存在しないキーで直接アクセスすると、その型のデフォルト値が新しく作られてしまうことがあるため、find()を使って事前に確認するのが安全です。
auto it = scores.find("太郎");
if (it != scores.end()) {
std::cout << it->second << std::endl;
} else {
std::cout << "見つかりません" << std::endl;
}
it->firstがキー、it->secondが値を表します。
キーの有無だけを調べる
if (scores.count("太郎") > 0) {
std::cout << "太郎さんのデータがあります" << std::endl;
}
比較的新しいC++ではscores.contains("太郎")という、より直感的な書き方も使えます。
全てのキーと値を順に処理する
for (const auto& pair : scores) {
std::cout << pair.first << ": " << pair.second << std::endl;
}
構造化束縛という比較的新しい書き方を使うと、pair.first・pair.secondの代わりに、キーと値を直接名前付きで受け取れます。
for (const auto& [name, score] : scores) {
std::cout << name << ": " << score << std::endl;
}
キーが無いときだけ値を設定する
「既にあれば何もせず、無ければ挿入する」という処理はinsertを使うと1行で書けます。
scores.insert({"三郎", 78});
// 既に"三郎"キーがあれば何も起きない
C++ならではの注意点
std::mapは、内部でキーが自動的に並べ替えられて管理されるという特徴があります。forで繰り返し処理すると、キーの昇順で取り出されることが保証されています。順序を気にしない場合は、std::unordered_mapというより高速な仕組みを使う選択肢もあります。用途に応じて使い分けましょう。[]による読み取りは、存在しないキーだと自動的にそのキーを作ってしまう(意図せず要素が増える)副作用があるため、単に値の有無を確認したいだけならfind()やcount()を使うほうが安全です。
まとめ
C++の辞書はstd::mapが基本で、find()やcount()を使って安全にキーを確認します。構造化束縛による見やすい繰り返しや、順序が不要な場合のunordered_mapも含めて、用途に応じて検討しましょう。
本ページはプロモーションを含みます。
参考書籍(PR)
C++をもっと学びたい方には「新・明解C++入門編」がおすすめです。
PR
コードを書かずに自動化したい方へ
「学んだけど自分の作業に組み込む時間がない」という方向けに、ダブルクリックで動く Windows専用の自動化ツールをオーダーメイドで作成しています。気になる方は こちらをご覧ください。
コメント
コメントを投稿