【发布时间】:2015-10-14 12:46:30
【问题描述】:
我试图在恒定时间内拼接(连接)两个完整的 std::lists。通过阅读文档和其他问题 (How to do range splice in constant time with std::forward_list?),我有两个澄清问题:
- 是否可以在恒定时间内拼接两个 std::list 并保留每个列表的完整列表?
-
我的理解是,这个功能可以通过创建我自己的列表数据结构来实现 - 并使用类似于以下的函数(伪代码):
List joinLists(List list1, List list2) { list1->tail = list2->head; list1->tail = list2->tail; return list1; }
这是真的吗?如果没有,如果有人可以帮助我了解这里发生了什么,我将不胜感激。我觉得我错过了什么..
我正在使用的代码在这里:
auto simple_sorter = [this, numCores](std::vector<std::vector<std::list<unsigned int>>>& buckets_small_, std::vector<std::list<unsigned int>>& buckets_large_, std::vector<bool>& finished_, unsigned int range_low, unsigned int range_high, int thread_number)
{
//.. irrelevant
//Combine small buckets into single large bucket per thread
for(unsigned int i = 0; i < numCores; ++i) {
std::list<unsigned int> list1 = buckets_large_[thread_number];
list1.splice(list1.end(), buckets_small_[i][thread_number]);
//...
};
(注意:Boost/其他库不是一个选项)
【问题讨论】:
-
splice是一种破坏性操作 - 列表“物理地”连接在一起。您不能在恒定时间内以非破坏性方式连接列表。