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

C++ vector iterator + offset out of range

我有在 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); 
}

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

你想做的是

ti = temp.erase(ti);

其中 ti 指的是您删除的元素之后的第一个元素。实际上,这意味着 ti 不会改变(因为第一个元素将被向下移动以替换被删除的元素),但是使用 Visual Studio 调试构建中的迭代器跟踪会对此感到满意.

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

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

调用push_back()将导致迭代器失效。所以你的 ti 迭代器在调用 push_back.

之后可能无效

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

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