std :: vector емкость после копирования - PullRequest
12 голосов
/ 18 апреля 2010
  • Изменится ли vector :: operator = емкость вектора? Если да, то как?
  • Копирует ли векторный конструктор копирования емкость?

Я просмотрел документацию, но не смог найти конкретный ответ. Это зависит от реализации?

Ответы [ 4 ]

8 голосов
/ 18 апреля 2010

Все, что вам гарантировано, это:

  1. Вектор обладает достаточной емкостью для хранения своих элементов. (Очевидно.)
  2. Вектор не получит новую емкость, пока его текущая емкость не заполнится. *

Итак, насколько много или мало хочет реализовать реализация, зависит от реализации. Я думаю, что большинство будет делать размер соответствия емкости при копировании, но это не может снизить емкость. (Из-за номера 2 выше; перераспределение, когда места достаточно, не разрешено.)

* В основном. См. Комментарии Чарльза ниже.

2 голосов
/ 18 апреля 2010

Изменится ли vector :: operator = емкость вектора? Если да, то как?

Это может изменить емкость. Это происходит только в том случае, если предыдущая емкость была слишком мала, чтобы вместить новый размер. Если это так, новая емкость по крайней мере равна новому размеру, но может иметь большее значение.

Копирует ли конструктор копирования емкость?

Согласно Таблице 65 Требования к контейнерам в C ++ 03, X u (a); и X u = a; эквивалентны X u; u = a;. Это делает копию ctor идентичной регистру op = после построения вектора по умолчанию.

1 голос
/ 18 апреля 2010

Как я уже писал ранее, копия не должна - и, как правило, НЕ - сохраняет емкость исходного вектора.

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
0 голосов
/ 18 апреля 2010

Это зависит от реализации. Большинство на практике сокращают векторы до минимального размера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...