在将其尺寸较大的向量移动到容量较小的向量之前,是否可以通过使用Reserve()来提高代码性能
Is it possible to improve code performance by using reserve() before moving a vector with a bigger size into a vector with a smaller capacity?
对不起,如果这个问题非常不完整,不清楚或重复(这是我的第一个问题(。在研究"移动语义"并为我的OOP课程进行小型项目时,我偶然发现了一个我无法回答自己的问题。据我所知,std :: move((通过将l值转换为r值来起作用,但是让我们假设我们正在将带有很多元素的向量移动到具有1.的第二个矢量。我可以使用储备金(我可以使用储备金(( 避免 第二个向量的大量自动内存重新分配或使用Reserve((是否由于std :: move((将R值移动到第二个向量而没有效果?可以在下面找到我问题的简单实现。
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> first (1000000);
std::vector<int> second (1);
std::fill(first.begin(),first.end(),7);
second.reserve(1000000);//is this needed??
second=std::move(first);
return 0;
}
不,这是不需要的,几乎可以肯定是过早的优化。
矢量确实可以由3个指针(或两个指针和一个偏移量,一个指针和两个指针和两个偏移...但是这些都不常见,所以对于我的其余解释,我会想象向量是由三个指针代表(。
- 一个指针指向它管理的内存的开始。
- 一个指针指向已插入的项目的一端。
- 一个指针指向它管理的内存的一端。
可以通过将这三个指针从 b
中获取,将它们设置为易于制造的值(例如,nullptr
作为前哨值,含义"我是空"(,然后一切都会实现移动构造函数std::vector<int> a = std::move(b);
。完成。
实际上,这就是gcc
这样做的方式(以及大多数标准库实现...但是我有gcc
源方便(。请参阅此处。
因此,您的reserve
调用充其量是由编译器优化为NO-OP的,并且最坏的情况正在导致不必要的内存分配。不好!
请看一下这篇文章:stl vector:移动向量的所有元素
std::move()
是O(1)
解决方案。当您在向量上使用ITH时,移动的向量现在为空,而新的矢量具有移动一个元素。在这种情况下,reserve()
方法将没有任何作用(但在其他情况下非常有用(。
您可以使用std::swap()
方法,这也是一种不需要使用reserve()
方法的方法。
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 迭代时从向量和内存中删除对象
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 在将其尺寸较大的向量移动到容量较小的向量之前,是否可以通过使用Reserve()来提高代码性能
- 向量.reserve()和分配效率(C )
- 向量的reserve()的奇异性
- 在向量引用上调用 vector::reserve()
- 空向量上的reserve与deque的时间复杂度,以及是使用template还是push_back
- 向量resize(), push.back(), reserve()方法