format_list_bulleted
【C++】C++の連想配列クラスstd::mapついて解説
最終更新日時:2020-05-25 04:06:13



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クラスを用いた連想配列を活用してみましょう。