将成员复制到std :: vector

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.

Dav*_*eas 6

对于更新的库(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)