C++ STL常见容器的用法。
序列容器: vector deque list [ 线性数据结构 ]
关联容器: set multiset map multimap [ 非线性数据结构 能够快速找出保存在容器中的元素]
容器适配器: stack queue priority_queue
1.string容器
构造函数:
1 | string();//创建一个空的字符串 例如: string str; |
赋值:
1 | string& operator=(const char* s);*//char\*类型字符串 赋值给当前的字符串* |
string拼接操作:
1 | string& operator+=(const string& str);//重载+=操作符 |
string查找和替换:
1 | int find(const string& str, int pos = 0) const; //查找str第一次出现位置,从pos开始查找 |
string子串:
1 | string substr(int pos = 0, int n = npos) const;//返回由pos开始的n个字符组成的字符串 |
插入和删除:
1 | string& insert(int pos, const char* s); //插入字符串 |
string和c-style字符串转换:
1 | //string 转 char* |
2.vector容器
vector维护一个线性空间,所以不论元素的型别如何,普通指针都可以作为vector的迭代器,因为vector迭代器所需要的操作行为,如operaroe*, operator->, operator++, operator–, operator+, operator-, operator+=, operator-=, 普通指针天生具备。
构造函数:
1 | vector<T> v; //采用模板实现类实现,默认构造函数 |
大小操作:
1 | size();//返回容器中元素的个数 |
插入和删除:
1 | insert(const_iterator pos, int count,ele);//迭代器指向位置pos插入count个元素ele. |
优化方法
1.提前分配足够的空间以避免不必要的重新分配和复制周期 reserve()
当vector 预留空间不足时
常用操作push_back()函数在每次插入元素时会检测预留空间是否够用
预留空间不够用:要重新分配内存,并且拷贝当前已有的所有元素到新的内存区域。如果已有元素很多,这个操作将变的非常昂贵。
2.使用 shrink_to_fit() 释放 vector 占用的内存, – clear() 或 erase() 不会释放内存。
3.在 vector 前部做的插入操作其复杂度都是 O(n) 。
3.deque容器
双向开口的连续线性空间。
与vector容器的差异:
1.deque允许使用常数项时间对头端进行元素的插入和删除操作。
2.deque没有容量的概念,因为它是动态的以分段连续空间组合而成,随时可以增加一段新的空间并链接起来,换句话说,像vector那样,”旧空间不足而重新配置一块更大空间,然后复制元素,再释放旧空间”这样的事情在deque身上是不会发生的。
deque双端插入和删除操作:
1 | push_back(elem);//在容器尾部添加一个数据 |
deque插入操作:
1 | insert(pos,elem);//在pos位置插入一个elem元素的拷贝,返回新数据的位置。 |
deque删除操作:
1 | clear();//移除容器的所有数据 |
4.stack容器
stack没有迭代器
Stack所有元素的进出都必须符合”先进后出”的条件,只有stack顶端的元素,才有机会被外界取用。Stack不提供遍历功能,也不提供迭代器。
stack数据存取操作
1 | push(elem);//向栈顶添加元素 |
stack大小操作
1 | empty();//判断堆栈是否为空 |
5.queue容器
queue存取、插入和删除
1 | push(elem);//往队尾添加元素 |
6.list容器
相较于vector的连续线性空间,list就显得负责许多,它的好处是每次插入或者删除一个元素,就是配置或者释放一个元素的空间。因此,list对于空间的运用有绝对的精准,一点也不浪费。而且,对于任何位置的元素插入或元素的移除,list永远是常数时间。
List容器是一个双向链表。
list插入和删除:
1 | push_back(elem);//在容器尾部加入一个元素 |
list大小操作:
1 | size();//返回容器中元素的个数 |
7. set/multiset容器
Set的特性是所有元素都会根据元素的键值自动被排序。
multiset特性及用法和set完全相同,唯一的差别在于它允许键值重复。
set和multiset的底层实现是红黑树。
插入和删除操作:
1 | insert(elem);//在容器中插入元素。 |
set查找操作:
1 | find(key);//查找键key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end(); |
pair对组
pair将一对值组合成一个值
这一对值可以具有不同的数据类型
两个值可以分别用pair的两个公有函数first和second访问。
构造:
1 | make_pair(v1, v2); |
8.map/multimap容器
Map的特性是,所有元素都会根据元素的键值自动排序。
Map所有的元素都是pair,同时拥有实值和键值,pair的第一元素被视为键值,第二元素被视为实值,map不允许两个元素有相同的键值。
map插入数据:
1 | map.insert(...); //往容器插入元素,返回pair<iterator,bool> |
map删除:
1 | clear();//删除所有元素 |
map查找:
1 | find(key);//查找键key是否存在,若存在,返回该键的元素的迭代器;/若不存在,返回map.end(); |