您的位置:首页 > 其它

STL中容器的比较[转载]

2010-03-10 11:08 183 查看
在STL中基本容器有string vector list deque set map

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

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

string vector list deque set 是有序容器
string 是basic_string的实现,
在内存中是连续存放的为了提高效率,都会有保留内存,如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返回值还有其它操作后的返回值

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

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

总结:
需要经常随机访问请用vector

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

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

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

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

deque
双端队列

也是在堆中保存内容的

它的保存形式如下

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

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

看起来像是listvector的结合品不过确实也是如此

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

vector是可以快速的在最后添加删除元素并可以快速的访问任意元素
list是可以快速的在所有地方添加删除元素但是只能快速的访问最开始与最后的元素
deque在开始和最后添加元素都一样快并提供了随机访问方法像vector一样使用[]访问任意元素但是随机访问速度比不上vector快因为它要内部处理堆跳转
deque也有保留空间另外由于deque不要求连续空间所以可以保存的元素比vector更大这点也要注意一下还有就是在前面和后面添加元素时都不需要移动其它块的元素所以性能也很高
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: