サンプルの動作確認バージョン [GCC4.4/1.41.0] [VC9/1.41.0]
#include <iostream>
#include <string>
#include <map>
#include <boost/property_map/property_map.hpp>
using namespace std;
// Associative-Map
typedef map<string,string> StrStrMap;
typedef boost::associative_property_map<StrStrMap> Name2AdrMap;
// 値渡しですが
void foo( Name2AdrMap address )
{
address[ string("Taro") ] = "Osaka";
string old_address = get( address, string("Hanako") );
put( address, string("Hanako"), old_address+"@Japan" );
}
int main()
{
StrStrMap n2a;
n2a.insert( make_pair( string("Taro"), string("Tokyo") ) );
n2a.insert( make_pair( string("Hanako"), string("Kyoto") ) );
Name2AdrMap address_map( n2a );
foo( address_map );
// 呼び出し側の値も書き変わります
for( StrStrMap::iterator i = n2a.begin(); i!=n2a.end(); ++i )
cout << i->first << ": " << i->second << endl;
return 0;
}
Hanako: Kyoto@Japan Taro: Osaka
"あるデータ型の値に対してどのような操作をほどこすことが可能か?" という疑問に答える"可能な操作の集合"みたいな概念が、STL の Concept として定義されてきました。例えばIteratorのconceptとしては、 ++itができて*itで値が取り出せる、"InputInterator" concept や、 it+=10 や it-=5 ができるなどする "RandomAccessIterator" concept などなど。 このライブラリでは、ある型の値から別の型の値への写像、つまり "map" に関するConceptが幾つか定義されています。 read_onlyであるとかwrite_onlyであるとか。
また、それらConceptの具体例として、keyをそのままvalueとして返す identity_property_map とか、ランダムアクセスイテレータを map がわりに使うためのアダプタとしての iterator_property_map とか、 上のサンプルのように、値渡ししてもlvalueとして使える associative_property_map など、幾つかのmapが実際に定義されています。
主にboostのgraphライブラリで、頂点や辺の情報を格納するコンテナに対する要件として 使われているようです。