0

执行以下操作是否有效或未定义:

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;
}

基本上想要得到一个指向一个对象的迭代器,这样当我从列表中删除一个元素时,我可以引用它在列表中被删除的位置,这样我就可以将它插入到它应该在的位置。当我删除列表的第一个元素时出现问题,因为那里没有元素。我已经阅读了一些实现细节,并且在大多数情况下它似乎是有效的,只要迭代器没有被取消引用。

http://ideone.com/26Xfba

似乎在 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 };
4

0 回答 0