我想做以下事情:
std::list
s(l1
和l2
)所有这一切都应该在不分配新内存的情况下发生。
首先,我想用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
,但所有这些对我来说似乎有点过分了。
有没有人知道我最初问题的更好/更清洁的解决方案?
答案 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