从地图中获取值列表

Ami*_*hum 12 c++ stl list map

有没有一种方法可以从地图中获取值列表?

即,我有:

std::map<A,B> myMap;
Run Code Online (Sandbox Code Playgroud)

我想要一个只返回值列表的函数,即std::list<B>(或者为此设置.是否有内置的stl方法来执行此操作?

Joh*_*ing 16

map元件被定义为map::value_type,与它的类型是一个pair<A,B>. first是关键而且second是价值.你可以编写一个函子second从a中提取 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"));
}
Run Code Online (Sandbox Code Playgroud)

编辑:

如果你有一个支持C++ 0x lambda的编译器,你可以完全消除仿函数.这对于使代码更具可读性和可论证性更易于维护非常有用,因为您最终不会在代码库中出现数十个小的一次性仿函数.以下是如何更改上面的代码以使用lambda:

transform(my_map.begin(), my_map.end(), back_inserter(my_vals), [](const MyMap::value_type& val){return val.second;} );
Run Code Online (Sandbox Code Playgroud)