将一个std :: list中的所有元素添加到另一个元素的“正确”方法是什么?
void
Node::addChilds(const NodeList *list)
{
for(NodeList::const_iterator i = list->begin();
i != list->end();
++i)
{
this->m_childs.push_back(*i);
}
}
我想到了std :: copy,但afaik for copy我必须调整目标列表的大小,备份结束迭代器(在调整大小之前)等。
我正在寻找单行声明。
答案 0 :(得分:13)
this->m_childs.insert(this->m_childs.end(), list->begin(), list->end());
答案 1 :(得分:12)
使用back_insert_iterator
。如果std::list<T>
是m_childs
的类型,
std::copy(list.begin(), list.end(),
std::back_insert_iterator<std::list<T> >(m_childs));
答案 2 :(得分:12)
如果要移动元素,可以使用拼接。否则,按照ybungalobill或larsmans的说明复制它们。
答案 3 :(得分:3)
Scott Meyers在第5项中的“ Effective STL ”中写了这个特定主题(并在第4项中提及splice
)。他更喜欢ybungalobill的版本,但主要是因为他认为代码更清晰,更清晰,因为它强调“插入”一词,而不是“复制”这个词。
使用迭代器(如std::copy
)的back_inserter
的几乎所有用法都可以替换为对范围成员函数的调用(如.insert(position, begin, end)
)。
splice
是一个常数时间成员函数,因此如果适用于这种特定情况,它会更快。