我有一个类,该类具有一个向量作为成员变量之一。在构造函数中,保留了向量容量(类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?
答案 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
的容量可以是任何大于或等于该容量的值元素的数量。