Baz*_*Baz 3 c++ boost std c++98
struct Node
{
std::string name;
...
};
typedef std::vector<Node> Nodes;
Nodes nodes;
std::vector<std::string> names;
Run Code Online (Sandbox Code Playgroud)
对于节点中的每个项目,是否有一个很好的单行方式用Node :: name填充矢量名称?
这就是我目前所做的事情:
names.reserve(nodes.size());
BOOST_FOREACH(Node node, nodes)
{
names.push_back(node.name);
}
Run Code Online (Sandbox Code Playgroud)
我正在使用C++ 98,std和boost.
对于更新的库(boost)和/或标准(C++ 11),这更简单,但是你应该能够编写一个小的仿函数:
struct ReadNodeName {
std::string const & operator()(Node const & node) const {
return node.name;
}
};
Run Code Online (Sandbox Code Playgroud)
然后使用 std::transform
std::transform(nodes.begin(), nodes.end(),
std::back_inserter(names),
ReadNodeName());
Run Code Online (Sandbox Code Playgroud)
有了boost,functor就可以了boost::bind,在C++ 11中你可以使用lambda : [](Node const & node) { return node.name; };,在C++ 14中使用更短的lambda [](auto& n) { return n.name; }:
std::transform(nodes.begin(), nodes.end(),
std::back_inserter(names),
[](auto & n){return n.name;});
Run Code Online (Sandbox Code Playgroud)
使用boost绑定 - 小心,未经测试,我没有访问提升
std::transform(nodes.begin(), nodes.end(),
std::back_inserter(names),
boost::bind(&Node::name, _1));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
181 次 |
| 最近记录: |