我使用的是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
,您只能访问索引0
…v.size() - 1
(当然,如果v.siz() == 0
没有可访问的索引)。如果您想要获得指向最后一个元素之后的元素的指针(您可以合法地获得此地址),您可以使用如下内容:
v.data() + v.size()
对于你想使用的操作,你不需要使用元素的地址,你可以使用迭代器来代替:
subPontosDeControle.assign(pontosDeControl.begin() + i, pontosDeControl.end());