【发布时间】:2010-11-29 19:11:33
【问题描述】:
在 C++ 中,我有两个 list<T> 对象 A 和 B,我想将 B 的所有成员添加到 A 的末尾。我搜索了几个不同的来源,但没有找到一个简单的解决方案(例如A.append(B);),这让我有点吃惊。
最好的方法是什么?
碰巧,在这之后我不再关心 B(它在下一行被删除)所以如果有办法利用它来获得更好的性能,我也对此感兴趣。
【问题讨论】:
在 C++ 中,我有两个 list<T> 对象 A 和 B,我想将 B 的所有成员添加到 A 的末尾。我搜索了几个不同的来源,但没有找到一个简单的解决方案(例如A.append(B);),这让我有点吃惊。
最好的方法是什么?
碰巧,在这之后我不再关心 B(它在下一行被删除)所以如果有办法利用它来获得更好的性能,我也对此感兴趣。
【问题讨论】:
如果你想在 B 中附加 项目的副本,你可以这样做:
a.insert(a.end(), b.begin(), b.end());
如果你想将 B 的项目移动到 A 的末尾(同时清空 B),你可以这样做:
a.splice(a.end(), b);
在你的情况下拼接会更好,因为它只涉及调整链表中的几个指针。
【讨论】:
a.splice(a.end(), b) 和 a.splice(a.end(), b, it_b_start) 是 O(1),但 a.splice(a.end(), b, it_b_start, it_b_end) 是 O(n)。
一个使用 boost 的例子
std::list<T> A; // object A is a list containing T structure
std::list<T> B; // object B is a list containing T structure
// append list B to list A
BOOST_FOREACH(auto &listElement, B) { A.push_back( listElement ); }
【讨论】: