C++向量迭代器错误

Chr*_*ris 2 c++ iterator vector erase

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

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;       
    }
}
Run Code Online (Sandbox Code Playgroud)

注释掉的行给了我一个"向量迭代器不可解除错误"的错误,我认为这与迭代器到达结尾有关,我也得到了一个"向量擦除迭代器超出范围"的错误,尽管我试过用声明说明这一点

if (it == nums.end()) it = nums.begin();    
Run Code Online (Sandbox Code Playgroud)

无济于事.我也得到了一些"矢量迭代器不可递增"的错误,我发现它与使用擦除功能有关,但我用过

it = nums.erase(it);
Run Code Online (Sandbox Code Playgroud)

考虑到无效的迭代器,这是我在网上找到的唯一建议.

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

谢谢,

克里斯

Eit*_*n T 5

当你使用:

it = nums.erase(it);
Run Code Online (Sandbox Code Playgroud)

it被设置为删除后的元素.如果删除最后一个元素nums,则it指向nums.end().您没有验证it没有指向,end()因此您收到错误.

既然你没有解释你想要达到的逻辑,我就不会深入研究它.我只是建议你在删除元素之前添加一个迭代器验证,即:

if (it != nums.end())
    it = nums.erase(it);
Run Code Online (Sandbox Code Playgroud)