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

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)

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-16 16:10:51

STL模板类--数据结构与算法的相关文章

c++模板类学习简单

1.模板的概念 我们已经学过重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同.正确的调用重载函数.例如,为求两个数的最大值,我们定义MAX()函数需要对不同的数据类型分别定义不同重载(Overload)版本. //函数1. int max(int x,int y) {  return(x>y)?x:y ; } //函数2. float max( float x,float y) {  return (x>y)? x:y ; } //函数3. d

【C/C++学院】0825-类模板/final_override/类模板与普通类的派生类模板虚函数抽象模板类/类模板友元/位运算算法以及类声明/Rtti 实时类型检测/高级new创建/类以及函数包装器

类模板 类模板多个类型默认类型简单数组模板 #pragma once template <class T=int>//类模板可以有一个默认的值 class myArray { public: myArray(); ~myArray(); }; #include "myArray.h" template <class T=int>//每一个函数都需要加上一个默认的值 myArray<T>::myArray() //类模板成员函数在外部,需要加载类型初始

C++标准模板库Stand Template Library(STL)简介与STL string类

参考<21天学通C++>第15和16章节,在对宏和模板学习之后,开启对C++实现的标准模板类STL进行简介,同时介绍简单的string类.虽然前面对于vector.deque.list等进行过学习和总结,但并没有一个宏观上的把握,现在通过上一篇和这一篇博文,将对C++模板以及基于C++模板的STL关联起来,形成一个总体的把握,对于掌握C++中模板(template)这一强有力的工具会十分有帮助.本文的主要内容有: (1) STL容器: (2) STL迭代器: (3) STL算法: (4) ST

算法学习——STL和基本数据结构

第一次接触算法,只是照着自己的方法学习的,总结写的可能不是会很好,但我会努力改进. #STL容器包括顺序式容器和关联式容器. 顺序式容器: ·vector:动态数组,从末尾能快速插入与删除,直接访问任何元素. ·list:双链表,从任何地方快速插入与删除. ·deque:双向队列,从前面或后面快速插入与删除,直接访问任何元素. ·queue:队列,先进先出 ·priority_queue:优先队列,最高优先级元素总是第一个出列. ·stack:栈,先进后出. 关联式容器: ·set:集合,快速查

摘:数据结构各种算法实现(C++模板)

目  录 1.顺序表. 1 Seqlist.h 1 Test.cpp 6 2.单链表. 8 ListNode.h 8 SingleList.h 10 test.cpp 20 3.双向链表. 22 NodeList.h 22 DoubleList.h 24 Test.cpp 34 4.循环链表. 36 ListNode.h 36 CircularList.h 37 Test.cpp 47 5.顺序栈. 49 SeqStack.h 49 Test.cpp 54 6.链式栈. 55 StackNode

数据结构与算 5:C++ 顺序/链式存储,栈 模板类实现,编译模板类问题解决

[本文谢绝转载原文来自http://990487026.blog.51cto.com] 数据结构与算 5:C++ 顺序/链式存储,栈 模板类实现 C++ 顺序存储模板类的实现[面试重要] C++ 链式存储模板类的实现[面试重要] C++ 链式存储模板类,载入指针 c++ 栈的链式存储实现(模板类嵌套模板类),编译问题教训[重要] C++ 顺序存储模板类的实现[面试重要] 项目文件: [email protected]://990487026.blog.51cto.com~/c++$ tree .

编程算法 - 求1+2+...+n(模板类) 代码(C++)

求1+2+...+n(模板类) 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 求1+2+...+n, 要求不能使用乘除法\for\while\if\else\switch\case等关键字及条件判断语句(A?B:C). 可以使用模板类求解, 输入模板参数, 进行递归调用, 每次递归值减1, 至模板参数为1时, 显示调用结束模板类. 代码: /* * main.cpp * * Created on: 2014.7.12 * Author

C++ STL pair类模板

关联容器的一些成员函数的返回值是 pair 对象,而且 map 和 multimap 容器中的元素都是 pair 对象.pair 的定义如下: template <class_Tl, class_T2> struct pair { _T1 first; _T2 second; pair(): first(), second() {} //用无参构造函数初始化 first 和 second pair(const _T1 &__a, const _T2 &__b): first(_

C++数据结构 顺序表的实现(模板类的实现)

利用模板类实现顺序表的操作 实现的功能: 1.尾插,2.头插,3.显示,4.尾删,5.头删,6.按位置,7.插按值插,8.按位置删,9.按值删,10.按值查,11.求表长,12.清除数据,13.摧毁该顺序表,14.反转,15.排序(冒泡排序,快速排序). 头文件源代码: #pragma once // 防止重复编译 #include<iostream> using namespace std; template<class Type> class SeqList { public: