我只是在学习如何在向量上使用迭代器,而且我在运行时错误方面遇到了一些麻烦。 下面是代码部分:
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 更好的方法。 你想做什么?