#16 C++で学ぶ辞書型(マップ)の基本

C++で名前と値の組み合わせを扱うには、std::mapという仕組みを使います。この記事では、C++における辞書に相当する使い方と、安全な値の取り出し方を解説します。

mapを作ってみる

#include 

std::map scores;
scores["太郎"] = 90;
scores["次郎"] = 85;

値を取り出す

存在しないキーで直接アクセスすると、その型のデフォルト値が新しく作られてしまうことがあるため、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専用の自動化ツールをオーダーメイドで作成しています。気になる方は こちらをご覧ください。

コメント

このブログの人気の投稿

#25 Rustで学ぶAI API(ChatGPT等)の呼び出し方の基本

#8 C++で学ぶ文字列操作の基本

#16 TypeScriptで学ぶ辞書型(マップ)の基本