Элемент
A map
определяется как map::value_type
, а его тип - pair<A,B>
. first
- это ключ, а second
- это значение. Вы можете написать функтор для извлечения second
из value_type
и скопировать его в vector
(или list
, или что угодно). Лучший способ сделать это при копировании используется transform
, который делает то, что подразумевает его имя: он принимает значение одного типа и преобразует его в другой тип значения.
Вот полный рабочий пример:
#include <cstdlib>
#include <map>
#include <string>
#include <algorithm>
#include <iterator>
#include <vector>
#include <iostream>
using namespace std;
typedef map<unsigned, string> MyMap;
MyMap my_map;
struct get_second : public std::unary_function<MyMap::value_type, string>
{
string operator()(const MyMap::value_type& value) const
{
return value.second;
}
};
int main()
{
my_map[1] = "one";
my_map[2] = "two";
my_map[3] = "three";
my_map[4] = "four";
my_map[5] = "five";
// get a vector of values
vector<string> my_vals;
transform(my_map.begin(), my_map.end(), back_inserter(my_vals), get_second() );
// dump the list
copy( my_vals.begin(), my_vals.end(), ostream_iterator<string>(cout, "\n"));
}
EDIT:
Если у вас есть компилятор, который поддерживает C ++ 0x lambdas , вы можете полностью исключить функтор. Это очень полезно для того, чтобы сделать код более читабельным и, что можно утверждать, более легким в обслуживании, так как вы не получите десятки маленьких одноразовых функторов, плавающих в вашей кодовой базе. Вот как вы должны изменить код выше, чтобы использовать лямбду:
transform(my_map.begin(), my_map.end(), back_inserter(my_vals), [](const MyMap::value_type& val){return val.second;} );