【问题标题】:C++ vector iterator errorsC++ 向量迭代器错误
【发布时间】:2012-06-18 21:01:42
【问题描述】:

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

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

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

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

谢谢,

克里斯

【问题讨论】:

  • 基于你在while循环中直到向量中没有更多值的事实,我认为你想删除向量中的所有元素。为此,只需使用 nums.clear();
  • @ahenderson 我认为循环在num.size() == 1时结束
  • @EitanT Duh。我不知道它应该做什么。

标签: c++ vector iterator erase


【解决方案1】:

使用时:

it = nums.erase(it);

it 设置为已擦除元素之后的元素。如果删除nums 中的最后一个元素,it 将指向nums.end()。你没有验证it 没有指向end(),所以你得到了错误。

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

if (it != nums.end())
    it = nums.erase(it);

【讨论】:

  • 啊!谢谢。我一直在努力,并想出了类似的东西,这就是诀窍。感谢您的帮助
【解决方案2】:

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

添加对end() 的另一项检查,并在for 循环后重置为begin()。

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

【讨论】:

  • 谢谢,解决了一个问题。 m 实际上是我想要找到的,对于这个问题,我想不出比测试 m=1、m=2 等更好的方法。如果不清楚,这就是问题......这有点难以解释:uva.onlinejudge.org/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-14
  • 1970-01-01
  • 2015-11-19
  • 2013-12-16
  • 1970-01-01
相关资源
最近更新 更多