Подтвердить что ты не робот

Емкость скопирована в вектор?

Возьмите следующий код:

std::vector<int> a;
a.reserve(65536);
std::vector<int> b(a);  //NOTE: b is constructed from a

a.reserve(65536); // no reallocation
b.reserve(65536);

Скопирована ли емкость? Будет ли перераспределение на последней строке? Знает ли стандарт об этом или молчит?

4b9b3361

Ответ 1

Скопирована ли емкость?

На практике нет. Я тестировал его онлайн в Clang и GCC, а также MSVC и никто из них не копирует емкость.

Будет ли перераспределение на последней строке?

Если емкость меньше аргумента резерва (т.е. он не копируется), то да.

Говорит ли стандарт об этом или молчит?

Никакие определения для конструктора копирования не представлены в vector.cons. Вместо этого мы должны посмотреть container.requirements

X обозначает класс контейнера, содержащий объекты типа T, a и b обозначают значения типа X, u обозначает идентификатор, r обозначает неконстантное значение типа X, а rv обозначает неконстантное значение r введите X.

X u(a)

X u = a;

Требуется: T - CopyInsertable в X (см. ниже).

post: u == a

Теперь, что означает, что для двух контейнеров равны?

a == b

== - отношение эквивалентности. equal(a.begin(), a.end(), b.begin(), b.end())

Другими словами, поскольку для сравнения не требуется capacity, то нет причин копировать capacity.

Ответ 2

Нет, емкость не гарантируется сохранением конструкции копирования vector.

Вы можете сделать это следующим образом:

vector<int> b;
b.reserve( a.capacity() );
b = a;

Лучше инкапсулировано в функцию.

Ответ 3

Стандарт ничего не говорит о сохранении емкости при вызове конструктора копирования. Поэтому у вас нет никаких гарантий.

Но вы можете сделать следующий трюк, который заменяет состояние a и b, если вам нужно сохранить емкость только в копии:

 std::vector<int> a;
 a.reserve(65536);
 std::vector<int> b(a);
 b.swap(a); // now b has a state
 assert(b.capacity() == 65536); 

Ответ 4

Ну, простая проверка, как показано ниже, показывает, что емкость не копируется:

std::vector<int> a;
a.reserve(65536);
cout << "a.capacity is " << a.capacity() << endl; // prints 65536

std::vector<int> b(a);  //NOTE: b is constructed from a
cout << "b.capacity is " << b.capacity() << endl; // prints 0

Я считаю, что при копировании вектора a в b емкость b устанавливается в размере a в большинстве компиляторов; хотя это не гарантируется.