向量容量显示为0,即使已保留

sun*_*cho 6 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'
  }
};
Run Code Online (Sandbox Code Playgroud)

我认为,coutfunc()函数打印“32”,而不是“0”。

但是,运行它后,它显示0。

为什么保留向量显示其容量为0?

Bla*_*aze 9

这里

vector<uint32_t> v = test->getV();
Run Code Online (Sandbox Code Playgroud)

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

vector<uint32_t> &v = test->getV();
Run Code Online (Sandbox Code Playgroud)

输出是32两次。

  • @sungjuncho:绝对不是。那将是语言上令人震惊的重大变化。这是一个很好的答案。+1 .. (4认同)

Bat*_*eba 7

副本初始化 v下面vector<uint32_t> v = test->getV();是一个值复制test->getV()

C ++标准不需要在复制初始化复制源向量的容量,因此v,只要其大于或等于元素数,就可以将其容量设为任何值。

  • 确实,这是旧的“按比例缩小”技巧的基础(在我们使用过“ shrink_to_fit”之前,该方法也不具有约束力) (2认同)