Указатель вектора разыменования на элемент доступа
Если у меня в C++ указатель на вектор:
vector<int>* vecPtr;
и я хотел бы получить доступ к элементу вектора, тогда я могу сделать это, разыграв вектор:
int a = (*vecPtr)[i];
но будет ли это разыменование фактически создавать копию моего вектора в стеке? предположим, вектор хранит 10000 ints, будет ли путем разыменования vecptr 10000 ints копироваться?
спасибо!
2 ответов
10000 int
s не будет скопирован. Разыменование очень дешево.
чтобы было ясно, что вы можете переписать
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)[]
.