C++ 向量下标超出范围-C++;
我正在使用visual studio 2013。我试图从一个向量中得到一个子向量: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::
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() );
这将更加清楚和正确