STL中容器的比较

在STL中基本容器有[b]string vector list deque set map [/b]

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

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

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

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

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

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

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

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

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

如果内存够多的话就不用考虑这个了


[b]capacity[/b]是查看现在使用内存的函数大家可以试试看[b]string[/b]分配一个一串后的capacity返回值还有其它操作后的返回值

[b]vector [/b]
[b]vector[/b]就是动态数组它也是在堆中分配内存元素连续存放有保留内存如果减少大小后央存也不会释放如果新值.当前大小时才会再分配内存对最后元素操作最快(在后面添加删除最快) 此时一般不需要移动内存只有保留内存不够时才需要对中间和开始处进行添加删除元素操作需要移动内存如果你的元素是结构或是类那么移动的同时还会进行构造和析构操作所以性能不高

访问方面对任何元素的访问都是O(1) 也就是是常数的所以[b]vector[/b]常用来保存需要经常进行随机访问的内容并且不需要经常对中间元素进行添加删除操作
相比较可以看到vector的属性与string差不多同样可以使用capacity看当前保留的内存使用swap来减少它使用的内存
[b]
总结:[/b]需要经常随机访问请用[b]vector [/b]


[b]list [/b]
[b]list[/b]就是链表元素也是在堆中存放每个元素都是放在一块内存中

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

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

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

[b]deque [/b]
双端队列

也是在堆中保存内容的

它的保存形式如下

[堆1]
... ...
[堆2]
... ...
[堆三]

每个堆保存好几个元素然后堆和堆之间有指针指向

看起来像是[b]list[/b]和[b]vector[/b]的结合品不过确实也是如此

[b]deque[/b]的让你可以在前面快速的添加删除元素或是在后面快速的添加删除元素然后还可以比较高的随机访问速度

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值