1、queue队列容器
头文件:#include <queue>
链式队列
不支持运算符、没有迭代器、只有无参构造合拷贝构造
back 获取队尾元素
front 获取队头元素
empty 判断是否队空
push 入队
pop 出队
size 获取队列元素
2、stack栈容器
头文件: #include <stack>
链式栈
不支持运算符、没有迭代器、只有无参构造合拷贝构造
push 入栈
pop 出栈
top 获取栈顶元素
size 获取栈元素数量
empty 判断是否栈空
3、priority_queue 优先队列容器
头文件:#include <queue>
优先队列,该队列会对入队的数据进行排序,默认元素值越大,优先级越高,越先出队
注意:存储的元素必须支持 < 运算符
如果类型不支持,需要手动实现 < 运算符函数,可以根据需要在该函数中修改优先级
push 入队
pop 出队
top 获取队头元素
size 获取队列元素数量
empty 判断是否队空
4、Double-ended queues双向队列容器
头文件:#include <deque>
双向队列容器,用法与vector一模一样,只是底层采用双向链表存储数据
区别是vector是顺序表
优点: 比vector节约内存
缺点: 速度要比vector慢
支持的运算符:
[] 可以像向量一样"随机访问"元素
= == != < > <= >= 比较规则与vector一致
注意:虽然可以像随机访问一样去访问元素,但是底层是不支持随机访问的,本质上[]运算符还是遍历访问,因此速度比vector慢
其实就是在vector的基础上增加了双端操作的功能而已
5、set容器
头文件:#include <set>
集合容器,特点是元素不重复,会对元素自动排序,因此它存储的元素必须支持 < 运算符,只能迭代器遍历访问
底层:采用红黑树实现的
构造函数:
只有无参构造合拷贝构造
运算符:
与list一致
size_type count( const key_type& key);
功能: 获取集合中key元素的数量,在set中只能是1或0,意义不大
pair<iterator, iterator> equal_range( const key_type& key );
功能: 查找set容器中值为key的元素位置范围,返回一个数据对[start迭代器,end迭代器)
因为set数据不重复,该函数意义不大
iterator find( const key_type& ket );
功能: 查找set中值为key的元素位置,如果找到返回该元素的迭代器,否则返回end()的值
pair<iterator,bool> insert( const TYPE& val );
功能:向容器中插入一个数据
返回一个键值对,成功(迭代器,true),否则(end,false)
key_compare key_comp() const;
功能:返回容器中元素的比较方法 使用该方法对该类型的数据进行<比较
set<T> set;
set<int>::key_compare cmp = s.key_comp();
cout << cmp(T t1,T t2) << endl;
iterator lower_bound( const key_type& key );
功能: 返回一个最小的大于等于key元素的迭代器
iterator upper_bound( const key_type& key );
功能: 返回一个最小的大于key元素的迭代器
value_compare value_comp() const;
功能:返回容器中元素的比较方法 使用该方法对该类型的数据进行<比较
set<T> set;
set<int>::value_compare cmp = s.value_comp();
cout << cmp(T t1,T t2) << endl;
6、multiset
头文件:#include <set>
多重集合容器,特点是元素可以重复,依然会对元素自动排序,因此它存储的元素也必须支持 < 运算符,只能用迭代器遍历
底层:红黑树
pair<iterator, iterator> equal_range( const key_type& key );
功能: 查找multiset容器中值为key的元素位置范围,返回一个数据对[start迭代器,end迭代器)
7、map容器
头文件:#include <map>
映射容器,是存储了由 (key/value)组成的元素(字典、键值对),要求键值对中的key不能重复,而且会根据key进行排序
要求key类型必须支持 < 运算符
key和value是一一对应的,可以根据key来访问value
一般会在里面存储频繁需要查找的数据,因为map的查找速度特别快(redis内存数据库)
底层采用红黑树存储数据,查找效率极高
构造函数:
map( iterator start, iterator end );
功能: 使用一组pair<key/value>数据构造映射容器
map( iterator start, iterator end, const key_compare& cmp );
功能: 使用一组pair<key/value>数据构造映射容器,并提供key的比较函数
支持[]运算符:
[] 通过使用key作为下标
即可以访问key的键值对,也可以给该键值对赋值(插入)
m[key] = value;
iterator insert( iterator i, const TYPE& pair );
功能:在指定位置插入一个键值对(pair类型)
void insert( input_iterator start, input_iterator end );
功能:向映射容器插入一组数据(pair类型)
pair<iterator,bool> insert( const TYPE& pair );
功能:向映射容器插入一个键值对,返回插入位置以及结果
key_compare key_comp() const;
功能: 返回map容器中key的比较函数,该函数可以针对相同类型的键值对进行key的比较
value_compare value_comp() const;
功能: 返回map容器中value的比较函数,该函数可以针对相同类型的键值对进行value的比较
8、multimap
#include <map>
多重映射容器
使用方法与map一致,但不同的是它的key可以对应多个value
所以无法支持[]运算符
通过迭代器删除元素时,需要注意的问题:
对于关联容器(set\multiset\map\multimap),删除当前iterator时,仅仅会让当前的迭代器失效
可以在erase时,递增当前的iterator可以连续删除 set>erase(it++)
因为他们底层都是红黑树实现,因此插入、删除一个节点不会导致其他节点无法访问
对于顺序容器(vector),当删除当前的iterator会使后面的元素的iterator失效,因为它底层是连续分配的内存
因此不能 vector.erase(it++)
可以通过返回值拿到下一个元素的迭代器,重新赋值给it即可 it = vector.erase(it);
9、bitset容器
#include <bitset>
位集合容器,是一种封装了各种位运算操作的数据结构
支持的运算符:
!= == &= ^= |= ~ <<= >>= []
成员函数:
bool any()
功能: 有任意一位二进制为1,返回真
size_type count();
功能: 返回二进制位为1的位数
bitset<N>& flip();
功能:所有二进制位求反
bitset<N>& flip( size_t pos );
功能:指定二进制位求反
bitset<N>& reset();
功能:把所有二进制位置零
bitset<N>& reset( size_t pos );
功能:把指定二进制位置零
bitset<N>& reset( size_t pos, int val=1 );
功能: 把指定二进制位置1
size_t size();
功能:计算二进制的位数
bool test( size_t pos );
功能: 测试某个二进制位是0还是1
string to_string
功能:把二进制转换成字符串
unsigned long to_ulong();
功能:把二进制转换为 unsigned longc
注意: bitset在C++中用处不大,但是在嵌入式开发中比较
为什么STL中有很多容器底层采用红黑树?