станд.:: векторная способность после копирования

  • Действительно векторизовал:: оператор = изменяет векторную способность? Если так, как?
  • Конструктор копии вектора копирует способность?

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

14
задан Anycorn 18 April 2010 в 18:45
поделиться

4 ответа

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

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

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

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

9
ответ дан 1 December 2019 в 15:12
поделиться

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

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

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

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

2
ответ дан 1 December 2019 в 15:12
поделиться

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

-2
ответ дан 1 December 2019 в 15:12
поделиться

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

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
1
ответ дан 1 December 2019 в 15:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: