1.1 泛型程序设计简介

  泛型程序设计,简单地说就是使用模板的程序设计法。将一些常用的数据结构(比如链表,数组,二叉树)和算法(比如排序,查找)写成模板,以后则不论数据结构里放的是什么对象,算法针对什么样的对象,则都不必重新实现数据结构,重新编写算法。

  总而言之,不多赘述,有了STL,不必再从头写大多的标准数据结构和算法,并且可获得非常高的性能。

1.2迭代器

  • 可遍历STL容器内全部或部分元素的对象
  • 指出容器中的一个特定位置
  • 所有容器都提供获得迭代器的函数
操作 效果
begin() 返回一个迭代器,指向第一个元素
end() 返回一个迭代器,指向最后一个元素之后
 
  半开区间[beg, end)的好处:
  1.为遍历元素时循环的结束时机提供了简单的判断依据(只要未到达end(),循环就可以继续)
  2.不必对空区间采取特殊处理(空区间的begin()就等于end())
2.常见的STL容器及其例题应用
2.1Sort
头文件: <algorithm>
格式:
sort(vect.begin(), vect.end());
sort(vect.begin(), vect.end(), less<int>() );
第三个参数可以自定义,主要用于自定义类型的排序
2.2Vector
2.2.1用法:
vector<类型> 名字; 
例如 vector<int> ve; vector<string> ve;
自己定义的结构体什么的也可以往里塞
struct POINT
{
    int x, y;
};
vector<POINT> ve;
2.2.2基本操作
ve.push_back(const value_type &val); 
作用是在数组后面增加一个元素。括号里填的是ve里装的东西
ve.clear();清空ve里的所有元素。
ve.empty();判断ve是否为空,如果是返回true,否则false
ve.size();返回ve的长度。注意这里返回的类型是unsigned int,如果ve是空的ve.size() - 1就会爆掉。使用的时候一定要小心(做TC的时候被坑了一次)
ve.pop_back() 删除数组里的最后一个元素。
2.3 Set
2.3.1用法:
set<类型> 名字; 
例如 set<int> se; set<string> se;
自己定义的结构体什么的也可以往里塞
struct POINT
{
    int x, y;
};
set<POINT> se;
2.3.2基本操作对集合a中元素的有
插入元素:a.insert(1);
删除元素(如果存在):a.erase(1);
判断元素是否属于集合:if (a.find(1) != a.end()) ...
返回集合元素的个数:a.size()
将集合清为空集:a.clear()
 
2.4 Map
2.4.1用法:
map添加数据;
map<int ,string> maplive;  //第一个是键值,第二个是值
1.maplive.insert(pair<int,string>(102,"aclive"));
2. maplive[112]="April";//map中最简单最常用的插入添加!
map中查找数据:
第一种:用count 函数来判定关键字是否出现,其缺点是无法定位数据出现位置,
由于map 的特性,一对一的映射关系,就决定了count 函数的返回值只有两个,
要么是0,要么是1,出现的情况,当然是返回1 了
第二种:用find 函数来定位数据出现位置,它返回的一个迭代器,当数据出现时,它返回数据所在位置的迭代器,如果map 中没有要查找的数据,它返回的迭代器等于end 函数返回的迭代器
注意:
Map中的元素是自动按key升序排序,所以不能对map用sort函数
但可以用迭代器按序遍历(与set类似)
2.5 Queue
2.5.1
用法
和vector一样。
queue<int> qu; 
queue<POINT> qu;
我一般都用它在BFS的时候存点。
2.5.2 常用操作
qu.push(const value_type &val); 元素入队
qu.pop()元素出队
qu.front() 获得队首元素
qu.empty() 判断qu是否为空,是的话返回true
qu.size() 获得qu的大小。
2.6 priority_queue(优先队列):默认从大到小排列。
 
2.6.1用法
priority_queue<int> pqu;
如果要装结构体的话,要重载结构体的小于号,或者自己写一个cmp函数。
struct cmp
{
operator bool ()(int x, int y)
{
return x > y; // x小的优先级高
     }
};
priority_queue<int, vector<int>, cmp>q;//第二个参数为容器类型。第三个参数为比较函数。
priority_queue<vector<int>, less<int>> pq1; // 使用递减less<int>函数对象排序
priority_queue<deque<int>, greater<int>> pq2; // 使用递增greater<int>函数对象排序
常用操作
push(),top(),pop(),empty();
2.7 next_permutation(全排列):要包含头文件<algorithm>
2.7.1用法
与之完全相反的函数还有prev_permutation
a[0]=1;a[1]=2;a[2]=3;
do{cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl;}while (next_permutation(a,a+3)); 
输出:
 1 2 3
 1 3 2
 2 1 3
 2 3 1
 3 1 2
 3 2 1
