C ++ - 覆盖/重建整个std :: vector的最佳实践

时间:2016-02-08 06:00:44

标签: c++ vector constructor clear

如果我有一个std :: vector,我想完全覆盖(不只是调整大小)。在内存管理方面,最安全的方法是什么?例如

$(".subscribe1").click(function(){
    var t1 = document.getElementById("email").value;
    var t2 = document.getElementById("password").value;
    var t3 = document.getElementById("confirmpassword").value;
    var companyname = document.getElementById("companyname").value;
        var address = document.getElementById("address").value;
        var city = document.getElementById("city").value;
        var pincode = document.getElementById("pincode").value;
        var country = document.getElementById("country").value;
        var sname = document.getElementById("sname").value;
        var sid = document.getElementById("sid").value;
        var saddr = document.getElementById("saddr").value;
        var scity = document.getElementById("scity").value;
        var spincode = document.getElementById("spincode").value;
        var scountry = document.getElementById("scountry").value;
        var s;
        s = (t1.replace('.', ','));
console.log(s);
        var ref = new Firebase("https://sampleapp.firebaseio.com/");
        var account = ref.child(s+"/master_account");
        account.push({"email": t1 , "password": t2});
        var cmp = ref.child(s+"/company_details");
        cmp.push({"email": t1, "company_name": companyname , "address": address, "city": city, "pincode": pincode, "country": country});
       var store = ref.child(s+"/store_location");
        store.push({"email": t1, "store_name": sname , "store_id" :sid , "address": saddr, "city": scity, "pincode": spincode, "country": scountry});
});

将创建一个值为5.0的5个浮点数的向量。然后它将使用值为6.0的大小为6的向量覆盖它,然后使用值为4.0的大小为4的向量进行覆盖。如果我无限次地执行此类操作,是否存在使用此方法破坏或泄漏内存的风险?我应该在每次覆盖之前使用int main() { std::vector<float> X (5, 5.0); X = std::vector<float> (6, 6.0); X = std::vector<float> (4, 4.0); } 吗?有没有更有效的方法来实现这一目标?

我确定这个问题已被多次询问,但Google并没有提出我正在寻找的确切方案。

谢谢!

2 个答案:

答案 0 :(得分:5)

std::vector具有特定的成员函数来完成此操作。分配器和复制/移开,vector的{​​{3}}中的每一个constructors都有相应的assign重载。因此,如果您想重用vector的存储空间,只需使用它:

std::vector<float> X (5, 5.0);
X.assign(6, 6.0);
X.assign(4, 4.0);

当然,没有保证 vector实现不会重新分配内存。但是,这将是一个非常愚蠢的实现。

答案 1 :(得分:2)

  用这种方法存在破坏或泄漏记忆的风险吗?

不。

  

我应该在每次覆盖之前使用clear()吗?

没有必要。

  

有没有更有效的方法来实现这一目标?

这在很大程度上取决于你不断更换矢量的模式。在您当前的代码中,分配了一个新的向量,然后取消分配旧的向量,并且每次都将新的向量移动到X

分配和解除分配是昂贵的操作。将循环遍历向量并更改每个已存在的元素和/或将新元素推入现有向量可能是更好的主意。沿着:

std::vector<float> X (5, 5.0);

std::transform(begin(X), end(X), begin(X), [](int){ return 6.0; }); 
X.resize(6, 6.0);

std::transform(begin(X), end(X), begin(X), [](int){ return 4.0; }); 
X.resize(4);

如果元素数量很高且对象不是简单的整数,这可能会导致代码变慢。

检查出来的最好方法是实际编写两个版本并对它们进行基准测试。