Ответ 1
В соответствии с рабочим проектом января 2012 года
В рабочем проекте января 2012 года содержатся стандартные версии С++ 11 плюс незначительные редакционные изменения.
Для vector
:
void resize(size_type sz);
E ff ects: Еслиsz <= size()
, эквивалентноerase(begin() + sz, end());
. Еслиsize() < sz
, добавляетsz - size()
значения-инициализированные элементы последовательности.
vector::erase
не указывается порядок удаления. Я ожидаю, что он будет в порядке от begin() + sz
до end()
, потому что это имеет смысл для меня, но это только мое ожидание. Я не могу найти ничего об этом в стандарте.
Реализация vector
, распространяемая вместе с Visual Studio 2013, действительно стирается в этом порядке, как и MinGW g++ 4.8.1, а также g++ 4.7.3 (не MinGW). Это компиляторы, к которым у меня есть легкий доступ.
В том же стандарте для list
:
void resize(size_type sz);
1 E ff ects: Еслиsize() < sz
, добавляетsz - size()
значения-инициализированные элементы в последовательность. Еслиsz <= size()
, эквивалентное
list<T>::iterator it = begin();
advance(it, sz);
erase(it, end());
и
void resize(size_type sz, const T& c);
E ФФ ЕКТС:
if (sz > size())
insert(end(), sz-size(), c);
else if (sz < size()) {
iterator i = begin();
advance(i, sz);
erase(i, end());
}
else
; // do nothing
Затем далее указывается абсолютно ничего полезного о заказе для list::erase
.
Реализация list
, распространяемая с Visual Studio 2013, кажется, стирается в обратном порядке, в то время как MinGW g++ 4.8.1 и g++ 4.7.3 (не MinGW) этого не делают.
Основываясь на последнем рабочем черновике на момент написания
Для vector
void resize(size_type sz);
E ff ects: Еслиsz <= size()
, эквивалентно вызовуpop_back()
size() - sz
раз. Еслиsize() < sz
, добавляетsz - size()
вставленные по умолчанию элементы в последовательность.
Это означает, что элементы удаляются в обратном порядке.
Для list
:
void resize(size_type sz);
1 E ff ects: Еслиsize() < sz
, добавляетsz - size()
значения-инициализированные элементы в последовательность. Еслиsz <= size()
, эквивалентное
list<T>::iterator it = begin();
advance(it, sz);
erase(it, end());
и
void resize(size_type sz, const T& c);
E ФФ ЕКТС:
if (sz > size())
insert(end(), sz-size(), c);
else if (sz < size()) {
iterator i = begin();
advance(i, sz);
erase(i, end());
}
else
; // do nothing
Затем далее указывается абсолютно ничего полезного о заказе для list::erase
.
Для deque
стандарт определяет то же поведение, что и для vector
.