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



我使用的是visual studio 2013。我想从一个向量中得到一个子向量:

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

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

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

其中i小于pontosdecontrol .size()-3.

这段代码返回一个调试断言失败:Vector下标超出范围。但是,on发布模式可以正常工作。

在调试模式下,编译器检查该表达式中是否使用了index

pontosDeControle[pontosDeControle.size()]

不在范围内。

你可以写

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

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

v.data() + v.size()

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

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

最新更新