C++におけるSTLのmap用法の詳細

8152 ワード

深夜退屈mapの使い方を復習するニコニコ標準ライブラリmapタイプは、キー値(key-value)で格納されたデータタイプです.以下、以下のいくつかの面からまとめます.
map          
map       ,        ,   

1、pairタイプ
1.1、pairタイプの定義と初期化
pairタイプはファイルutilityで定義され、pairタイプには2つのデータ値が含まれています.通常、以下の定義と初期化の方法があります.
pair<T1, T2> p;
pair<T1, T2> p(v1, v2);
make_pair(v1, v2)

上記の第1の方法は、空のpairオブジェクトpを定義し、第2の方法は、初期値v 1およびv 2を含むpairオブジェクトpを定義することである.3つ目の方法は、v 1とv 2の値で作成された新しいpairオブジェクトです.
1.2、pairオブジェクトのいくつかの操作
このほか、pairオブジェクトには、pairオブジェクトの各メンバーの値を取り出すなど、いくつかの方法があります.
p.first
p.second

たとえば
#include 
using namespace std;
int main()
{
    pair<int, string> p1(0,"hello world");
    printf("%d %s
"
,p1.first,p1.second.c_str()); pair<int,string> p2 = make_pair(1,"hello"); printf("%d %s
"
,p2.first,p2.second.c_str()); return 0; }

2、mapオブジェクトの定義と初期化
mapはキー値ペアの組合せであり、以下の定義方法があります.
map m;
map m(m2);
map m(b, e);

上記の第1の方法は、mという空のmapオブジェクトを定義する.第2の方法は、m 2のコピーmを作成する.第3の方法はmapオブジェクトmを作成し、反復器bおよびeの範囲内のすべての要素のコピーを格納する.mapのvalue_typeは要素を格納するキーと値のpairタイプで、キーはconstです.
3、mapオブジェクトの基本操作
3.1、map中の要素の挿入
mapには要素が2種類挿入されています
    
  insert  

mapで下付きラベルを使用して存在しない要素にアクセスすると、mapコンテナに新しい要素が追加されることに注意してください.Insert関数の挿入方法は主に以下の通りです.
m.insert(e)
m.insert(beg, end)
m.insert(iter, e)

上記のe個のvalue_typeタイプの値.begとendは反復器の開始と終了をマークします.2つの挿入方法の例は次のとおりです.
#include 
using namespace std;
int main()
{
    map<int,int> mp;
    for(int i = 0;i < 10; i++) {
        mp[i] = i;
    }
    for(int i = 10;i < 20; i++) {
        mp.insert(make_pair(i,i));
    }
    map<int,int>::iterator it;
    for(it = mp.begin(); it != mp.end(); it++) 
        printf("%d-->%d
"
,it->first,it->second); return 0; }

3.2、map中の要素の検索と読み取り
注意:上記でmap中の要素を下付きで読み取る場合、mapにその要素が存在しない場合はmapに挿入されます.
したがって、要素が存在するかどうかを検索するだけであれば、kの出現回数を返す関数count(k)を使用することができる.keyに対応する値を取得するには、要素を指す反復器を返す関数find(k)を使用します.
上記の2つの関数は、次のように使用されます.
#include 
using namespace std;
int main()
{
    map<int,int> mp;
    for(int i = 0;i < 20; i++) {
        mp.insert(make_pair(i,i));
    }
    if(mp.count(0)) {
        printf("YES
"
); } else printf("NO
"
); map<int,int>::iterator it_find; it_find = mp.find(0); if(it_find != mp.end()) it_find->second = 20; else printf("NO
"
); map<int,int>::iterator it; for(it = mp.begin();it != mp.end(); it++) { printf("%d->%d
"
,it->first,it->second); } return 0; }

3.3、mapから要素を削除する
mapから要素を削除する関数はerase()で、この関数には次の3つの形式があります.
m.erase(k)
m.erase(p)
m.erase(b, e)

第1の方法は、m中のキーがkの要素を削除し、削除した要素の個数を返す.第2の方法は反復器pが指す要素を削除し、voidを返す.第3の方法は、反復器bと反復器eの範囲内の要素を削除し、voidを返す.
次のようになります.
#include 
using namespace std;
int main()
{
    map<int,int> mp;
    for(int i = 0;i < 20; i++) {
        mp.insert(make_pair(i,i));
    }
    mp.erase(0);
    mp.erase(mp.begin());
//  mp.erase(mp.begin(),mp.end());
    map<int,int>::iterator it;
    for(it = mp.begin(); it!=mp.end(); it++) {
        printf("%d->%d
"
,it->first,it->second); } return 0; }