C++のstd::mapに關する覺書
C++のSTLコンテナの一つであるstd::mapの簡單な使用法。よく忘れるので覺書しておく。
插入
データ插入に用ゐるメソッドと其の使用例を示す。
T& operator[](const Key& key);
key に對應する T のインスタンスへの參照を返す。此を用ゐて key に對應する T の値を設定することも出來るし、單に key に對するインスタンスを參照することも出來る。
- 値を設定する使用例
-
std::map<std::string, int> a_map; a_map["apple"] = 2; a_map["orange"] = 0;
- 値を參照する使用例
-
std::cout << "# of apples is " << a_map["apple"] << std::endl; std::cout << "# of oranges is " << a_map["orange"] << std::endl;
なほ、注意點として、key に對して未だ値を設定してゐない場合、operator[]()は、デフォルト値を持つインスタンスを生成し、その參照を返すことが擧げられる。そのやうな擧動を望まない場合には、operator[]()を、既に格納されてゐる要素を參照する方法として利用してはならない。後述するfind()で探索すること。
pair<iterator, bool> insert(const pair<Key, T>& val);
key に對應する T の値として val を設定する。
返値は key に對應する iterator と、插入が成功したかどうか示す bool 値の pair である。插入成功時にはこの bool 値は true に設定される。既に key に對するオブジェクトが設定されてゐる場合、插入は失敗し、返却される pair 中の bool 値には false が設定される。
std::map<string, int> a_map;
std::pair<std::map<string, int>::iterator, bool> result;
result = a_map.insert(std::make_pair("apple", 2));
if (result.second)
std::cerr << "插入成功. 今囘このメッセージが出る筈." << std::endl;
else
std::cerr << "插入失敗. 今囘このメッセージは出ない筈." << std::endl;
result = a_map.insert(make_pair("apple", 0)); // 同じ Key で插入を試行
if (result.second)
std::cerr << "插入成功. 今囘このメッセージは出ない筈." << std::endl;
else
std::cerr << "插入失敗. 今囘このメッセージが出る筈." << std::endl;
上記のコードを實行すると、以下の出力を得る。
插入成功. 今囘このメッセージが出る筈. 插入失敗. 今囘このメッセージが出る筈.
なほ、pairの作成には、上記例にもある樣に、std::make_pair(key, val) を用ゐるのが至便である。
その他の插入用メソッド
他にもメソッドはあるが、支配人が使ひさうにないといふ理由だけで列擧するに留める。
- iterator insert(iterator pos, const pair<Key, Val>& val);
- template <class In> void insert(In first, In last);
探索
Key を基に要素を探索するメソッドを示す。
iterator find(const Key& key);
const_iterator find(const Key& key) const;
指定した key に對應する要素を指すiteratorを返す。key に對應する要素がない場合には、<algorithm>のfind()と同樣にend()を返す。
mapのiteratorは、pair<Key, T>を指すので、Keyに對應づけられたTのオブジェクトは、返されたiteratorを it とすると, it->second
で參照する必要がある。例へば、次の通り。
std::map<string, int> a_map;
// ...
std::map<string, int>::iterator it = a_map.find("apple");
if (it != a_map.end()) {
std::cout << "apple に關聯附けられてゐたのは"
<< it->second << std::endl;
} else {
std::cout << "apple には何も關聯附けられてゐない。" << std::endl;
}
削除
要素を削除するメソッド。
- size_type erase(const Key& key);
- void erase(iterator pos);
- void erase(iterator first, iterator last);
- void clear();
1. が map ならではのメソッドである。戻り値は削除した數。あとは STL コンテナ共通のものであるので、此處では説明省略。
參考文獻
- B. Stroustrup, “プログラミング言語C++ 第3版,” 長尾高弘 譯, Addison Wesley Publishers Japan, 1998.