Out of Bounds Iterator for List

时间:2013-10-08 01:38:57

标签: c++ visual-c++

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

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

0 个答案:

没有答案