加入并重新分割两个std :: list而不分配

时间:2011-10-06 22:53:00

标签: c++ list stl iterator

我想做以下事情:

  1. 加入两个std::list s(l1l2
  2. 将组合列表传递给函数
  3. 恢复两个原始列表
  4. 所有这一切都应该在不分配新内存的情况下发生。

    首先,我想用splice()尝试这个,但后来我读到移动项的迭代器将被splice()无效。 然而,我读到了这个答案:splice() on std::list and iterator invalidation 并决定尝试一下:

    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 个答案:

答案 0 :(得分:3)

你可以改变逻辑以保持有效的迭代器:

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