Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;-覆盖/重建整个std::vector的最佳实践_C++_Vector_Constructor - Fatal编程技术网

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

C++ C++;-覆盖/重建整个std::vector的最佳实践,c++,vector,constructor,C++,Vector,Constructor,如果我有一个std::vector,我想完全覆盖它(而不仅仅是调整大小)。在内存管理方面,最安全的方法是什么?比如说 int main() { std::vector<float> X (5, 5.0); X = std::vector<float> (6, 6.0); X = std::vector<float> (4, 4.0); } intmain(){ 标准:向量X(5,5.0); X=std::vector(6,6.0);

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

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

我相信这个问题已经被问过很多次了,但谷歌并没有给出我想要的确切情况

谢谢

使用这种方法是否存在损坏或泄漏内存的风险

没有

每次覆盖之前是否应该使用
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);
标准向量X(5,5.0); 转换(begin(X),end(X),begin(X),[](int){return 6.0;}); X.调整大小(6,6.0); std::transform(begin(X)、end(X)、begin(X),[](int){return 4.0;}); X.4(4); 如果元素的数量较多且对象不是简单整数,则这可能导致代码速度较慢


检查这一点的最佳方法是实际编写这两个版本并对其进行基准测试。

std::vector
有专门的成员函数来实现这一点。分配器和复制/移到一边,每个向量都有一个相应的重载,它做同样的事情。因此,如果要重用
向量的存储,只需使用它:

std::vector<float> X (5, 5.0);
X.assign(6, 6.0);
X.assign(4, 4.0);
标准向量X(5,5.0); X.分配(6,6.0); X.分配(4,4.0);

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

相关阅读:。是的,你很可能会导致泄漏,但由于它们在堆栈上,这可能无关紧要。从来没有任何安全问题,向量不会泄漏内存。谢谢你提供的信息。今后,我将尽量避免不必要的分配/取消分配