Я просмотрел документацию, но не мог найти определенный ответ. Действительно ли это является зависящим от реализации?
Все, что вам гарантировано, это то, что:
Так что, сколько дополнительных или маленьких ресурсов хочет разместить реализация, зависит от реализации. Я думаю, что при копировании большинство будет делать так, чтобы емкость соответствовала размеру, но это не может уменьшить емкость. (Из-за пункта 2 выше; перераспределение, пока есть достаточно места, не допускается.)
* В основном. См. Комментарии Чарльза ниже.
Изменяет ли vector :: operator = емкость вектора? Если да, то как?
Это может изменить емкость. Это происходит только в том случае, если предыдущая емкость была слишком мала для нового размера. Если это так, новая емкость, по крайней мере, равна новому размеру, но может иметь большее значение.
Конструктор копирования копирует емкость?
Согласно таблице 65 Требования к контейнеру в C ++ 03, X u (a);
и X u = a;
эквивалентны к X u; u = a;
. Это делает копию ctor идентичной случаю op = после построения вектора по умолчанию.
Это зависит от реализации. Большинство на практике сжимают векторы до минимального размера.
Как я уже писал ранее, копировать не нужно - и обычно НЕ - сохранить емкость исходного вектора.
gcc version 4.1.1
$ cat vt.cpp
#include <vector>
#include <iostream>
int main() {
std::vector<int> v1;
v1.reserve(50000);
std::vector<int> v2 = v1;
std::cout << v1.capacity() << std::endl;
std::cout << v2.capacity() << std::endl;
return 0;
}
$ g++ vt.cpp -o vt && ./vt
50000
0
$ cat v2.cpp
#include <vector>
#include <iostream>
int main() {
std::vector<int> v1;
v1.reserve(50000);
std::vector<int> v2;
v2 = v1;
std::cout << v1.capacity() << std::endl;
std::cout << v2.capacity() << std::endl;
return 0;
}
$ g++ v2.cpp -o v2 && ./v2
50000
0