2016-03-20 1 views
2

элементов в std::vector динамически распределены и их адреса могут меняться при перераспределении. Таким образом, невозможно зависеть от их адресов, потому что они нестабильны.Использование адреса элемента в устойчивом векторе

С другой стороны, если у меня есть std::vector, который содержит некоторые элементы, и у меня нет никакого намерения что-либо изменить об этом в течение его жизненного цикла, он действителен (четко определен) для использования адресов его позиций ?

Пример:

std::vector<foo> foos; 
foos.reserve(100); 
for(size_t i=0;i<100;++i){ 
    foos.emplace_back(make_random_foo()); 
} 
//From now no one can touch foos  
auto ptr_to_the_fifth_foo=&foos[4]; 

Другими словами, не стандартная гарантия того, что отмечая будет влиять на вектор всевозможное адреса, так как я не делал, что моим сам?

+2

Если вы не используете какие-либо функции-члены, которые недействительны для ссылок или итераторов, вы также не делаете недействительными указатели. – Pixelchemist

+2

Да, это сработает, если вы не используете std :: vector JVApen

ответ

3

Если функция-член std::vector не вызвана, вектор не может быть изменен вообще, и содержимое остается неизменным, и все указатели остаются в силе.

В вашем примере вы вызываете operator[](size_type n), который определен в стандарте как эквивалентный *(a.begin() + n).

std::vector является контейнером и, следовательно, требования контейнер трюм, состояние:

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

Поскольку begin() не указано недействительными любые итераторы контейнера, operator[] не будет либо.

1

Да.

Указатели и ссылки на элементы являются недействительными, когда их итератор недействителен.

Итераторы недействительны, когда емкость увеличивается (при пропускной способности), или когда вы вставляете/удаляете элементы до этот элемент в векторе. Они также могут быть признаны недействительными, когда контейнер перемещается или перемещается, но может не произойти.

Я считаю, что своп указан в не ТЕРЯЮТСЯ итераторы, а заставить их обратиться к «новому дому», как его там, где (и, следовательно, указатели/ссылки на «новый дом» в «новом векторе») (т. е. изменение владельца буфера). Move-assign не дает этого обещания. Я не помню с головы до головы, если движется конструкция.

+1

http://stackoverflow.com/a/25348988/1938348 move должен также сохранять итераторы, это не официальное судно, но когда оно проходит, будет ретроактивно применяться к C++ 11, потому что он считается «дефектами». – Yankes

+0

@Yankes предлагаемая резолюция не охватывает назначение, просто строительство? – Yakk

+1

"no move constructor (или переместить назначение [...])" в http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#2321 – Yankes

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