Самый простой способ - написать простой цикл for, который просто работает.
typedef pair<pair<int, int>, string> strange_pair_t;
typedef map<string, strange_pair_t> strange_type_t;
strange_type_t src_map;
map<string, string> dst_map;
for(strange_type_t::const_iterator it = src_map.begin(); it!=src_map.end(); ++it)
{
dst_map.insert( make_pair( it->first, it->second.second ) );
}
Хитрый путь («однострочник»):
std::transform( src_map.begin(), src_map.end(), inserter(dst_map, dst_map.end()),
boost::lambda::bind(
boost::lambda::constructor<pair<string,string>>(),
boost::lambda::bind( &strange_type_t::value_type::first, boost::lambda::_1 ),
boost::lambda::bind( &strange_pair_t::second, boost::lambda::bind( &strange_type_t::value_type::second, boost::lambda::_1 ) )
)
);
C ++ 0x путь:
for_each( src_map.begin(), src_map.end(), [&dst_map](const strange_type_t::value_type& value) {
dst_map.insert( make_pair( value.first, value.second.second ) ); } );