C++ STL基本容器比较

原创 2011年01月24日 17:44:00
在STL中基本容器有: string、vector、list、deque、set、map

set 和map都是无序的保存元素,只能通过它提供的接口对里面的元素进行访问

set:集合, 用来判断某一个元素是不是在一个组里面,使用的比较少
map:映射,相当于字典,把一个值映射成另一个值,如果想创建字典的话使用它好了

string、vector、list、deque、set 是有序容器
1.string

string 是basic_string<char> 的实现,在内存中是连续存放的.为了提高效率,都会有保留内存,如string s= "abcd",这时s使用的空间可能就是255, 当string再次往s里面添加内容时不会再次分配内存.直到内容>255时才会再次申请内存,因此提高了它的性能.
当内容>255时,string会先分配一个新内存,然后再把内容复制过去,再复制先前的内容.

对string的操作,如果是添加到最后时,一般不需要分配内存,所以性能最快;
如果是对中间或是开始部分操作,如往那里添加元素或是删除元素,或是代替元素,这时需要进行内存复制,性能会降低.

如果删除元素,string一般不会释放它已经分配的内存,为了是下次使用时可以更高效.

由于string会有预保留内存,所以如果大量使用的话,会有内存浪费,这点需要考虑.还有就是删除元素时不释放过多的内存,这也要考虑.

string中内存是在堆中分配的,所以串的长度可以很大,而char[]是在栈中分配的,长度受到可使用的最大栈长度限制.

如果对知道要使用的字符串的最大长度,那么可以使用普通的char[],实现而不必使用string.
string用在串长度不可知的情况或是变化很大的情况.

如果string已经经历了多次添加删除,现在的尺寸比最大的尺寸要小很多,想减少string使用的大小,可以使用:
string s = "abcdefg";
string y(s); // 因为再次分配内存时,y只会分配与s中内容大一点的内存,所以浪费不会很大
s.swap(y); // 减少s使用的内存

如果内存够多的话就不用考虑这个了
capacity是查看现在使用内存的函数
大家可以试试看string分配一个一串后的capacity返回值,还有其它操作后的返回值

2.vector

vector就是动态数组.它也是在堆中分配内存,元素连续存放,有保留内存,如果减少大小后内存也不会释放.如果新值>当前大小时才会再分配内存
对最后元素操作最快(在后面添加删除最快 ), 此时一般不需要移动内存,只有保留内存不够时才需要
对中间和开始处进行添加删除元素操作需要移动内存,如果你的元素是结构或是类,那么移动的同时还会进行构造和析构操作,所以性能不高.
访问方面,对任何元素的访问都是O(1),也就是是常数的,所以vector常用来保存需要经常进行随机访问的内容,并且不需要经常对中间元素进行添加删除操作.

相比较可以看到vector的属性与string差不多,同样可以使用capacity看当前保留的内存,使用swap来减少它使用的内存.

总结
需要经常随机访问请用vector
3.list

list就是链表,元素也是在堆中存放,每个元素都是放在一块内存中
list没有空间预留习惯,所以每分配一个元素都会从内存中分配,每删除一个元素都会释放它占用的内存,这与上面不同,可要看好了

list在哪里添加删除元素性能都很高,不需要移动内存,当然也不需要对每个元素都进行构造与析构了,所以常用来做随机操作容器.
但是访问list里面的元素时就开始和最后访问最快
访问其它元素都是O(n) ,所以如果需要经常随机访问的话,还是使用其它的好

总结
如果你喜欢经常添加删除大对象的话,那么请使用list
要保存的对象不大,构造与析构操作不复杂,那么可以使用vector代替
list<指针>完全是性能最低的做法,这种情况下还是使用vector<指针>好,因为指针没有构造与析构,也不占用很大内存
4.deque

双端队列,也是在堆中保存内容的.它的保存形式如下:

[堆1]
...
[堆2]
...
[堆3]

每个堆保存好几个元素,然后堆和堆之间有指针指向,看起来像是list和vector的结合品,不过确实也是如此
deque可以让你在前面快速地添加删除元素,或是在后面快速地添加删除元素,然后还可以有比较高的随机访问速度

vector是可以快速地在最后添加删除元素,并可以快速地访问任意元素
list是可以快速地在所有地方添加删除元素,但是只能快速地访问最开始与最后的元素
deque在开始和最后添加元素都一样快,并提供了随机访问方法,像vector一样使用[]访问任意元素,但是随机访问速度比不上vector快,因为它要内部处理堆跳转
deque也有保留空间.另外,由于deque不要求连续空间,所以可以保存的元素比vector更大,这点也要注意一下.还有就是在前面和后面添加元素时都不需要移动其它块的元素,所以性能也很高

c++ stl容器的一些比较

一、STL容器类         STL(Standard Template Library)的六大组件:容器(containers)、迭代器(iterators)、空间配置器(allocator)...
  • gaofd
  • gaofd
  • 2016年07月04日 10:28
  • 1292

【容器】STL之效率比较

1、vector 变长一维数组,连续存放的内存块,有保留内存,堆中分配内存; 支持[]操作,高效率的随机访问; 在最后增加元素时,一般不需要分配内存空间,速度快;在中间或...
  • u012370255
  • u012370255
  • 2014年10月28日 16:05
  • 1228

C++容器类和Qt容器类的对比

C++中容器类是属于标准模板库中的内容,有必要回顾下标准模板库。STL = Standard Template Library,标准模板库,惠普实验室开发的一系列软件的统称。从根本上说,STL是一些“...
  • u011822862
  • u011822862
  • 2015年06月05日 15:16
  • 2077

C++ STL基本容器比较

在STL中基本容器有: string、vector、list、deque、set、map set 和map都是无序的保存元素,只能通过它提供的接口对里面的元素进行访问 set:集合, 用来...
  • einstein991225
  • einstein991225
  • 2012年09月25日 13:13
  • 374

C++STL容器的基本操作

在初学阶段希望能够对容器基本操作的记忆和熟练使用,需要对各种容器进行归纳总结。 首先,C++中有两种类型的容器:顺序容器和关联容器。顺序容器主要有vector、list、deque等。 其...
  • tbl1234567
  • tbl1234567
  • 2016年09月11日 09:38
  • 130

c++ stl容器vector删除(erase),遍历等基本用法介绍及头文件

Vectors 包含着一系列连续存储的元素,其行为和数组类似。访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线...
  • Xwxcy
  • Xwxcy
  • 2016年01月21日 16:59
  • 796

c++ stl容器vector删除(erase),遍历等基本用法介绍及头文件

本文导语:  Vectors 包含着一系列连续存储的元素,其行为和数组类似。访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector...
  • qq_37360631
  • qq_37360631
  • 2017年08月03日 17:38
  • 227

C++ STL 基本容器使用

C++ STL 基本容器使用 一、STL简介 STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序(C++ S...
  • qq_34264472
  • qq_34264472
  • 2016年11月02日 19:32
  • 210

1.C++ STL基本容器的使用(转载)

文章转自conanswp的博客:http://blog.csdn.net/conanswp/article/details/23297441 C++中有两种类型的容器:顺序容器和关联容器。顺序容器...
  • xushaozhang
  • xushaozhang
  • 2016年07月09日 16:21
  • 280

c++中的STL基本容器介绍

在STL中基本容器有: string、vector、list、deque、set、map   set和map都是无序的保存元素,只能通过它提供的接口对里面的元素进行访问 set:集合, 用来判断...
  • ghevinn
  • ghevinn
  • 2013年02月19日 12:41
  • 735
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ STL基本容器比较
举报原因:
原因补充:

(最多只允许输入30个字)