pairクラス

http://www.geocities.jp/ky_webid/cpp/library/011.html

pairは、2つの値をペアにして1つとして扱うためのクラスです。 前章のmapでは、キーと値をペアで扱う必要がありました。正にこのような用途で使うものです。前章のmapで、insertするとき、value_typeを使っていましたが、value_typeの正体は通常pairです。

な、なるほど。そういうことでしたか。

前回のmapクラスの時に使っていたvalue_typeとはとどのつまりpairクラスだったわけなんですね。

なのでmapのinsertにはvalue_typeじゃなくてpairを直接渡すことも可能です。試してみましょう。

#include <iostream>
#include <map>
#include <string>

// pairを使うのに必要
#include <utility>

using namespace std;

int main () {
    map<string, int> data;
    
    // pairを使う
    data.insert( pair<string, int>("ddd",40) );
    data.insert( pair<string, int>("aaa",10) );
    data.insert( pair<string, int>("ccc",30) );
    data.insert( pair<string, int>("bbb",20) );
    data.insert( pair<string, int>("eee",50) );
    
    map<string, int>::iterator it = data.begin();
    
    while( it != data.end() ) {
        cout << "key=" << it->first << " value=" << it->second << endl;
        ++it;
    }
    
    return 0;
}
$ main
key=aaa value=10
key=bbb value=20
key=ccc value=30
key=ddd value=40
key=eee value=50

ちゃんと動きました。

そして次にpairのテンプレート引数を省略できるmake_pairというものもあります。

こちらも試してみます。

#include <iostream>
#include <map>
#include <string>
#include <utility>
using namespace std;

int main () {
    map<string, int> data;
    
    // make_pairを使う
    data.insert( make_pair("ddd",40) );
    data.insert( make_pair("aaa",10) );
    data.insert( make_pair("ccc",30) );
    data.insert( make_pair("bbb",20) );
    data.insert( make_pair("eee",50) );
    
    map<string, int>::iterator it = data.begin();
    
    while( it != data.end() ) {
        cout << "key=" << it->first << " value=" << it->second << endl;
        ++it;
    }
    
    return 0;
}

ばっちりです。make_pairはその引数から自動で型を検出して動いてくれるのでテンプレート引数を指定しなくても良いというわけなんですね。