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

C++ 向量下标超出范围-C++;,c++,debugging,vector,range,C++,Debugging,Vector,Range,我正在使用visual studio 2013。我试图从一个向量中得到一个子向量: std::vector <Ponto> pontosDeControle; std::vector<Ponto> subPontosDeControle; std::向量桥控; std::矢量子本体控制; 向量PontosdeControl填充了一些对象,然后我得到了从位置I到PontosdeControl.size()的子向量-1: subPontosDeControle=std::

我正在使用visual studio 2013。我试图从一个向量中得到一个子向量:

std::vector <Ponto> pontosDeControle;
std::vector<Ponto> subPontosDeControle;
std::向量桥控;
std::矢量子本体控制;
向量PontosdeControl填充了一些对象,然后我得到了从位置I到PontosdeControl.size()的子向量-1:

subPontosDeControle=std::vector(&pontosDeControle[i],&pontosDeControle[pontosDeControle.size());
其中i小于PontosdeControl.size()-3

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


我没有看到这里的问题。

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

v.data() + v.size()
对于要使用的操作,不需要使用元素地址:可以使用迭代器:

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

对于大小为
v.size()
的向量
v.size()
,您只能访问索引
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() );

这将更加清晰和正确。

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

pontosDeControle[pontosDeControle.size()]
超出范围

你可以改写

subPontosDeControle.assign( std::next( pontosDeControle.begin(), i ),
                            pontosDeControle.end() );
这将更加清楚和正确