Стандартные требования C++11 к конструктору перемещения для std::vector
(Таблица 99 — Требования к контейнеру с поддержкой распределителя):
X(rv)
X u(rv)
- перемещение конструкции распределителя не должно выходить через исключение
- post: u должен иметь те же элементы, что и
rv
до этой конструкции; значение get_allocator()
должно быть таким же, как значение rv.get_allocator()
до этой конструкции.
- сложность: постоянная
Здесь нет требований/гарантий по емкости. Но мы можем сделать вывод, что постоянная сложность неявно отрицает любые перераспределения. И я не вижу никакой другой логической причины для изменения емкости, кроме перераспределения. Значит будет так же.
С другой точки зрения, если вектор move-from пуст, вполне законно просто игнорировать его и конструировать по умолчанию. Это по-прежнему будет O (1), так как не требует никаких конструкций для каждого элемента. (Спасибо Николу Боласу за эту проблему).
Также реализация, возможно, может уменьшить емкость до размера, используя параметр hint
функции std::allocator::allocate
:
pointer allocate(size_type, allocator<void>::const_pointer hint = 0);
Использование hint
не указано, но предназначено для помощи в определении местоположения, если этого требует реализация. Таким образом, какое-то сложное решение, возможно, может передавать указатель векторного хранилища как hint
и использовать для него realloc
для уменьшения емкости.
Вывод: похоже, что стандарт не гарантирует сохранения емкости при перемещении std::vector
, объем хранилища потенциально может уменьшиться.
person
Rost
schedule
29.10.2012