`
com1com4
  • 浏览: 161555 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

[转]C++ STL基本容器string,vector,list,deque,map

阅读更多

在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就是动态数组.它也是在堆中分配内存,元素连续存放,有保留内存,如果减少大小后内存也不会释放.如果新值>当前大小时才会再分配内存 
对最后元素操作最快(在后面添加删除最快 ), 此时一般不需要移动内存,只有保留内存不够时才需要
对中间和开始处进行添加删除元素操作需要移动内存,如果你的元素是结构或是类,那么移动的同时还会进行构造和析构操作,所以性能不高 (最好将结构或类的指针放入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 vector list map set dqueue 等应用举例及PPT讲解示例,代码演示

    在这个主题中,我们将深入探讨vector、list、map、set和deque这五个主要的STL容器,并通过具体的例子和PPT讲解来理解它们的应用。 1. **vector**:vector是动态数组,它可以方便地在任何位置插入和删除元素,但主要...

    c++ STL思维导图(自己总结)

    本文将总结C++ STL中的主要容器和算法,包括vector、deque、list、set、map、queue、stack和string等。 Vector容器 Vector容器是C++ STL中最常用的容器之一,用于存储同类型的元素。Vector容器提供了多种构造函数...

    STL -容器,string容器

    常见的序列式容器有vector、list、deque等。 关联式容器的特点是无需强调元素的物理顺序,各元素之间没有严格的物理上的顺序关系。常见的关联式容器有set、map等。 在STL容器中,string容器是最常用的容器之一。...

    c++ STL 范例大全

    总结来说,本文档提供了一个关于C++ STL容器的全面介绍,包括了各种容器的基本用法、构造方法以及成员函数的使用示例。这些例子可以帮助初学者更好地理解和掌握C++ STL中的容器概念,进而提高编程效率。

    C++ STL学习资料

    1. 容器:STL的核心组成部分之一,它们是数据结构的模板类,如vector(动态数组)、list(双向链表)、deque(双端队列)、set(集合)、map(映射)和unordered_map(无序映射)等。每个容器都有其特定的内存管理和...

    C++STL源码PJ版

    本资源包含了多个STL容器和算法的源码分析,包括string、vector、deque、list、map、set、bitset、queue和stack等,这些文件名对应了STL中的主要组件。 首先,`string.txt`涉及的是C++中的字符串类,它是处理文本...

    C++之STL标准库容器成员一览表.pdf

    本文将对C++ STL标准库容器成员进行概述,包括array、vector、deque、list、forward_list、string、set、multiset、map、multimap、unordered_set、unordered_multiset、unordered_map、unordered_multimap等容器的...

    C++ STL 开发技术导引(第6章)

    第17章 string基本字符序列容器 243 17.1 string技术原理 243 17.2 string应用基础 258 17.3 本章小结 264 第18章 stack堆栈容器 265 18.1 stack技术原理 265 18.2 stack应用基础 266 18.3 本章小结...

    C++ STL开发技术导引(第5章)

    第17章 string基本字符序列容器 243 17.1 string技术原理 243 17.2 string应用基础 258 17.3 本章小结 264 第18章 stack堆栈容器 265 18.1 stack技术原理 265 18.2 stack应用基础 266 18.3 本章小结...

    C++_STL范例大全带书签

    《C++ STL范例大全带书签》这本书主要涵盖了C++标准模板库(STL)中的各种组件,包括容器、迭代器、算法等核心部分。STL是C++编程中非常重要的工具,它提供了一组高效的数据结构和算法,极大地提高了代码的可复用性...

    【STL源代码】C++标准库STL源代码下载

    STL,全称为Standard Template Library,是C++标准库的核心部分,它提供了一组高效、通用的容器、迭代器、算法和函数对象。在【STL源代码】中,我们可以深入学习并理解这些组件的实现细节,从而提高编程技能和效率。...

    C++函数STL速查手册.zip

    容器如vector、list、deque、set、map等,它们提供了各种数据结构来存储和管理对象。vector是动态数组,适合随机访问;list是双向链表,适合频繁插入和删除;deque支持两端的快速插入和删除;set和map是基于红黑树的...

    C++STL程序员开发指南(带目录)

    1. **容器**:容器是存储元素的数据结构,如vector(动态数组)、list(双向链表)、deque(双端队列)、set(集合)、map(映射)等。它们提供了统一的接口来管理内存和元素操作。 2. **迭代器**:迭代器是访问...

    C++ STL.pdf

    顺序容器包括vector、list、deque和string,关联容器包括set、multiset、map和multimap。 1.1 顺序容器 顺序容器中存储的元素是线性排列的,支持快速的随机访问。 1.1.1 vector(向量容器) vector是一个动态数组...

    STL容器使用代码

    在STL中,容器是一类能够存储数据的对象,包括vector、string、deque、queue、list、set、multiset、map和multimap。下面将详细介绍这些容器的使用和API方法。 1. **vector**:动态数组,可以自动扩展其大小。常用...

    STL容器的一些使用简介

    STL提供了多种容器,包括`vector`、`list`、`deque`、`set`、`map`等。 首先,让我们来谈谈`queue`容器。`queue`是一个先入先出(FIFO)的容器,提供了`push`、`pop`、`front`、`back`等操作: ```cpp std::queue...

    自己整理的C++ STL代码 很详细

    本篇将详细介绍C++ STL中的一些关键容器,如priority_queue、stack、queue、map、vector、list、deque以及它们的基本操作。 1. **priority_queue**: 优先队列,顾名思义,它是一种特殊的队列,其中的元素根据某种...

    C++STL程序员开发指南

    1. 容器:STL提供了一系列容器类,如vector(动态数组)、list(双向链表)、deque(双端队列)、set(集合)、map(映射)等,它们用于存储和管理数据。每个容器都有其特定的特性和用途,例如vector适合快速访问和...

    c++容器使用经验总结

    C++标准STL提供序列容器如vector、string、deque和list,以及关联容器如set、multiset、map和multimap。非标准容器包括slist(单向链表)和rope(一种重型字符串)。此外,还有哈希容器和一些非STL标准容器如数组、...

    C++ STL开发技术导引(第3章)

    第17章 string基本字符序列容器 243 17.1 string技术原理 243 17.2 string应用基础 258 17.3 本章小结 264 第18章 stack堆栈容器 265 18.1 stack技术原理 265 18.2 stack应用基础 266 18.3 本章小结...

Global site tag (gtag.js) - Google Analytics