如果我有一个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并没有提出我正在寻找的确切方案。
谢谢!
答案 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);
如果元素数量很高且对象不是简单的整数,这可能会导致代码变慢。
检查出来的最好方法是实际编写两个版本并对它们进行基准测试。