执行以下操作是否有效或未定义:
int main()
{
std::list<int> a = { 10 };
auto it = std::prev(a.begin()); // potential out of bounds here
std::list<int> b;
b.splice(b.begin(), a);
a.push_back(12);
std::cout << *std::next(it);
return 0;
}
基本上想要得到一个指向一个对象的迭代器,这样当我从列表中删除一个元素时,我可以引用它在列表中被删除的位置,这样我就可以将它插入到它应该在的位置。当我删除列表的第一个元素时出现问题,因为那里没有元素。我已经阅读了一些实现细节,并且在大多数情况下它似乎是有效的,只要迭代器没有被取消引用。
似乎在 GCC/CLang 中工作,但我在 VC++ 中收到调试警告。
编辑:
只是为了澄清我的目标,我需要一个拼接函数的实现,以便我可以将列表的扇区相互拼接和拼接出来......
// Note not valid code... really just a concept of what I need...
std::list<int> a = { 10, 20, 30, 40 };
std::list<int> b = { 2, 4, 6, 8 };
auto b1 = std::advance(a.begin(), 1);
auto e1 = std::advance(a.end(), -2);
auto b2 = b.begin();
auto e2 = b.end();
a.splice(b1, e1, b, b2, e2);
// a = { 10, 2, 4, 6, 8, 40 }
// b = { 20, 30 }
b.splice(b1, e1, a, b2, e2);
// a = { 10, 20, 30, 40 }
// b = { 2, 4, 6, 8 };