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)
考虑到无效的迭代器,这是我在网上找到的唯一建议.
我试图让迭代器多次扫描向量,在每次传递中擦除特定值,直到只留下一个(我发布的代码实际上已循环多次).如果你们有任何建议消除这些错误或者可以解释它们的来源,我真的很感激:)
谢谢,
克里斯
当你使用:
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)
| 归档时间: |
|
| 查看次数: |
1940 次 |
| 最近记录: |