емкость вектора показывает 0, даже если она зарезервирована - PullRequest
6 голосов
/ 03 июня 2019

У меня есть класс, в котором вектор является одной из переменных-членов. Внутри конструктора зарезервирована емкость вектора (класс VecUser использует объект Test):

class Test {
public:  
  Test(uint32_t size) {
    this->v.reserve(size);
    std::cout << v.capacity() << std::endl; // this prints 'size'
  }
  vector<uint32_t>& getV() { return v; }
private:
  vector<uint32_t> v;
};

class VecUser {
public:
  VecUser() {}
private:
  void func() {
    Test* test = new Test(32); // This prints '32' 

    vector<uint32_t> v = test->getV();
    std::cout << v.capacity() << std::endl; // This prints '0'
  }
};

Я думаю, что cout в функции func() должен печатать '32', а не '0'.

Но, после запуска, он печатает 0.

Почему зарезервированный вектор показывает, что его емкость равна 0?

Ответы [ 2 ]

9 голосов
/ 03 июня 2019

Это здесь

vector<uint32_t> v = test->getV();

Делает копию.v на самом деле не является ссылкой, поэтому, даже если вы ее вернете, она все равно должна сделать копию.Поскольку это копия, ей не нужно столько же зарезервированного пространства.Если вы на самом деле получаете ссылку вместо этого, как это:

vector<uint32_t> &v = test->getV();

Выходные данные 32 оба раза.

7 голосов
/ 03 июня 2019

Инициализированная копия v после vector<uint32_t> v = test->getV(); является копией значения из test->getV().

Стандарт C ++ не требует копированияемкость исходного вектора после копирования инициализации , поэтому допустимой емкостью v может быть любое значение при условии, что оно больше или равно количеству элементов.

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