2015-05-23 5 views
1

C++ Я использую Visual Studio 2013. Я пытаюсь получить подвектор из вектора:Вектор индекс вне диапазона -

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

вектор pontosDeControle заполняется с некоторыми объектами, то я получаю подвектор от позиции я до pontosDeControle.size() - 1:

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

, где я меньше, то pontosDeControle.size() - 3.

Этот код не возвращает утверждение об отладке: Векторный индекс вне диапазона. Однако в режиме деблокирования работает нормально.

Я не вижу здесь проблемы.

ответ

2

в режиме отладки компилятор проверяет, что используемый индекс в этом выражении

pontosDeControle[pontosDeControle.size()] 

находится вне диапазона.

Вы могли бы написать вместо

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

Было бы более ясно и правильно.

1

Для вектора v с размером v.size() вы можете только показатели доступа 0 ... v.size() - 1 (конечно, если v.siz() == 0 есть не доступен индекс). Если вы хотите, чтобы получить указатель на элемент мимо последнего (вы можете получить этот адрес законно), вы бы использовать что-то вроде этого:

v.data() + v.size() 

Для операций, которые вы хотите использовать не нужно использовать адреса элементов: вы можете использовать итераторы вместо:

subPontosDeControle.assign(pontosDeControl.begin() + i, pontosDeControl.end()); 
Смежные вопросы