在添加元素的同时提高向量的效率
Making a vector more efficient while adding elements
我正在考虑提高矢量数据结构的效率。
假设它是针对某个通用数据类型T……那么在向向量添加新元素的同时,当前std::vector所做的是重新分配一个由n+1个元素组成的全新内存块。
我想做什么…
我写了一个小程序:
#include<iostream>
using namespace std;
int main ()
{
int *i,*j;
i=new int;
cout<<i;
delete i;
j=new int ;
cout<<j;
delete j;
return 0;
}
两个内存位置相同。。。
现在我想的是,首先我将为以下通用数据类型分配内存:
T *temp=new T;
现在将temp的内存地址与向量的最后一个元素的地址进行比较。。。。如果它们相差sizeof (T)
,那么我将在那里添加新元素。。。。否则就用std::vector
的方式……
因此,它降低了复制所有元素的成本。。。如果数据很大,那么这可能会产生显著的差异。。。。。。!!
请告诉我我是否在正确的轨道上。。。
我把你的想法理解为
如果
new
给我一个与MyVector
对象已经拥有的内存相邻的地址,我将只使用它而不重新分配。
是的,这在理论上确实可行。然而,在实践中,不可能获得这样一个连续的地址,因为分配器很可能会在它分配的块的开头存储一些内部数据(比如它的大小,或者指向下一个块的指针,或者其他什么(。
具体细节取决于标准库(以及事件操作系统(使用的分配器,但这里有一个典型行为的示例。您调用new T
,其中sizeof(T)
是16(例如(。operator new
在内部调用malloc
,后者调用操作系统的分配函数。该函数在地址X
处分配20个字节的内存。它在X
的前4个字节中存储"16",并将地址X + 4
返回给malloc
,CCD_12又将地址返回给CCD13,然后返回给您的应用程序。所以你不可能得到连续的内存。
相关文章:
- 计算排序向量的向量中唯一值的计数
- C++将向量的向量拆分为向量的N个子向量
- 讨论 - 创建矩阵时的数组与向量的向量 - 什么是最实用的选择
- 用向量的向量元素初始化向量的空向量
- 如何删除包含其他向量的向量?
- 什么是点向量的向量?
- 在 c++ 中将集合转换为向量和向量转换为字符串时出现运行时异常
- 如何在 c++ 中使用对向量的向量进行迭代?
- 指向指针排序向量的指针向量的 C++ 向量
- 使用某些用户输入向量[x]++增加向量的索引
- 的向量(具有向量的结构)
- 从向量的向量中删除向量的组合
- shared_ptr类的向量的向量初始化问题
- 整数对的向量转化为整数向量的向量
- 指针向量的向量的处理元素
- 如何创建一个包含三种不同类型的向量的向量
- 按第二列对向量的向量进行排序
- 抽象类向量的C++向量
- 循环向量的向量并附加到新向量
- 如何在C 中打印字符串向量的向量