向量容量即使保留也显示为0

时间:2019-06-03 11:57:42

标签: c++ vector

我有一个类,该类具有一个向量作为成员变量之一。在构造函数中,保留了向量容量(类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 个答案:

答案 0 :(得分:9)

这里

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

进行复制。 v实际上不是引用,因此即使您返回一个引用,它也必须进行复制。因为它是副本,所以不需要那么多的保留空间。如果实际上是这样获得参考,则:

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

两次输出均为32

答案 1 :(得分:7)

v之后的副本初始化 vector<uint32_t> v = test->getV();test->getV()值副本

C ++标准不需要在复制初始化之后复制源向量的容量,因此,v的容量可以是任何大于或等于该容量的值元素的数量。