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
中删除项目,同时将迭代器存储在向量中。 实现此目的的方法是使用擦除-删除习惯用法,而不是尝试管理迭代器和while
循环。
相关文章:
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 通过指针偏移量访问结构变量值
- 以线程安全的方式转换 C/C++ 中时区名称字符串的时区偏移量
- librdkafka:rd_kafka_assignment 返回分配分区的偏移量 -1001
- 是否通过向封闭对象的地址添加字节偏移量来访问子对象
- 向指针地址添加 20 个字节偏移量
- glMapBufferRange(..) 中的偏移量关系和 glDrawArraysInstanced(..) 中的第一
- 是否有与 C# Structs/StructLayout 等效的功能,C++中的字段偏移量?
- 我的 sumASCII 函数中的此偏移量是多少?
- boost::序列化中的派生类偏移量计算.有效吗?
- RedisGraph 语法错误在偏移量 8 靠近"创建"
- 胎面偏移量的时间复杂度?
- 如何从 c++ 中的给定标准输入中获取每个字符的偏移量?
- 编译器在构造函数中计算的成员偏移量不正确
- 有没有办法在C++中将偏移量设置为基于范围的 for 循环?
- C++矢量迭代器 + 偏移量超出范围
- 字符串迭代器+偏移量超出范围
- 为什么 std::copy 抛出错误向量迭代器 + 偏移量超出范围并且无法复制
- C++STL set_union获取错误向量迭代器+偏移量超出范围
- Vector迭代器+偏移量超出范围,在while循环结束时给出错误