如何以优化的方式来使用Vector

如何以优化的方式来使用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了六次 是因为 有两次扩容

知道原因了 所以如何去优化

  1. 先告诉 初始需要多大
  2. 传递的时候的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*******
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值