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/