C ++向量迭代器+偏移超出范围

时间:2017-01-16 00:17:17

标签: c++ vector iterator range offset

我有编译Xcode的c ++代码,但是当我尝试在Visual Studio 2015上编译它时,我得到一个错误,即迭代器偏移量超出范围。有人可以尝试帮助解决这个问题:

typename std::vector< HNode<T>* >::iterator ti;

while(temp.size() > 1) {
    std::sort(temp.rbegin(), temp.rend(), HNodePointerCountComparator<T>());

    ti = temp.end();
    ti -= 1;

    temp.push_back(new HNode<T>());
    temp.back()->setCount(temp.back()->getCount() + (*ti)->getCount());
    temp.back()->setLeft(*ti);

    temp.erase(ti);

    ti -= 1; //Debug assertion failed: iterator + offset out of range

    temp.back()->setCount(temp.back()->getCount() + (*ti)->getCount());
    temp.back()->setRight(*ti);

    temp.erase(ti); 
}

2 个答案:

答案 0 :(得分:4)

erase使ti无效,因此当您尝试在VS之后修改它时,VS中的调试版本将标记它。

你想做的是

ti = temp.erase(ti);

ti引用您删除的第一个元素。在实践中,这意味着ti将不会更改(因为第一个元素将被移动以替换已擦除的元素),但使用Visual Studio在调试版本中进行迭代器跟踪将很满意。

答案 1 :(得分:1)

除了提供的其他答案之外,这也可以使迭代器无效:

   ti = temp.end();
   ti -= 1;
   temp.push_back(new HNode<T>());

调用push_back()将导致迭代器失效。因此,在调用ti后,您的push_back迭代器可能无效。

我们应该在您撰写的while循环中准确说明您的目标,而不是我们说明您遇到这些问题的原因。我相信你会得到答案,不仅会说明你做错了什么,还会说明如何正确编写纠删码。

没有这些问题的最好方法是不要在循环遍历向量的同时编写一个从std::vector中删除项目的循环,同时将迭代器存储在向量中。实现此目的的方法是使用erase-remove idiom而不是尝试管理迭代器和while循环。