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)
| 归档时间: |
|
| 查看次数: |
23930 次 |
| 最近记录: |