向量下标超出范围 - 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() );
这样会更清楚正确。
我正在使用 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() );
这样会更清楚正确。