如果改成 while(next_permutation(a,a+2));
则输出:
 1 2 3
 2 1 3
只对前两个元素进行字典排序

C++学会STL的更多相关文章

  1. 【转】三十分钟学会STL算法

    转载自: http://net.pku.edu.cn/~yhf/UsingSTL.htm 这是本小人书.原名是<using stl>,不知道是谁写的.不过我倒觉得很有趣,所以化了两个晚上把 ...

  2. windows类书的学习心得(转载)

    原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千 ...

  3. 无限循环小数POJ1930

    题意:给定一个无限循环小数,求其分数形势,要求分母最小 分析:看了别人的题解才做出来的,将无限循环小数转化成分数,分为纯循环和混循环两种形式. (1)对于纯循环:用9做分母,有多少个循环数就几个9,比 ...

  4. windows类书的学习心得

    原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千 ...

  5. STL模板中的map的使用与例题

    最近的计分赛,记得自己的都只是过了两题.遇到了两次map,自己在寒假看了一点的map,只知道在字符串匹配的时候可以用的到.但是自己对map的使用还是不够熟练使用,这回在第一次和第二次的计分赛中都遇到可 ...

  6. 【转】三十分钟掌握STL

    转自http://net.pku.edu.cn/~yhf/UsingSTL.htm 三十分钟掌握STL 这是本小人书.原名是<using stl>,不知道是谁写的.不过我倒觉得很有趣,所以 ...

  7. STL学习之路

    本文面向的读者:学习过C++程序设计语言(也就是说学习过Template),但是还没有接触过STL的STL的初学者.这实际上是我学习STL的一篇笔记,老鸟就不用看了. 什么是泛型程序设计 我们可以简单 ...

  8. STL(1)

    这一篇因为游戏设计而写的,里面采用了STL,先借用一下,过段时间专项研究. 模板 模板就是一种通用化的类,同一种模板可以创建无数种具有共同特征的容器类型.首先需要指定基础类型,比如int ,char, ...

  9. Effective STL中文版 译序

    <Effective STL中文版>译序 就像本书的前两本姊妹作(Effective C++.More Effective C++)一样,本书的侧重点仍然在于提升读者的经验,只不过这次将焦 ...

随机推荐

  1. 部署项目到jetty

    一.打包项目 1.在pom.xml中添加以下依赖 <dependency> <groupId>org.mortbay.jetty</groupId> <art ...

  2. java的jdk和jre区别

    本文是本人随便总结的== 首先大概清楚个关系:jdk 包含 jre 包含 jvm 然后来看下,当我们配置完java运行环境的时候,是不是在java默认安装文件下发现jdk和jre两个包,然后jdk包里 ...

  3. 命令行(二):Anaconda3

    1,进入base虚拟环境 $:activate 2,创建虚拟环境(自动下载Python3最新版本) $:conda create -n <virtual_name> python= 3,切 ...

  4. nvalidSchema: Missing dependencies for SOCKS support

    首先需要安装pip3 1. 安装 setuptools wget --no-check-certificate https://pypi.python.org/packages/source/s/se ...

  5. MySQL在cmd命令行查看端口号

    在命令行输入: show global variables like 'port'; 转自:https://blog.csdn.net/zhufengy/article/details/8014778 ...

  6. LVM逻辑卷:创建LVM分区实例

    一.概述 LVM(Logical Volume Manager)是基于内核的一种逻辑卷管理器,LVM适合于管理大存储设备,并允许用户动态调整文件系统的大小.此外LVM快照功能可以帮助我们快速备份数据. ...

  7. 《你一生的故事》--------------science fiction-------------《巴比伦塔》

    而塔就不一样了,不等你靠近去触摸它,就已经感到一种纯粹的坚固与力量.所有的传说都认为,建造这座塔的目的,是为了获得一种力量,这种力量是任何一座巴比伦庙塔都未曾拥有的.普通的巴比伦塔只是用太阳晒干的泥砖 ...

  8. Rabbitmq启动报错

    板卡掉电以后发现rabbitmq服务被停了,重启之: root@firefly:/var/lib/rabbitmq/mnesia# cd /usr/lib/rabbitmq/lib/rabbitmq_ ...

  9. mediasoup-demo安装记录

    环境CentOS 7 64位 VMWare12虚拟机(win10主机),安装好NodeJS 10.13(大于8.9就可以) 已按照GitHub说明拉下来代码,配置好Node环境,开始执行npm sta ...

  10. 2019 ICPC南京站网络赛 H题 Holy Grail(BF算法最短路)

    计蒜客题目链接:https://nanti.jisuanke.com/t/41305 给定的起点是S,终点是T,反向跑一下就可以了,注意判负环以及每次查询需要添加边 AC代码: #include< ...