向量下标超出范围 - C++

Vector subscript out of range - C++

我正在使用 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.

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

我没有看到这里的问题。

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

v.data() + v.size()

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

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

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

pontosDeControle[pontosDeControle.size()]

超出范围。

你可以改写

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

这样会更清楚正确。