При использовании контейнеров STL STL, при каких условиях необходимо обращаться к ссылочным значениям? Например, любые ссылки недействительны после следующего вызова функции в контейнер?Устойчивые ссылки в контейнерах STL
{
std::vector<int> vector;
vector.push_back (1);
vector.push_back (2);
vector.push_back (3);
vector[0] = 10; //modifies 0'th element
int& ref = vector[0];
ref = 10; //modifies 0'th element
vector.push_back (4);
ref = 20; //modifies 0'th element???
vector.clear();
ref = 30; //clearly obsurd
}
Я понимаю, что в большинстве реализаций stl это сработает, но меня интересует то, что требует стандартная декларация.
--edit: Im заинтересованы потому что я хотел бы попробовать STXXL (http://stxxl.sourceforge.net/) библиотеки для C++, но я понял, что ссылки, возвращаемые контейнеры не были постоянными в течение нескольких операций чтения, и, следовательно, не совместимы без внесения изменений (хотя и поверхностно) к моему существующему stl-коду. Пример:
{
std::vector<int> vector;
vector.push_back (1);
vector.push_back (2);
int& refA = vector[0];
int& refB = vector[1]; //refA is not gaurenteed to be valid anymore
}
Я просто хотел бы знать, если это означало, что STXXL контейнеры, не 100% совместимость, или в самом деле, если бы я использовал STL контейнеров в небезопасном/реализации зависимого пути все время.
Я нашел соответствующий ответ на их FAQ http://algo2.iti.uni-karlsruhe.de/dementiev/stxxl/trunk/FAQ.html «Вы не должны передавать или хранить ссылки на элементы во внешней структуре данных памяти . Когда используется эта ссылка, блок, содержащий этот элемент, может быть больше не во внутренней памяти. ", Поэтому ответ НЕТ, ссылки на элементы контейнера не имеют такого же поведения, что и их STL-копии. – Akusete
Просматривая стандарт C++, все контейнеры имеют typedefs 'reference',' const_reference', 'pointer' и' const_pointer', которые настроены на соответствующие typedefs из базового распределителя. Кажется, что комитет по стандартам первоначально хотел создать абстракцию для ссылок и указателей, чтобы даже эти вещи могли «управляться» контейнером (в том виде, в котором итераторы уже есть), используя прокси-серверы, но, тем не менее, Стандартные мандаты, что тип 'allocator :: pointer' будет' T * 'и т. д., что делает сами typedefs в конечном счете бессмысленными. –
У меня такое же чувство, читая интерфейсы большинства контейнеров STL, но я не мог найти дискуссию о том, почему они только отправились на полпути. – Akusete