前言
STL有六大部件,容器、算法、仿函数、迭代器、适配器和分配器。除了算法是函数模板,其他都是类模板。容器可以分为序列容器和关联容器。常见的序列容器有vector、array、deque、list、forward-list,常见的关联容器有map、set、multimap和multiset。
一、序列容器
各个容器
verctor
verctor比较常用,图解:
特点:verctor是二倍增长的,当它容量不够时候,会二倍增长后把原来的东西搬过去
用法:
vector<int> c;//定义时候需要声明是什么类型
c.puh_back(3);//要从尾巴放数进去
c.size();//可以vector里面占了多少空间
c.capacity();//可以知道最大容纳多少空间
c.front();//最前面的那个数拿出来
c.back()://最后面的那个数拿出来
c.date();//首地址
注意:赋值好像都用++i?
两种查找方式
auto it = :: find(c.begin(),c.end(),target);//顺序查找,前面auto可以自动推导
//法二
sort(c.begin(),c.end());//顺序排序
string* it=(string*)bsearch(&target, (c.date()),(c.size()),sizeof(string))
array
c本来就有,包装成容器的行为,要有迭代器才能配合算法
特点:没有构造函数和析构函数
用法:
array<long,msize> c;//要指定数组的数据类型和大小
c.size();//大小
c.front();//首元素
c.back();//尾元素
c.data();//数组首地址
qsort(c.data(),msize,sizeof(long),compareLong)//快速排序、指定地址、多少个元素、每个元素大小是多少,比较方法是怎么样的
bsearch(&target,c.date(),msize(),sizeof(long),compareLong)//二分查找,指定查找对象
list和forward_list
list是双向链表,用的是尾插法,而forward_list用的是头插法,同时计算size和back效率太低,所以不提供。
list<int> c;
c.size();
c.front();
c.back();
c.push_back();//尾插法
c.sort();//list容器里面的sort,这样设计的原因是list里面的空间是不连续的,而::sort用的是标准库的,他要求连续空间才能操作
forward_list<int> c;
c.push_front();
c.max_size();
c.front();
deque
类似list,两边都能扩充,他是分块储存的,当一个buffer用完后,会有一个新的buffer,这个buffer的地址放在map里面。
deque<int> c;
c.push_back():
c.pop_back();
c.push_front();
c.pop_front();
c.front();
c.back();
同时对于stack和queue他是没有自己的数据结构的,而是借用deque,是容器适配器,不提供迭代器,不能遍历。
stack<int> c;
c.push(2);
c.pop();
c.top();
c.size();
queue<int> c;
c.push(2);
c.pop();
c.front();
c.back();
c.size();
关联容器
关联容器是通过key来找值的,可以看成小型数据库。底层是通过红黑树来查找,同时set只有key,它的key也是key也是value。
mulitset和set
multiset<int> c;
c.insert(2);//会放在该放的位置,放进去就会排序
c.begin();
c.end();
c.size();
c.find(target);//内置find,红黑树
set和mulitset区别是set不允许有重复的值,同时sert不可以通过迭代器来修改容器里面的只
mulitmap和map
multimap<int,int> c;
c.insert(pair<int,int>(2,3));
c.begin();
c.end();
c.size();
c.find(target);//内置find,红黑树
//无c.front()
//multimap不能用下标[]来插入值
注意map不可以修改key值,但可以修改key对应的value值,同样map相比较multimap也不可以有重复的key
总结
本章节详细介绍了序列式容器和关联式容器,主要介绍的都是标准型的,对于一些非标准的比如hash_set、hashtable这些并没有涉及,注意array是C++11才加进去的,array和vector都是连续空间的