【问题标题】:C++ why this code doesn't work? [closed]C++ 为什么这段代码不起作用? [关闭]
【发布时间】:2017-05-24 04:46:51
【问题描述】:
vector<int> v = { 1,2,3,4,5 };
for (auto beg = v.begin(); beg != v.end();++beg)
{
    if (beg == v.begin())
        v.push_back(50);
}

在运行时,它说:“向量迭代器不可递增”。

【问题讨论】:

标签: c++


【解决方案1】:

如前所述,std::vector::push_back() 可能会使您的迭代器无效。可能,但非常丑陋的解决方案可能是:

for (auto beg = v.begin(); beg != v.end();++beg)
{
    if (beg == v.begin()) {
        v.push_back(50);
        beg = v.begin();
    }
}

但你的逻辑似乎很复杂,为什么不在循环之前推回?

【讨论】:

  • 我没有考虑代码,我只是想知道为什么会出现错误。
  • 关于 SO 的答案不仅适合您,这也是我要求您修复代码的原因。
  • 我认为push_back()之所以使所有迭代器失效是因为push_back()改变了vector占用的内存地址,对吗?
  • @gigi push_back 可能使迭代器无效。实际上,在您更新的示例中,它很可能不会。现在你应该明白为什么问minimal reproducible example 了。但是是的,如果capacity() 不足以容纳新的数据大小,vector 可能必须重新分配内存用于存储。
【解决方案2】:

std::vector::push_back

如果新的 size() 大于 capacity(),则 所有迭代器和引用(包括过去的迭代器)都将失效。否则只有过去的迭代器无效。

在您的示例中,beg 是一个迭代器。已经被 push_back 失效了,不能再使用了。

【讨论】:

    猜你喜欢
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 2010-09-18
    相关资源
    最近更新 更多