Соедините и разделите два списка std :: list без выделения - PullRequest
3 голосов
/ 07 октября 2011

Я бы хотел сделать следующее:

  1. соединить два std::list с (l1 и l2)
  2. передать объединенный список в функцию
  3. восстановить два исходных списка

Все это должно происходить без выделения новой памяти.

Сначала я хотел попробовать это с splice(), но потом я прочитал, что итераторы перемещенных элементов будут аннулированы splice(). Затем, однако, я прочитал этот SO-ответ: splice () для std :: list и аннулирование итератора и решил все равно попробовать:

iterator temp = l2.begin();
l1.splice(l1.end(), l2);
my_function(l1);
l2.splice(l2.end(), l1, temp, l1.end());

Это работает во многих случаях, но если l2 изначально пусто, это не так (потому что temp не указывает на что-либо значимое).

Конечно, я мог бы проверить l2.size() > 0, но все это мне кажется слишком обходным.

Кто-нибудь знает лучшее / более чистое решение моей первоначальной проблемы?

1 Ответ

3 голосов
/ 07 октября 2011

Вы можете изменить логику, чтобы сохранить действительный итератор:

auto temp = l2.begin();

l2.splice(temp, l1);  // "L2 = L1 + L2"

my_function(l2);

l1.splice(l1.end(), l2, l2.begin(), temp);  // restores both l1 and l2
...