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

Если у меня в C++ указатель на вектор:

vector<int>* vecPtr;

и я хотел бы получить доступ к элементу вектора, тогда я могу сделать это, разыграв вектор:

int a = (*vecPtr)[i];

но будет ли это разыменование фактически создавать копию моего вектора в стеке? предположим, вектор хранит 10000 ints, будет ли путем разыменования vecptr 10000 ints копироваться?

спасибо!

2 ответов


10000 ints не будет скопирован. Разыменование очень дешево.

чтобы было ясно, что вы можете переписать

int a = (*vecPtr)[i];

as

vector<int>& vecRef = *vecPtr; // vector is not copied here
int a = vecRef[i];

кроме того, если вы боитесь, что все данные, хранящиеся в vector будет расположен на стеке, и вы используете vector<int>* вместо vector<int> чтобы избежать этого: это не тот случай. Фактически в стеке используется только фиксированный объем памяти (около 16-20 байт в зависимости от реализации), независимо от количество элементов, хранящихся в vector. The выделяет память и хранит элементы в куче.


нет, ничего не будет скопировано; разыменование просто сообщает C++ , что вы хотите вызвать operator[] на вектор, не на указатель, vecPtr. Если бы вы не разыменовали, C++ попытался бы найти оператор [], определенный на std::vector<int>* тип.

это может стать очень запутанным, так как operator[] определяется для всех типов указателей, но это равнозначно смещению указателя, как если бы он указывал на массив vector<int>. Если бы ты только ... там выделен один вектор, а затем для любого индекса, кроме 0, выражение оценивает ссылку на мусор, поэтому вы получите либо segfault, либо что-то, чего вы не ожидали.

в общем, доступ к векторам через указатель-это боль, и (*vecPtr)[index] синтаксис неудобный (но лучше, чем vecPtr->operator[](index)). Вместо этого, вы можете использовать:

vecPtr->at(index)

это на самом деле проверяет диапазоны, в отличие от operator[], Так что если вы не хотите платить за проверку, если индекс находится в границы, вы застряли с (*vecPtr)[].