STL提供了一些模板类,实现了《数据结构》中的一些数据结构类型
在写代码时用到栈,队列等数据结构时可以充分利用STL模板类,会发现特别好用。
想起C语言中用数组实现栈和队列,简直就是噩梦。
C++是世界上最好的语言。。。(just kidding !!!)
顺序容器:动态数组vector;deque链表list;
关联容器:set/multiset有序值;map/multimap有序键值对
一. 动态数组vector类
1.定义:#include<vector> std::vector<int> v;
2.初始化:v(10); //预设初始大小为10
v(10,90);//设10个90
v(v1); //用另一个vector类初始化它,复制
v(v1.begin(),v1.begin()+5);把v1的前5个元素复制给它
3.迭代器定义:std::vector<int>::iterator p = v.begin;//定义迭代器p;并初始化指向v开头
4.成员函数
(1)插入元素到数组末尾: v.push_back(50);//把50插到末尾
插入元素到任意位置 : v(4);v[0]=30;v[1]=29;v[2]=67;v[3]=19;
插入元素insert函数: v.insert(v.begin(),25);//在v的最前面插入25
v.insert(v.end(),2,25);//在v的最后面插入2个25
v.insert(v.begin+1,v1.begin(),v1.end())//在v位置1插入v1的元素
(2)容量和大小:v.size();//返回当前元素个数
v.capacity();//返回容量,即最多能存多少个元素
(3)访问元素:1. v[3];//使用数组下标,有越界风险
2. v.at(3);//使用at函数,自动检查容器大小,无越界风险
3. vector<int>::iteratorp=v.begin(); p++; cout<<*p;//迭代器访问
(4)求两个位置的距离 int i = distance(v.begin(),p)//p是迭代器
(5)删除末尾元素:v.pop_back();
(6)判断空不空:v.empty();数组空则返回1
二.动态数组deque类:
与vector类似,只是也支持在开头插入元素
定义:#include<deque> std::deque<int> d;
在开头插入元素:v.push_front(5);
在开头删除元素:v.pop_back();
三.双向链表list
1. 定义:#include<list> list<int> l;
2. 插入元素:l.push_front(5);//在l的开头插入5
l.push_back(5);// 在l的末尾插入5
l. insert(p,5);//在迭代器p处插入5;函数返回迭代器,指向刚插入的元素
l. insert(p,2,5);//在位置p插入2个5
l.insert(p,l2.begin(),l2.end());//在位置6插入l2的一段
3.删除元素:l.erase(p);//删除迭代器p指向的元素
l.erase(p1,p2)//删除迭代器p1,p2之间的元素
l.clear();//清空整个链表
4.翻转list元素的顺序:l.reverse();
5排序:l.sort();//升序排列
l.sort(cmp);//按二元谓词cmp排列
6 list是链表结构,不能用list.begin()+3来访问元素,可以用list.begin++来访问
四.自动排序类型:set和multiset
1. 定义:#include<set> set<int> s1;multiset<char> s2;// 默认升序排列
set<int,cmp> s;//使用cmp排序
2. 查找 s.find(5);//返回指向5的迭代器
3. 删除:s.erase(5);//删除值为5的元素
s.erase(p);//删除迭代器p指向的元素
s.erase(p1,p2);//删除p1,p2之间的元素
五.自动排序类型:map和multimap:存储一对值
1. 定义:#include<map> map<int,char>m1;multimap<int,char> m2//默认键升序排列
map<int,char,cmp> m;// 使用cmp排序
2. 插入元素:m.insert(make_pair(5,a));//插入键值对(5,a)
3. 查找元素; m.find(5);//返回指向5的迭代器
4. 访问:cout<<m->second.c_str();把元素值转换成C字符串类型
5. 删除:m.erase(5);//删除值为5的元素
m.erase(p);//删除迭代器p指向的元素
m.erase(p1,p2);//删除p1,p2之间的元素
六.自适应容器
队列queue
优先级队列priority_queue
栈stack
1.定义:#include<stack> stack<int> s;//默认在内部使用deque来存储数据
stack<int,vector<int>> s;//内部用vector来存储数据
2.成员函数: s.push(5);//栈顶插入5
s.pop();//删除栈顶元素
s.empty();//空栈就返回1
s.top();//获得指向栈顶元素的引用 cout<<s.top();
s.size();//返回栈中的元素数
队列queue
1.定义:#include<queue>queue<int> q;// 默认在内部使用deque来存储数据
queue<int,list<int>>q;// 内部用list来存储数据
2.成员函数: q.push(5);//在队尾(即最后一个位置)插入5
q.pop();//删除队首元素
q.front();//返回指向队首元素的引用cout<<q.front();
q.back();//返回指向队尾元素的引用cout<<q.back();
q.empty();//若为空则返回1
q.size();//返回队列的元素数
七.STL通用算法 #include<algorithm>
1.查找find
find(v.begin(),v.end(),5); //在迭代器区间查找5,返回迭代器;找不到就返回v.end()
find_if(v.begin(),v.end(),cmp); //在迭代器区间检查每个元素,如果迭代器i
满足cmp(*i)=true,则返回迭代器i若找不到,则返回v.end();
boolcmp(int x) { return x%5?0:1;}
2.统计个数
count(v.begin(),v.end(),5); //返回迭代器区间5的个数
count_if(v.begin(),v.end(),cmp);//返回使cmp函数为ture的元素的个数
3.v.begin();//返回第一个元素的迭代器
v.end();//返回最后一个元素下一个位置的迭代器
v.front();//返回第一个元素的引用
v.back();//返回最后一个元素的引用
4.子序列搜索search(v1.begin(),v1.end(),v2.begin(),v2.end());//在v1中找子序列v2,返回指向子序列v2第一次出现的位置的迭代器
5.元素复制 copy(v.begin(),v.end(),l.begin());//把v复制到l的开头
6.对每个元素执行操作 transform(v.begin(),v.end(),v.begin(),function)//第一个和第二个参
数指出要操作的区间,第三个参数指出结果存放的起始位置,第四个参数是函数名
transform(v1.begin(),v1.end(),v2.begin(),v1.begin(),function);//第一个第二个
指出要操作的参数1区间, 第三个是参数2起始,第三个是结果存放的起始位置
7遍历,对某区间每个元素执行操作:for_each(v.begin(),v.end(),function)
版权声明:本文为博主原创文章,未经博主允许不得转载。