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

C++ vector iterator + offset out of range

本文关键字:范围 偏移量 迭代器 C++      更新时间:2023-10-16

我有在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中删除项目,同时将迭代器存储在向量中。 实现此目的的方法是使用擦除-删除习惯用法,而不是尝试管理迭代器和while循环。