Использование указателя на объект, хранящийся в векторе С++

У меня есть вектор myObjects в глобальной области видимости.

std::vector<myObject>

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

myObject* pmObj;

++pmObj; // the next element ??

или вместо этого следует передать std::Vector<myObject>::iterator и увеличить его?

Предположим пока, что вектор за это время не изменится.


person Community    schedule 16.03.2009    source источник
comment
Как вы получаете указатель на элемент?   -  person strager    schedule 16.03.2009
comment
Краккос, обратите внимание, что вы всегда можете получить указатель на элемент и из итератора, используя &*it;   -  person Johannes Schaub - litb    schedule 16.03.2009


Ответы (3)


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

person Community    schedule 16.03.2009
comment
Кроме std::vector‹bool›! - person David Holm; 16.03.2009

Да, это будет работать, как и ожидалось, так как стандарт std::vector предписывает использовать непрерывное хранилище. Я бы предложил передать пару итераторов, если вы работаете с рядом объектов. Это в значительной степени стандартная идиома, используемая STL. Это также сделает ваш код немного безопаснее, поскольку у вас есть явная конечная точка для итерации вместо того, чтобы полагаться на счетчик или что-то в этом роде.

person Community    schedule 16.03.2009
comment
поскольку вектор является глобальным, могу ли я сравнить указатель myObt с myObjectVecor.end(); - person Krakkos; 16.03.2009
comment
Я не уверен, действительно ли это безопасно или нет... для того, чтобы это работало, &vec.back() или &*vec.end() должны быть объектом за пределами непрерывного пространства, которое я делаю не верю, является гарантией стандарта. - person D.Shawley; 17.03.2009

Если вектор не перераспределяется и вы уверены, что не выйдете за границы вектора, вы можете использовать этот подход. Увеличение указателей допустимо, и пока у вас есть место для перехода к следующему элементу, вы можете сделать это, увеличив указатель, поскольку векторный буфер представляет собой один блок памяти.

person sharptooth    schedule 16.03.2009
comment
да, vecotr не будет перераспределен, но в конце концов я смогу достичь границ векторов... могу ли я проверить pmyObj == myObjectVector.end() перед его использованием? - person Krakkos; 16.03.2009
comment
По крайней мере, вы можете сделать это с реализацией VC++. - person sharptooth; 16.03.2009
comment
pObj == vec.end() действителен только в том случае, если векторный итератор является просто определением типа T*, что не гарантируется. vector не обеспечивает прямого доступа к своему внутреннему указателю, и вы не можете отменить ссылку vec.end(), поэтому единственный раз, когда вы можете проверить необработанный указатель на конец (&vec[0] + vec.size()), это когда vec. размер() ›= 1. - person Functastic; 16.03.2009