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
循环。
我有在 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
循环。