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.
#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(<_now_time);
local_time=localtime(<_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[])
{
vector<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);
vector<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;
}
(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(<_now_time);
local_time=localtime(<_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;
}
分享到:
相关推荐
STL中vector、list、deque和map的区别
vector list map pair stl 标准模板库 c++ 程序示例
经典讲解List和ArrayList和Vector和HashTable和HashMap区别
在vector和list中插入数据 在vector和list中插入数据 在vector和list中插入数据
List、ArrayList、Vector及map、HashTable、HashMap分别的区别
区别和联系-list-map-set-vector
Java中List、ArrayList、Vector及map、HashTable、HashMap分别的区别.
其中包含3个例子 vector list 还一个是vector 对象 是一个指针 程序结束要释放内存 其中 vector 和 list 都介绍了 find 函数的使用 find 的 内容 是一个结构 或者 类。 如果是结构体的话 要重载 == 这是使用时要注意...
c++容器list、vector、map、set区别 list 封装链表,以链表形式实现,不支持[]运算符。 对随机访问的速度很慢(需要遍历整个链表),插入数据很快(不需要拷贝和移动数据,只需改变指针的指向)。 新添加的元素,...
C++STL vector list map set dqueue 等应用举例及PPT讲解示例,代码演示
在大家还没有了解vector,list,deque的知识之前,我先给大家介绍下stl,本文重点给大家介绍vector和list的区别及使用,感兴趣的的朋友一起看看吧
list和vector的区别共1页.pdf.zip
更为精炼的总结:Collection 是对象集合, Collection 有两个子接口 List 和 SetList 可以通过下标 (1,2..) 来取得值,值
模拟实现string,vector,list(双向链表)问题反思
STL学习,总结了map、vector、list的简单操作
测试vector list的各种常用函数,初学者可以下下,有什么问题 在我的博文里留言,那里有具体的分析
list 类 vector 练练手,好东西
STL讲义,其中包含部分有: vector list map,还有一些例子
List、ArrayList、Vector及map、HashTable、HashMap的区别与用法 使用容器排序 Vector由于使用了synchronized方法(线程安全)