2013-07-18 3 views
2

Может кто-нибудь, пожалуйста, объясните мне подробно, почему следующий код для vectorY будет выполнять назначение, но размер VecY равен нулю? Кроме того, итераторы начала и конца застревают в первом узле. Кажется, что резерв работает только с push back и что вам нужно построить вектор с размером, если вы хотите, чтобы итераторы для векторов и размер работали должным образом. Я предполагаю, что push_back делает некоторый тип распределения, что прямое назначение не в этом случае? Я ищу подробности, объясняющие это, поэтому я могу убедиться, что я понимаю, что происходит с резервом и push_back в сравнении с конструкцией с элементом размера, а затем выполняет назначение, как в примере VecX.push_back versus operator [] назначение в векторах C++

#include <iostream> 
#include <vector> 

    int main (int argc, char *argv[]) 
    { 
     std::vector<int> vecX(2); 
     vecX[0] = 1; 
     vecX[1] = 2; 
     std::cout << " VecX0 Item: " << vecX[0] << std::endl; 
     std::cout << " VecX1 Item: " << vecX[1] << std::endl; 
     std::cout << " VectorX Size: " << vecX.size() << std::endl; 

     std::vector<int> vecY; 
     vecY.reserve(2); 
     vecY[0] = 1; 
     vecY[1] = 2; 
     std::cout << " VecY0 Item: " << vecY[0] << std::endl; 
     std::cout << " VecY1 Item: " << vecY[1] << std::endl; 
     std::cout << " VectorY Size: " << vecY.size() << std::endl; 
    } 

Output 

VecX0 Item: 1 
VecX1 Item: 2 
VectorX Size: 2 
VecY0 Item: 1 
VecY1 Item: 2 
VectorY Size: 0 
+0

Читали ли вы какие-либо инструкции о том, что 'VECTOR' и как это работает? Это очень стандартный и хорошо документированный материал. –

+0

Возможный дубликат [vector :: push \ _back vs vector :: operator \ [\]] (http://stackoverflow.com/questions/11007054/vectorpush-back-vs-vectoroperator) – Mgetz

ответ

6
std::vector<int> vecY; 
     vecY.reserve(2); 
     vecY[0] = 1; 
     vecY[1] = 2; 

Этот код является неправильным и вызывает неопределенное поведение . Когда вы reserve a vector, вы устанавливаете capacity, а не size.

Вам нужно либо push_back, или построить vector, как вы делали в примере 1.


«Неопределенное поведение»: Это вызывает неопределенное поведение из-за вызова вне-диапазона в operator[] Если вы вызываете vector::operator[n], где n > vec.size(), поведение Undefined.

+5

Это действительно действительно ** действительно * * плохой код, но с типом POD, действительно ли это неопределенное поведение? В Стандарте говорится, что время жизни POD начинается с выделения хранилища ('reserve' делает это), и вы начинаете его использовать. –

+0

@BenVoigt: Я думал, что это так. Я подтвержу. –

+0

Хм. 'a [n]' определяется как эквивалентный '* (a.begin() + n)', и ничто не гарантирует, что 'vecY.begin() + 1' действительно в этом случае. Но я не могу найти ничего, что конкретно говорит, что это тоже недействительно. – aschepler

-1

Если вы не хотите использовать push_back ни построить, рассмотреть вопрос об использовании метода resize

+0

Я должен был ответить на ваш ответ, извините. Он не затрагивает вопрос. Что касается выделения пространства для элементов, определение вектора с помощью std :: vector vecX (2); 'как в первой части кода OP выделяет и нулевое пространство так же хорошо, и без необходимости другого вызова функции.Вопрос в том, почему код делает то, что он делает, когда 'resize' или конструктор с начальным размером * не используются *. –

Смежные вопросы