关闭

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

318人阅读 评论(0) 收藏 举报
分类:

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)
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:16369次
    • 积分:340
    • 等级:
    • 排名:千里之外
    • 原创:14篇
    • 转载:21篇
    • 译文:0篇
    • 评论:0条
    文章分类