执行以下操作是有效还是未定义:
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 };