Если вы используете python 3 или выше,
>>> list(bytes(b'test'))
[116, 101, 115, 116]
C ++ 11 (Источник: Правила аннулирования Iterator (C ++ 0x) )
Контейнеры последовательности
vector
: все итераторы и ссылки перед точкой вставки не затронуты, если новый размер контейнера больше, чем предыдущая емкость (в этом случае все итераторы и ссылки недействительным) [23.3.6.5/1]deque
: все итераторы и ссылки недействительны, если вставленный элемент не находится на конце (спереди или сзади) дека (в этом случае все итераторы недействительны, но ссылки на элементы не затрагиваются) [23.3.3.4/1]list
: все итераторы и ссылки не затронуты [23.3.5.4/1]forward_list
: все итераторы и ссылки не затронуты (относится к insert_after
) [23.3.4.5/1]array
: (n / a) Ассоциативные контейнеры
[multi]{set,map}
: все итераторы и ссылки не затронуты [23.2.4 / 9] Несортированные ассоциативные контейнеры
unordered_[multi]{set,map}
: все итераторы недействительны при повторном обращении, но ссылки не затрагиваются [23.2.5 / 8]. Повторное воспроизведение не происходит, если вставка не приводит к тому, что размер контейнера превышает z * B
, где z
- максимальный коэффициент нагрузки, а B
- текущее количество ковшей. [23.2.5 / 14] Контейнерные адаптеры
stack
: унаследованы от базового контейнера queue
: унаследовано от базового контейнера priority_queue
: унаследовано от базового контейнера Контейнеры последовательности
vector
: каждый итератор и ссылка на или после точки стирания недействительны [23.3.6.5/3]deque
: удаление последнего элемента делает недействительными только итераторы и ссылки на стертые элементы и итератор прошедшего конца; стирание первого элемента аннулирует только итераторы и ссылки на стертые элементы; стирание любых других элементов делает недействительными все итераторы и ссылки (включая итератор с последним концом) [23.3.3.4/4]list
: только итераторы и ссылки на стертый элемент недействительны [23.3 .5.4 / 3] forward_list
: только итераторы и ссылки на стертый элемент недействительны (применяется к erase_after
) [23.3.4.5/1]array
: (n / a) Ассоциативные контейнеры
[multi]{set,map}
: только итераторы и ссылки на стертые элементы недействительны [23.2.4 / 9] Неупорядоченные ассоциативные контейнеры
unordered_[multi]{set,map}
: только итераторы и ссылки на стертые элементы недействительны [23.2.5 / 13] Контейнерные адаптеры
stack
: унаследовано от базового контейнера queue
: унаследовано от базового контейнера priority_queue
: унаследовано от базового контейнера vector
: согласно вставке / стиранию [23.3.6.5/12]deque
: согласно вставке / стиранию [23.3.3.3/3]list
: согласно вставке / стиранию [23.3.5.3 / 1] forward_list
: согласно вставке / стиранию [23.3.4.5/25]array
: (n / a) Если не указано иное (явно или путем определения функции в терминах других функций), вызывая функцию-член контейнера или передавая контейнер в качестве аргумента для библиотечная функция не должна аннулировать итераторы или изменять значения объектов в этом контейнере. [23.2.1 / 11]
blockquote>Примечание 2
Функцияno swap () делает недействительными любые ссылки, указатели или итераторы, ссылающиеся на элементы контейнеров меняются местами. [Примечание: Итератор end () не ссылается ни на какой элемент, поэтому он может быть недействительным. -End note] [23.2.1 / 10]
blockquote>Примечание 3
Кроме вышеописанной оговорки относительно
swap()
, , неясно, «конец» «итераторы подчиняются перечисленным выше правилам для каждого контейнера ; вы должны, во всяком случае, предположить, что они есть.Примечание 4
vector
и все неупорядоченные ассоциативные контейнеры поддерживаютreserve(n)
, что гарантирует отсутствие автоматического изменение размера будет происходить, по крайней мере, до тех пор, пока размер контейнера не увеличится доn
. Следует соблюдать осторожность с неупорядоченными ассоциативными контейнерами , поскольку в будущем предложение позволит указать минимальный коэффициент нагрузки, который позволит повторить операцию наinsert
после того, как достаточноerase
операций уменьшит размер контейнера ниже минимум; гарантия должна считаться потенциально недействительной послеerase
.
Возможно, стоит добавить, что итератор вставки любого типа (std::back_insert_iterator
, std::front_insert_iterator
, std::insert_iterator
) остается в силе до тех пор, пока все вставки выполняются через этот итератор и никакое другое событие, не выполняющее итератор .
Например, когда вы выполняете серию операций вставки в std::vector
с помощью std::insert_iterator
, вполне возможно, что вектор будет иметь событие перераспределения, что приведет к аннулированию всех итераторов, которые «точка» в этот вектор. Тем не менее, итератор вставки, о котором идет речь, гарантированно остается в силе, т. Е. Вы можете безопасно продолжить последовательность вставок. Нет необходимости беспокоиться о запуске перераспределения вектора вообще.
Это опять же относится только к вставкам, выполненным через сам итератор вставки. Если итератор-недействительное событие инициируется некоторым независимым действием на контейнер, то итератор вставки также становится недействительным также в соответствии с общими правилами.
Например, этот код
std::vector<int> v(10);
std::vector<int>::iterator it = v.begin() + 5;
std::insert_iterator<std::vector<int> > it_ins(v, it);
for (unsigned n = 20; n > 0; --n)
*it_ins++ = rand();
гарантированно выполняет действительную последовательность вложений в вектор, даже если вектор «решает» перераспределить где-то посередине этого процесса.
Поскольку этот вопрос привлекает так много голосов, и это становится часто задаваемым вопросом, я думаю, было бы лучше написать отдельный ответ, чтобы упомянуть одно существенное различие между C ++ 03 и C ++ 11 относительно влияния std::vector
вставка в действительность для итераторов и ссылок по отношению к reserve()
и capacity()
, которые не удалось заметить в большинстве рассмотренных ответов.
C ++ 03:
Reallocation делает недействительными все ссылки, указатели и итераторы, ссылающиеся на элементы в последовательности. Гарантируется, что перераспределение не происходит во время вставок, которые происходят после вызова функции reserve (), до тех пор, пока вставка не сделает размер вектора большим, чем размер, указанный в последнем вызове reserve ().
blockquote>C ++ 11:
Reallocation делает недействительными все ссылки, указатели и итераторы, ссылающиеся на элементы в последовательности. Гарантируется, что перераспределение не происходит во время вставок, которые происходят после вызова резервирования (), до момента, когда вставка сделает размер вектора большим, чем значение емкости ().
blockquote>Итак, в C ++ 03 это не «
unless the new container size is greater than the previous capacity (in which case all iterators and references are invalidated)
», как упоминалось в другом ответе, вместо этого оно должно быть «greater than the size specified in the most recent call to reserve()
». Это одно, что C ++ 03 отличается от C ++ 11. В C ++ 03, когдаinsert()
приводит к тому, что размер вектора достигает значения, указанного в предыдущемreserve()
вызове (который может быть меньше текущегоcapacity()
, посколькуreserve()
может привести к большемуcapacity()
, чем просили), любой последующийinsert()
может привести к перераспределению и аннулированию всех итераторов и ссылок. В C ++ 11 этого не произойдет, и вы всегда можете доверятьcapacity()
с уверенностью знать, что следующее перераспределение не произойдет до того, как размер превыситcapacity()
.В заключение, если вы работаете с вектором C ++ 03, и вы хотите удостовериться, что перераспределение не произойдет при выполнении вставки, это значение аргумента, который вы ранее передали
reserve()
, чтобы вы проверяли размер, а не возвращаемое значение вызоваcapacity()
, в противном случае вы можете удивиться «перераспределению досрочного ».
swap()
, каковы правила действительности итератора при копировании / перемещении? – goodbyeera 8 March 2014 в 04:35std::basic_string
, похоже, не считается контейнером и, конечно, не является контейнером в разделе стандарта, к которому относится примечание. Тем не менее, где говорится, что SSO запрещен (я знаю, что COW)? – Deduplicator 10 September 2014 в 22:35