C++矢量迭代器错误



我只是在学习如何在向量上使用迭代器,而且我在运行时错误方面遇到了一些麻烦。 下面是代码部分:

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 更好的方法。 你想做什么?

相关内容

最新更新