vector与list的区别

来源:互联网 发布:淘宝藏族舞蹈头饰 编辑:程序博客网 时间:2024/05/16 06:04

http://blog.csdn.net/cancan8538/article/details/7246126


vector与list差异点与优缺点

(1)vector动态增长:不是随着每个元素的插入而自己增长的。预先存了一些存储区,使得实际分配的空间比当前所需的空间多一些,而list 表示非连续的内存区域,并通过一对指向首位元素的指针双向链接起来,因而可以两个方向进行遍历。

(2)当从vector末端删除元素的时候,性能与list差不多,当从前面或者中间删除元素的时候,list列表性能要好得多,原因是vector需要进行元素的移动。

(3)当要随机访问元素时,vector效率更高点。

 (4)对于小的基本数据类型,插入100000个元素,vector性能要好。

 (5)对于大的复合数据类型,比如类,插入100000个元素,list性能要好,因为vector需要重新分配内存,并且需要拷贝旧的内存区域,还必须调用拷贝构造函数与赋值构造函数。所以效率要低很多

(6)当插入大型数据类型时,用指针间接存储,性能会好很多

(7)已知需要存储的元素时,vector要好

(8)如果需要任意位置插入元素,list要好

 

验证代码

(1)vector插入200万数据,遍历满足某种条件时,进行删除,删除200万数据需要花费几十分种,提高方法为,找到第一个需要删除,和最后一个需要删除的元素(前提保证第一个需要删除与最后一个需要删除的中间是线性关系,也可以删除)。然后再进行删除。当数据量不大或者需要大量随机访问元素时,使用vector.

     

[cpp] view plain copy
  1. #include "stdafx.h"  
  2. #include<vector>  
  3. #include<list>  
  4. #include<string>  
  5. #include<iostream>  
  6. #include<time.h>  
  7.   
  8. using namespace std;  
  9.   
  10. typedef struct STU  
  11. {  
  12.     char name[100];  
  13.     int age;  
  14.     long mobilephone;  
  15. } STU;  
  16.   
  17.   
  18. char *GetCurrentTime(char *azp_CurrentTime)  
  19. {  
  20.   time_t lt_now_time;  
  21.   struct tm *local_time;  
  22.   time(<_now_time);  
  23.   local_time=localtime(<_now_time);  
  24.   
  25.   sprintf(azp_CurrentTime,"%d-%02d-%02d %02d:%02d:%02d",local_time->tm_year+1900,  
  26.     local_time->tm_mon+1,local_time->tm_mday,local_time->tm_hour,local_time->tm_min,local_time->tm_sec);  
  27.   return(azp_CurrentTime);  
  28. }  
  29.   
  30.   
  31. int main(int argc, char* argv[])  
  32. {  
  33.     vector<STU> v1;  
  34.     char beginTime[20]={0};  
  35.     char endTime[20]={0};  
  36.     STU a;  
  37.   
  38.     for (long i = 0;i < 2000000;i++)  
  39.     {  
  40.         strcpy(a.name,"test");  
  41.         a.age = 10;  
  42.         a.mobilephone = i;  
  43.         v1.push_back(a);  
  44.     }  
  45.   
  46.     GetCurrentTime(beginTime);  
  47.     printf("beginTime=%s\n",beginTime);  
  48.     vector<STU>::iterator iter = v1.begin();  
  49.      for(;iter != v1.end();)  
  50.      {  
  51.   
  52.          if (iter->mobilephone>=0)  
  53.          {  
  54.              iter = v1.erase(iter);  
  55.             // counts++;  
  56.              continue;  
  57.          }  
  58.            
  59.          ++iter;  
  60.      }  
  61.   
  62.   
  63.        
  64.     GetCurrentTime(endTime);  
  65.     printf("endTime=%s\n",endTime);  
  66.     printf("after clear v1 size=%ld",v1.size());  
  67.   
  68.     return 0;  
  69. }  

  (2)list插入200万数据,遍历满足某种条件时,进行删除,删除200万数据需要花费大约3秒钟。效率差距实在有点大!当需要遍历整个列表进行比较判断,而不是找某个具体的数据,并且需要定时删除时,应该使用list,比如重单判断。需求为当进行话单预处理时,需要进行重单判断,那么必须保留之前预处理的话单记录,直到超过保留时间才删除。这个时候每次预处理的时候,都要遍历该列表。根据重单条件进行判断。当超过保留时间时,需要删除话单超过保留时间的记录,如果这个时候采集vector,无疑会影响到批价时间,阻塞流程。

#include "stdafx.h"
#include<vector>
#include<list>
#include<string>
#include<iostream>
#include<time.h>

using namespace std;

typedef struct STU
{
 char name[100];
 int age;
    long mobilephone;
} STU;


char *GetCurrentTime(char *azp_CurrentTime)
{
  time_t lt_now_time;
  struct tm *local_time;
  time(&lt_now_time);
  local_time=localtime(&lt_now_time);

  sprintf(azp_CurrentTime,"%d-%02d-%02d %02d:%02d:%02d",local_time->tm_year+1900,
    local_time->tm_mon+1,local_time->tm_mday,local_time->tm_hour,local_time->tm_min,local_time->tm_sec);
  return(azp_CurrentTime);
}


int main(int argc, char* argv[])
{
 list<STU> v1;
    char beginTime[20]={0};
 char endTime[20]={0};
 STU a;

 for (long i = 0;i < 2000000;i++)
 {
     strcpy(a.name,"test");
  a.age = 10;
  a.mobilephone = i;
  v1.push_back(a);
 }

    GetCurrentTime(beginTime);
 printf("beginTime=%s\n",beginTime);
    list<STU>::iterator iter = v1.begin();
  for(;iter != v1.end();)
  {

   if (iter->mobilephone>0)
   {
       iter = v1.erase(iter);
   // counts++;
    continue;
   }
  
   ++iter;
  }


    
 GetCurrentTime(endTime);
 printf("endTime=%s\n",endTime);
 printf("after clear v1 size=%ld",v1.size());

 return 0;
}

0 0