[英]Copy members to std::vector
struct Node
{
std::string name;
...
};
typedef std::vector<Node> Nodes;
Nodes nodes;
std::vector<std::string> names;
Is there a nice one-liner way of populating the vector names with Node::name for each item in nodes? 对于节点中的每个项目,是否有一个很好的单行方式用Node :: name填充矢量名称?
This is what I currently do: 这就是我目前所做的事情:
names.reserve(nodes.size());
BOOST_FOREACH(Node node, nodes)
{
names.push_back(node.name);
}
I'm using C++98, std and boost. 我正在使用C ++ 98,std和boost。
This is much simpler with newer libraries (boost) and or standards (C++11), but you should be able to write a small functor: 对于更新的库(boost)和/或标准(C ++ 11),这更简单,但是你应该能够编写一个小的仿函数:
struct ReadNodeName {
std::string const & operator()(Node const & node) const {
return node.name;
}
};
And then use std::transform
然后使用
std::transform
std::transform(nodes.begin(), nodes.end(),
std::back_inserter(names),
ReadNodeName());
With boost, the functor could be just boost::bind
, in C++11 you could use a lambda: [](Node const & node) { return node.name; };
使用boost,functor可以只是
boost::bind
,在C ++ 11中你可以使用lambda: [](Node const & node) { return node.name; };
[](Node const & node) { return node.name; };
, in C++14 a shorter lambda [](auto& n) { return n.name; }
,在C ++ 14中,一个较短的lambda
[](auto& n) { return n.name; }
[](auto& n) { return n.name; }
: [](auto& n) { return n.name; }
:
std::transform(nodes.begin(), nodes.end(),
std::back_inserter(names),
[](auto & n){return n.name;});
Using boost bind -- beware, untested, I don't have access to boost 使用boost绑定 - 小心,未经测试,我没有访问提升
std::transform(nodes.begin(), nodes.end(),
std::back_inserter(names),
boost::bind(&Node::name, _1));
Use std::transform
. 使用
std::transform
。 This takes care of the actual copying in one line. 这将在一行中处理实际的复制。 You will have to write a transformation function, though.
但是,您必须编写转换函数。
如果向Node
添加getName()
函数,则可以执行以下操作:
std::transform(nodes.begin(), nodes.end(), back_inserter(names), mem_fun(&Node::getName));
Since you mention boost, here is one liner with boost::lambda
: 既然你提到了boost,这里有一个带
boost::lambda
衬里:
std::transform(nodes.begin(),nodes.end(), std::back_inserter(names), &boost::lambda::_1 ->* &Node::name );
Boost lambda cannot overload .*
so first we need to get address &
, and then use ->*
to get reference to member. 提升lambda不能超载
.*
所以首先我们需要获取地址&
,然后使用->*
来获取对成员的引用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.