如何以优化的方式来使用Vector
Vector 在内存不够的时候 需要扩展的时候
会声明一个更大的数组 然后 将旧位置的内容复制到新内存中的新位置
这就是代码缓慢 效率不高的原因
了解环境是优化最重要的事情
class Value
{
private:
float x, y, z;
public:
Value(float x,float y,float z):x(x),y(y),z(z)
{
}
Value(const Value& v)
{
cout << "copy" << endl;
}
};
vector<Value> v;
v.push_back(Value(1, 2, 3));
*****output*******
copy
// 为什么会这样 Value(1, 2, 3)实际上是在main的栈帧中构造的
// 然后方法Vector中 就会copy
vector<Value> v;
v.push_back(Value(1, 2, 3));
v.push_back(Value(4, 2, 3));
*****output*******
copy
copy
copy
// 明显看出 copy了三次 是因为 有一次扩容所以多copy了一次
vector<Value> v;
v.push_back(Value(1, 2, 3));
v.push_back(Value(4, 2, 3));
v.push_back(Value(4, 2, 3));
*****output*******
copy
copy
copy
copy
copy
copy
// 明显看出 copy了六次 是因为 有两次扩容
知道原因了 所以如何去优化
- 先告诉 初始需要多大
- 传递的时候的copy可以节约
vector<Value> v;
v.reserve(3);
v.push_back(Value(1, 2, 3));
v.push_back(Value(4, 2, 3));
v.push_back(Value(4, 2, 4));
*****output*******
copy
copy
copy
reserve的作用是设置存储 够用的内存 这样解决了第二个问题
vector<Value> v;
v.reserve(3);
v.push_back(Value(1, 2, 3));
v.push_back(Value(4, 2, 3));
v.push_back(Value(4, 2, 4));
v.push_back(Value(4, 3, 4));
*****output*******
copy
copy
copy
copy
copy
copy
copy
//可以看出超出初始的内存就会扩容 然后copy
emplace_back 解决了第一个问题 这样传递的是参数 他会在Vector内部进行构造而不是 main的scope里面构造 再copy
vector<Value> v;
v.reserve(3);
v.emplace_back(1, 2, 3);
v.emplace_back(4, 2, 3);
v.emplace_back(4, 2, 4);
*****output*******