我有一个具有向量作为成员变量之一的类。在构造函数中,向量容量是保留的(类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)
我认为,cout在func()函数打印“32”,而不是“0”。
但是,运行它后,它显示0。
为什么保留向量显示其容量为0?
这里
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两次。
该副本初始化 v下面vector<uint32_t> v = test->getV();是一个值复制的test->getV()。
C ++标准不需要在复制初始化后复制源向量的容量,因此v,只要其大于或等于元素数,就可以将其容量设为任何值。
| 归档时间: |
|
| 查看次数: |
152 次 |
| 最近记录: |