繁体   English   中英

将成员复制到std :: vector

[英]Copy members to std::vector

struct Node
{
    std::string name;
    ...
};

typedef std::vector<Node> Nodes;

Nodes nodes;
std::vector<std::string> names;

对于节点中的每个项目,是否有一个很好的单行方式用Node :: name填充矢量名称?

这就是我目前所做的事情:

names.reserve(nodes.size());
BOOST_FOREACH(Node node, nodes) 
{
    names.push_back(node.name);
}

我正在使用C ++ 98,std和boost。

对于更新的库(boost)和/或标准(C ++ 11),这更简单,但是你应该能够编写一个小的仿函数:

struct ReadNodeName {
   std::string const & operator()(Node const & node) const {
      return node.name;
   }
};

然后使用std::transform

std::transform(nodes.begin(), nodes.end(),
               std::back_inserter(names),
               ReadNodeName());

使用boost,functor可以只是boost::bind ,在C ++ 11中你可以使用lambda: [](Node const & node) { return node.name; }; [](Node const & node) { return node.name; }; ,在C ++ 14中,一个较短的lambda [](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;});

使用boost绑定 - 小心,未经测试,我没有访问提升

std::transform(nodes.begin(), nodes.end(),
               std::back_inserter(names),
               boost::bind(&Node::name, _1));

使用std::transform 这将在一行中处理实际的复制。 但是,您必须编写转换函数。

如果向Node添加getName()函数,则可以执行以下操作:

std::transform(nodes.begin(), nodes.end(), back_inserter(names), mem_fun(&Node::getName));

既然你提到了boost,这里有一个带boost::lambda衬里:

std::transform(nodes.begin(),nodes.end(), std::back_inserter(names), &boost::lambda::_1 ->* &Node::name );

提升lambda不能超载.*所以首先我们需要获取地址& ,然后使用->*来获取对成员的引用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM