调用 vector.erase() 函数时指针操作无效错误
Invalid pointer operation error when calling vector.erase() function
我正在使用vector::erase((函数删除vector中的第一个元素,直到它为空,但我的编译器给了我一个"无效的指针操作"错误。
我有一个类定义的对象的向量,foo,称为bar。我正在像这样一一删除元素:
for(int i = 0; i < bar.size(); i++){
if(!bar.empty()){
bar.erase(bar.begin());
}
}
当我运行我的程序时,它只完成一次迭代(无论大小如何(,并在第二次迭代中断。具体来说,它会中断 STL 函数_Destroy
template<class _TyDtor> inline
void _Destroy(_TyDtor _FARQ *_Ptr)
{ // destroy object at _Ptr
_DESTRUCTOR(_TyDtor, _Ptr);
}
*注意我知道有一个明确的函数可以更整洁地做到这一点,但这只是我正在尝试做的其他事情的简化示例
与往常一样,在遍历范围时修改范围时,不能无条件地递增循环计数器。
考虑一个双元素集合的简单示例。当i
0
时,删除第一个元素并递增i
。现在i
1
,bar.size()
1
,循环退出,无法删除第二个元素。
标准解决方案是使增量以不修改容器为条件:
for (int i = 0; i < bar.size(); /* no increment here */) {
if (!bar.empty()) {
bar.erase(bar.begin());
} else {
++i;
}
}
当您通过擦除元素来修改容器时,i
保持不变,但范围会移动一个元素。增加i
也是重复计算。
(这是一个非常常见的错误,尽管通常它用迭代器来表示,例如这里或这里或这里。
问题是循环bar.size()
的条件部分,它在每次迭代中不断变化,即在本例中减少 1。
很难说你在循环中到底想实现什么,但如果你想执行循环bar-size ()
次,请使用以下逻辑:
const size_t vecSize = bar.size ()
for(int i = 0; i < vecSize ; i++)
{ ..... }
否则,如果要执行循环直到bar-size ()
为空,请使用while
循环,如下所示:
while (bar.size > 0)
{ ..... }
相关文章:
- 迭代器的指针操作问题
- 通过浮点指针操作字节向量
- 调用 vector.erase() 函数时指针操作无效错误
- 执行直接指针操作还是 [] 更好
- 字符串指针操作
- 请帮助我理解上述代码行为。了解 void 指针和双 void 指针操作
- 指针操作的使用未知
- 双指针操作
- c++ 指针操作等效于 ReadProcessMemory
- 指针操作 ++ 会导致内存泄漏
- 排序算法不适用于使用指针操作的模板
- 如何通过函数中的指针操作char*或chara[]
- 2个c源文件之间的函数指针操作导致编译时错误
- 通过指针操作动态调用的数组
- 是否存在通过引用选择元素和通过指针操作选择元素都有效的情况
- C++字符串和指针操作
- c++:通过函数使用指针操作字符串
- 该指针操作是否有其他语法?
- 指针操作导致printf以相反顺序打印参数
- 对齐指针操作