gpt4 book ai didi

c++ - 使用 vector 对象与创建自己的对象相比的优势

转载 作者:行者123 更新时间:2023-11-30 02:50:58 25 4
gpt4 key购买 nike

这是我创建的用于存储随机数据量的数据类型。我已经测试了这个对象,它存储了数据并且能够接收它(我省略了接收数据的功能,因为我认为这与问题无关)

 class MyDynamicArrayV2
{

int* data;
int* tempArray;
int Position;
int Capacity;

void resize (int desiredSize)
{
delete data;
data = new int [desiredSize];
}

void copy (int* OrginalData,int* dataCopy, int OrginalData_length)
{
for (int i = 0; i < OrginalData_length; i++)
{
*(dataCopy+i) = *(OrginalData+i);
}
}

public :

MyDynamicArrayV2 ()
{
data = new int [2];
Position = 0;
Capacity = 2;
}

void AddData (double Num)
{
if ((Position+1)>Capacity)
{
tempArray = new int [(Capacity)+1]; //
copy(data,tempArray,Capacity); // Copy data to tempeoary storage
resize(Capacity*2);// Resizes the array
copy(tempArray,data,Capacity); // Restore data
Capacity= Capacity*2;
delete tempArray;
}


*(data+Position) = Num; // Allocates the data
Position++;

}

~MyDynamicArrayV2()
{
delete data;
}

};

然后我针对 Vector 和列表 Container 测试了 MyDynamicArray 对象,因为它们都能够接受随机数量的数据。我使用以下循环测试了速度,并使用任务管理器测试了内存使用情况。

     t1 = clock();
for (int i = 0 ; i <= 10000000; i++)
{
//MyDynamicArray.AddData(i);
//MyVector.push_back(i);
//Mylist.push_back(i);
}
t2 = clock();
double diff = (double)t2-(double)t1;
double seconds = diff/CLOCKS_PER_SEC;
cout << seconds;

结果。(MyArray:0.473 秒,64.6 MB。)(MyVector:3.595 秒,46.2 MB)(MyList:16.987 秒,537.8 MB(List 的用途是什么??))

所以我的问题是 Vector 类是如何编写的?与 vector 对象相比,为什么我的对象在分配数据方面更快。为什么 vector 对象使用的内存比我的对象少??您是否最好根据情况创建自己的数据类型??

旁注:我还测试了我的对象和 vector 对象访问数据的速度,但它们实际上是相同的,所以我没有添加此测试,如果有人认为它相关请发表评论,我会添加

最佳答案

对于初学者来说,您的代码肯定是错误的:您分配数组但释放对象!至少你需要使用 delete[] data; .针对 std::vector<double> 测试代码时在 MacOS 上使用 gcc 和 clang,std::vector<double>始终如一。

你编译优化了吗?使用 Debug模式编译通常具有欺骗性:因为 std::vector<T>是大量分解的模板代码,不内联代码是相当有害的。您的代码几乎不调用任何其他函数,即它不会受到例如函数调用开销的影响。因为它在调整数组大小时保持复制两次 std::vector<T>在那种情况下我希望复制/移动一次std::vector<T>更快(在优化编译时对我来说是这样)。

关于c++ - 使用 vector 对象与创建自己的对象相比的优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20025561/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com