【问题标题】:Vector subscript out of range - C++向量下标超出范围 - C++
【发布时间】:2015-05-23 20:35:01
【问题描述】:

我正在使用 Visual Studio 2013。我正在尝试从向量中获取子向量:

std::vector <Ponto> pontosDeControle;
std::vector<Ponto> subPontosDeControle;

向量 pontosDeControle 被一些对象填充,然后我得到从位置 i 到 pontosDeControle.size()-1 的子向量:

   subPontosDeControle = std::vector<Ponto>(&pontosDeControle[i], &pontosDeControle[pontosDeControle.size()]);

其中 i 小于 pontosDeControle.size()-3。

此代码返回调试断言失败:向量下标超出范围。但是,在发布模式下工作正常。

我没有在这里看到问题。

【问题讨论】:

    标签: c++ debugging vector range


    【解决方案1】:

    在调试模式下,编译器会检查此表达式中使用的索引

    pontosDeControle[pontosDeControle.size()]
    

    超出范围。

    你可以改写

    subPontosDeControle.assign( std::next( pontosDeControle.begin(), i ),
                                pontosDeControle.end() );
    

    这样会更清楚更正确。

    【讨论】:

      【解决方案2】:

      对于大小为v.size() 的向量v,您只能访问索引0...v.size() - 1(当然,如果v.siz() == 0 没有可访问的索引)。如果你想获得一个指向最后一个元素的指针(你可以合法地获得这个地址),你会使用这样的东西:

      v.data() + v.size()
      

      对于您要使用的操作,您不需要使用元素的地址:您可以使用迭代器:

      subPontosDeControle.assign(pontosDeControl.begin() + i, pontosDeControl.end());
      

      【讨论】:

        猜你喜欢
        • 2021-05-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-23
        • 2015-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多