【发布时间】:2021-11-20 23:51:40
【问题描述】:
据我所知,std::vector 连续存储数据 当您尝试添加或删除一个元素时,它会通过分配新内存来增长或缩小,并将所有内容从旧内存复制到新内存中并删除旧内存
在下面的代码中,我有一个复制构造函数 它说每次复制课程时都复制 当我有 3 个元素时,它给了我 6 条复制的消息,这很好 但是当我添加另一个元素时,它给了我 7 条消息
不是应该给我10个吗? 以及如何优化它?
#include <iostream>
#include <vector>
struct Vertex
{
int x, y, z;
Vertex(int x, int y, int z) : x(x), y(y), z(z)
{
}
Vertex(const Vertex &vetrex) : x(vetrex.x), y(vetrex.y), z(vetrex.z)
{
std::cout << "Copied" << std::endl;
}
};
int main()
{
std::vector<Vertex> vertices;
vertices.push_back({1, 2, 3});
vertices.push_back({4, 5, 6});
vertices.push_back({7, 8, 9});
vertices.push_back({10, 11, 12});
}
【问题讨论】:
-
你能更详细地解释一下为什么你认为它应该是 10 吗?
-
@NathanPierson 10 = 1+2+3+4。看不到 10 的原因是向量使用几何增长而不是线性增长。
-
首先将第一个元素从主乐趣堆栈复制到向量堆栈的第 2 和第 3 个,因为它将第一个元素和第 2 个元素复制到新的分配第 4、第 5 和第 6 个因为它将做同样的事情,但对于 3 个元素,然后它应该将 4 个元素处理到新的内存中
-
@SobhyRzk 好的,是的,如果向量的容量为
N并添加了一个新元素,它只会为N+1元素保留空间。但正如@RaymondChen 指出的那样,容量增长不仅仅是线性的,所以实际上它根本不需要为第四个push_back重新分配和复制。 (确切的重新分配策略取决于实现。) -
vector将使用实施者想到的每一个技巧,并且可以证明有效减少所需的复制量。有时你会看到它做一些鬼鬼祟祟的事情,比如根本没有副本,因为它以一种或另一种方式注意到它已经拥有所需的所有存储空间。
标签: c++ c++11 visual-c++ c++17 c++14