我有编译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);
}
答案 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
循环。