c++ - 将成员复制到 std::vector

标签 c++ boost std c++98

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

typedef std::vector<Node> Nodes;

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

是否有一种很好的单行方式来为节点中的每个项目使用 Node::name 填充 vector 名称?

这是我目前所做的:

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,仿函数可以只是 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;});

使用 boost bind——当心,未经测试,我无权访问 boost

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

关于c++ - 将成员复制到 std::vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19566030/

相关文章:

Python 扩展在处理大型列表时创建无效指针

c++ - 拆分 LPSTR 并将值相加为 long

c++ - 将 C++ 项目升级到 VS2015,但链接器仍在寻找 VC100 Boost 库

c++ - 为什么额外的 -I 标志(包含目录)会中断编译? (使用英特尔编译器)

c++ - 从只能访问迭代器的 std::list 中删除项目

c++ - 如何在 makefile 中设置编译标志?

c++ - 使用 for 循环 C++ 反转字符串

c++ - Boost cpp_dec_float 支持模运算

c++ - cctype 是怎么回事?

c++ - 带有 C++ 字符串类的 sprintf