使用矢量对象而不是创建自己的优势

时间:2013-11-17 00:08:40

标签: c++ vector

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

 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测试了MyDynamicArray对象并列出了Container,因为这两者都能够接受随机数量的数据。我使用以下循环测试速度,并使用任务管理器测试内存使用情况。

     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对象相比,为什么我的Object在分配数据时更快。为什么vector对象使用的内存少于我的Object?你最好根据情况创建自己的数据类型吗?

旁注:我还测试了我的对象和矢量对象可以访问数据的速度,但它们几乎都是相同的所以我没有添加此测试,如果有人认为它是相关的请注释,我将添加它

1 个答案:

答案 0 :(得分:3)

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

您是否使用优化进行编译?使用调试模式编译通常非常具有欺骗性:因为std::vector<T>是重要的模板代码,而不是内联代码是非常有害的。您的代码几乎不会调用任何其他函数,即它不会受到例如函数调用开销的影响。由于在调整数组大小时它会继续复制两次,而std::vector<T>复制/移动一次只有一次,我希望std::vector<T>更快(在编译优化时适合我)。