C++矢量迭代器错误
C++ vector iterator errors
我只是在学习如何在向量上使用迭代器,而且我在运行时错误方面遇到了一些麻烦。 下面是代码部分:
vector<int> nums;
for (int i=0; i<N; i++) { nums.push_back(i+1); }
vector<int>::iterator it = nums.begin();
while(nums.size() > 1)
{
//cout << *it << " ";
it = nums.erase(it);
for (int i=0; i<m-1; i++)
{
if (it == nums.end())
it = nums.begin();
else
++it;
}
}
注释掉的行给了我一个"矢量迭代器不是可取消引用的"错误,我认为这与迭代器到达终点有关,而且我也得到了一个"矢量擦除迭代器超出范围"错误,尽管我试图用语句来解释这一点
if (it == nums.end()) it = nums.begin();
无济于事。我还遇到了一些"矢量迭代器不可增量"错误,我发现这与使用擦除功能有关,但我使用
it = nums.erase(it);
解释无效的迭代器,这是我在网上任何地方都能找到的唯一建议。
我试图让迭代器多次扫描向量,擦除每次传递的特定值,直到只剩下一个(我发布的代码实际上循环了几次)。 如果你们有任何建议来消除这些错误,或者可以解释它们的来源,我将不胜感激:)
谢谢
克里斯
当您使用时:
it = nums.erase(it);
it
设置为被擦除的元素之后的元素。如果擦除 nums
中的最后一个元素,it
将指向 nums.end()
。您不会验证it
是否未指向end()
因此会出现错误。
既然你没有解释你想达到什么逻辑,我就不深究了。我只是建议您在擦除元素之前添加一个迭代器验证,即:
if (it != nums.end())
it = nums.erase(it);
在最后的for
循环中,您检查it == end()
,然后递增。 这意味着在某些情况下,it
可以指向最后一个元素(不等于end()
),然后递增,因此它现在等于 end()
,这就是下一个while
迭代的开始方式。
在 for 循环之后添加另一个检查end()
,重置回begin()
。
我必须补充一点,迭代器的这种使用有点奇怪。 可能有一种比重复递增 m 更好的方法。 你想做什么?
相关文章:
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- 初始化迭代器错误 C++ 在 GCC 编译器中
- 迭代器类的重载前缀增量运算符会引发分段错误
- 为什么我在使用 istream 迭代器时会出现 seg 错误?
- 在静态库中使用输出迭代器时出现链接器错误
- 在分配和发布递增循环迭代器时C++无限循环(gcc 错误?
- 比较迭代器会使程序崩溃,而不会在自定义气泡排序实现中出现错误
- C++结构编译器错误询问向量的迭代器
- 编译时二叉搜索树错误的反向迭代器表示"no matching function call for operator=()"
- 编译错误 std::vector<std::shared_ptr<T>>迭代器和擦除方法
- 赛松迭代器错误
- 向量迭代器不兼容的错误,用于保存另一个向量的迭代器的向量
- C++,弹出调试断言失败窗口,我得到矢量迭代器不兼容的错误运行时
- 在 leveldb 的 c++ 示例中声明迭代器时出现分段错误
- std::map 擦除 - 将迭代器传递给错误的映射
- C++向量迭代器nth_element编译错误
- 如何修复错误,迭代器未在此范围内声明,并且迭代器未命名类型'
- 如何修复使用矢量和迭代器打印值的错误
- C++ 迭代器错误"does not refer to a value"
- 使用 -std=c++0x 会导致错误:“迭代器”未命名类型错误