STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。所有C++编译器和所有操作系统平台都支持的一种库。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。
一、STL组成
1)容器(Container)
2)迭代器(Iterator)
3)算法(Algorithm)
4)函数对象(Function object)
5)适配器(Adaptor)
6)空间配制器(allocator)
1.容器类是容纳、包含一组元素或元素集合的对象;
向量(vector)
双端队列(deque)
列表(list)
集合(set)、多重集合(multiset)
映射(map)和多重映射(multimap)
void display(vector<int>& v2)
{
vector<int>::iterator ite;//定义了一个迭代器,用来访问容器中的对象
for(ite=v2.begin();ite!=v2.end();ite++)
cout<<*ite<<" ";
cout<<endl;
}
2.迭代器
(1)提供了访问容器中对象的方法。(也可以用其他方法访问容器中的对象)
迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。
3.算法
是用来操作容器中的数据的函数模板。
例如,STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象。
函数本身与他们操作的数据的结构和类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用。
4.函数对象
所谓函数对象(function object)是重载了函数调用操作符(funiton-call operator())的对象,函数对象的优势在于能很好的满足STL的抽象要求。
5.适配器
将一个class的接口转换为另一个class的接口,使得原本因接口不兼容而不能合作的classes可以一起运作。分为容器适配器,迭代器适配器,函数对象适配器。
6.空间配制器
动态内存空间的分配和回收工作
二、STL容器分为两类(这两者通过数据在容器内的排列来区分)
序列式容器
每个元素都有固定位置--取决于插入时机和地点,和元素值无关,
vector、deque、list;
关联式容器
元素位置取决于特定的排序准则,和插入顺序无关
set、multiset、map、multimap;
三、vector与数组的区别
1.array 定义的时候必须定义数组的元素个数;而vector 不需要;
2.array 定义后的空间是固定的了,不能改变;而vector 要灵活得多,可再加或减.
3.vector有一系列的函数操作,非常方便使用。
4.数组和vector不同,一个数组不能用另一个数组初始化,也不能将一个数组赋值给另一个数组;
四、set / multiset:集合
内部的元素依据其值自动排序
在vector,list, deque几个容器中插入数据元素时,插入的位置是确定的(最前,最后或是指定的某个位置上)
而在关联容器中插入数据时,根据插入数据元素的大小确定插入的位置(根据对象所属类中定义的(重载的)比较函数)
set内的相同数值的元素只能出现一次,
multiset内可包含多个数值相同的元素,
内部由二叉树(二叉链表,平衡二叉树,默认升序)实现,便于查找;
#include <iostream>
#include <set>
using namespace std;
int main(){
set<int> s;
s.insert(3);
s.insert(2);
s.insert(1);
s.insert(1);
cout<<"set 的 size 值为 :"<<s.size()<<endl;
cout<<"set 的 maxsize的值为 :"<<s.max_size()<<endl;
cout<<"set 中的第一个元素是 :"<<*s.begin()<<endl;
cout<<"set 中的最后一个元素是:"<<*s.end()<<endl;
s.clear();
if(s.empty()) { cout<<"set 为空 !!!"<<endl; }
cout<<"set 的 size 值为 :"<<s.size()<<endl;
cout<<"set 的 maxsize的值为 :"<<s.max_size()<<endl;
return 0;
}
五、map
map和set容器的共同点
内部由二叉树(二叉链表)实现,便于查找(这与set);
map和set容器的区别。
对于map中的每个节点存储的是一对信息,包括一个key和一个value ,各个节点之间的key的值(第一列的值)不能重复(重复的值自动删除)。
对于set中的每个节点存储的是一个信息,只有一个键,但是每个键值也是唯一的。set表示的是集合的概念。
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main()
{
map<int , char> m;
m.insert (pair<int, char>(1,'1'));
m.insert (pair<int ,char>(1,'2'));
cout<<m.size ();
return 0;
}
map中插入
insert(pair<T1,T2,>(key1,value1))。
insert(map<T1,T2>::value_type(key1,value1)),这种插入方式和第一种基本相似。
六、stack
头文件:#include
stack 模板类需要两个模板参数,一个是元素类型,一个容器类型,但只有元素类型是必要的,在不指定容器类型时,默认的容器类型为deque。
定义stack 对象的示例代码如下:
stack s1;
stack s2;
stack 的基本操作有:
入栈,如例:s.push(x);
出栈,如例:s.pop();注意,出栈操作只是删除栈顶元素,并不返回该元素。
访问栈顶,如例:s.top()
判断栈空,如例:s.empty(),当栈空时,返回true。
访问栈中的元素个数,如例:s.size()。
#include <iostream>
#include <stack>
using namespace std;
int main(){
stack<char> s;
char ch[100];
cin>>ch;
char e;
for(int i=0;ch[i]!=NULL;i++) {
switch(ch[i]) {
case '(':
case '[':
case '{':
s.push(ch[i]); break;
case ')':
case ']':
case '}':
if(s.empty())
{cout<<"Extra right brackets\n"; return ; }
else {
e=s.top();
if(ch[i]==')' && e=='(' ||ch[i]==']' && e=='[' ||ch[i]=='}' && e=='{' ) {
s.pop(); break; }
else
{ cout<<"Brackets not match\n"; return;
}
}
}
}
if(s.empty())
cout<<"Brackets match\n";
else cout<<"Extra left brackets\n";
}