STL模板类--数据结构与算法

原创 2015年07月07日 22:17:46

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++来访问

 

四.自动排序类型setmultiset

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之间的元素

 

五.自动排序类型mapmultimap:存储一对值

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)

一篇关于STL标准模板库使用方法的经典文章!

STL 简介,标准模板库 作者:Scott Field         这篇文章是关于C++语言的一个新的扩展——标准模板库的(Standard Template Library),也叫STL。 ...
  • hygzxf
  • hygzxf
  • 2011年09月13日 16:10
  • 2567

从零开始_学_数据结构(五)——STL(map、set、list、vector)

STL容器   前注: STL(标准模板库)是一个C++的软件库,也是C++标准程序库的一部分。 这些容器,应该都是STL里面的一个类。 vector封装数组、list封装链表、map和se...

数据结构与算法之单链表 自己实现STL list模板类

自己写的一个简单的单链表模板类,类似STL功能,不过是单链表,与真正的STL肯定很大区别,只是自己模仿一下而已。 #include using namespace std; template...

数据结构-栈:顺序栈与链栈的C++模板类实现

C++模板类实现顺序栈和链栈 实现的功能:  1.压栈,2.弹栈,3.显示栈顶元素,4.判空,5.判满,6.清空栈,7.求栈长度。 顺序栈的C++模板类实现代码: //顺序栈*...

数据结构之栈(链式存储)——C++模板类实现

栈的链式存储结构之C++实现 链式栈是线性表的链接存储表示,采用链式栈来表示一个栈,便于结点的插入与删除。在程序中同时使用多个栈的情况下,用链式表示不仅能提高效率,还可以达到共享存储空间的目的。 #i...
  • Mrx_Nh
  • Mrx_Nh
  • 2017年03月11日 13:08
  • 247

CGAL几何库 半边网格数据结构 模板类 设计核心思想

原文链接: http://www.cnblogs.com/rocketfan/archive/2009/07/05/1517200.html      CGAL是一个优秀的几何处理库,对于三维网格采用...

CGAL几何库 半边网格数据结构 模板类 设计核心思想

CGAL几何库 半边网格数据结构 模板类 设计核心思想 CGAL是一个优秀的几何处理库,对于三维网格采用半边格式存储。 其实对于网格而言,无外乎定义它的边,顶点,面,数据存储。 ...
  • wenh_t
  • wenh_t
  • 2012年04月04日 17:26
  • 595
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:STL模板类--数据结构与算法
举报原因:
原因补充:

(最多只允许输入30个字)