2

我只是在学习如何在向量上使用迭代器,并且遇到了一些运行时错误的问题。这是代码部分:

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;       
    }
}

注释掉的行给了我一个“vector iterator is not dereferencable”错误,我认为这与迭代器到达末尾有关,而且我也得到一个“vector erase iterator outside range”错误,虽然我试过了用声明解释这一点

if (it == nums.end()) it = nums.begin();    

无济于事。我还遇到了一些“向量迭代器不可递增”错误,我发现这与使用擦除函数有关,但我使用了

it = nums.erase(it);

解释无效的迭代器,这是我在网上任何地方都能找到的唯一建议。

我试图让迭代器多次扫描向量,在每次传递时擦除特定值,直到只剩下一个(我发布的代码实际上循环了几次)。如果你们有任何建议来消除这些错误或者可以解释它们的来源,我真的很感激:)

谢谢,

克里斯

4

2 回答 2

5

当您使用:

it = nums.erase(it);

it设置为擦除后的元素。如果删除 中的最后一个元素numsit将指向nums.end()。您没有验证它it没有指向,end()所以您会收到错误消息。

由于您没有解释您要实现的逻辑,因此我不会深入研究。我只是建议您在擦除元素之前添加一个迭代器验证,即:

if (it != nums.end())
    it = nums.erase(it);
于 2012-06-15T19:05:09.700 回答
3

在最后一个for循环中,您检查it == end()然后递增。这意味着在某些情况下,it可以指向最终元素(不等于end()),然后递增,使其现在等于,这就是end()while一次迭代的开始方式。

在 for 循环之后添加另一个end()带有 reset的检查。begin()

我必须补充一点,迭代器的这种使用有点奇怪。可能有比重复增加 m 更好的方法。你想做什么?

于 2012-06-15T19:07:07.130 回答