Я пытаюсь соединить (объединить) два полных списка std::list за постоянное время. Из чтения документации и других вопросов (Как выполнять объединение диапазонов в постоянное время с помощью 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
— деструктивная операция — списки физически объединяются. Вы не можете объединять списки неразрушающим образом за постоянное время. - person molbdnilo   schedule 14.10.2015