C++の連想配列を可能とする方法としてstd::mapクラスというものがあります。本記事ではC++の連想配列クラスのstd::mapについて解説します。
std::mapとは
std::mapとはC++で使用できる連想配列クラスです。
連想配列には以下の表のようにキー(fruits)とキーに対応する値(price)のペアで構成されています。普通の配列とは異なり、キーを指定して値を取り出すことが可能です。
fruits_price | |
fruits(キー) | price(値) |
orange(キー) | 100(値) |
apple(キー) | 150(値) |
banana(キー) | 80(値) |
std::mapクラスの使い方
std::mapクラスの使い方の例として以下のコードを用いて解説していきます。
#include <iostream> #include <string> #include <map> int main(int argc, char const* argv[]) { std::map<std::string,int> fruits_price; fruits_price["orange"] = 100; fruits_price["apple"] = 150; fruits_price["banana"] = 80; for(auto i = fruits_price.begin(); i != fruits_price.end(); ++i){ std::cout << i->first << " => " << i->second << std::endl; } return 0; }
インクルード
std::mapを使用するには
#include <map>
と記述することで、使用することができる。また
using namespace std;
と記述することで、宣言する際にstringやmapのみで宣言が可能でstd::stringやstd::mapと記述する手間が省ける。
クラスの宣言・キーと値の格納
mapクラスの宣言は以下のように記述します。
std::map<キーの型名,値の型名>変数名;
今回は、キーにstd::string型と値にint型を用いているため、
std::map<std::string,int> fruits_price;
と記述しています。作成したmapクラスの変数fruits_priceは、
//fruits_price[キー名(std::string型)] = 値(int型); fruits_price["orange"] = 100; fruits_price["apple"] = 150; fruits_price["banana"] = 80;
のように格納することができます。
キーと値の出力
キーと値を全て出力する際、for文を用いて最初の要素から最後の要素まで取得します。このとき、型にautoとすることで、型が自動的に指定されることになります。また、キー・値はそれぞれを i->first, i->second で表示することができます。
for(auto i = fruits_price.begin(); i != fruits_price.end(); ++i){ std::cout << i->first << " => " << i->second << std::endl; }
mapクラスの関数の紹介
mapクラスについて基本的な使い方を説明しましたが、上記の内容に加えmapクラスには連想配列を操作する際に便利な関数があるので、紹介していきます。
size関数(要素数を出力)
size関数はmapクラスで宣言された連想配列の要素数を返す関数です。例えば先ほどのコードに以下の文を追加するとfruits_priceの要素数を表示してくれます。(ここでは3が出力されます。)
std::cout << fruits_price.size() << std::endl; //3
empty関数(連想配列が空どうか確認)
empty関数はmapクラスで宣言された連想配列の中身が空かどうかtrueかfalseで返します。以下のコードではfruits_priceには要素があるためfruits_price.empty()はfalseと返します。なので"空ではありません"と表示されます。
if(fruits_price.empty() ){ //false std::cout << "空です\n"; }else{ std::cout << "空ではありません.\n"; }
find関数(キーの探索)
キーでmapのオブジェクトを検索したい場合find()関数を用いることで、値を参照することができます。またfind()関数でキーが見つからなかった場合はend()と同じ値を返します。
auto find = fruits_price.find("banana"); if (find == fruits_price.end() ) { std::cout << "not found" << std::endl; } else { std::cout << "found" << std::endl; std::cout << find->first << " => " << find->second << std::endl; }
このコードではfind関数の引数に"banana"と指定されていますが、fruits_priceのキーに"banana"があるので、
found banana => 80
と出力されます。もしもfind関数の引数に"grape"と指定されていたら、fruits_priceのキーに"grape"はないのでfruits_price.find("grape")
にはfruits_price.end()
と同じ値が返されます。よって
not found
と出力されます。
erase関数(キーの削除)
fruits_priceから"banana"のキーの要素を削除したい場合、
fruits_price.erase("banana")
とすることで、"banana"のキーの要素を削除することができます。
しかし、キーが存在しているかチェックし、存在していたら削除をする場合はfind関数を用いてからerase関数を使用する。
auto find = fruits_price.find("banana"); if (find == fruits_price.end() ) { std::cout << "not found" << std::endl; } else { fruits_price.erase(find); std::cout << "削除" << std::endl; }
clear関数(連想配列の全要素削除)
clear関数はmapクラスで宣言された連想配列の中身を全て削除します。使用例として以下にコードを示しています。また先ほどのempty関数と組み合わせています。ここではfruits_price.clear();で中身を全て削除しているのでfruits_price.empty()はtrueと返し、"空です"と表示されます。
fruits_price.clear(); if(fruits_price.empty() ){//true std::cout << "空です\n"; }else{ std::cout << "空ではありません.\n"; }
この記事のまとめ
本記事ではC++の連想配列クラスのstd::mapについて解説しました。
最後に要点をまとめておきましょう。
- #include<map>でmapクラスを用いることができる
- mapクラスの関数を用いて探索や削除、要素の数の参照が行える
ぜひstd::mapクラスを用いた連想配列を活用してみましょう。