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. 文件分割合并DOS版

    这个从163邮箱里翻出来的程序,2004年的修改日期,放这另存一下. 当时拿了一本C++的书来学,学了一阵就琢磨着做一个东东,然后就想起一个以前印象深刻的软件,叫做笨笨狗分割器. 当时主要还是靠3.5 ...

  2. java_爬虫_获取经过js渲染后的网页源码

    md 弄了一天了……(这个月不会在摸爬虫了,浪费生命) 进入正题: 起初是想写一个爬虫来爬一个网站的视频,但是怎么爬取都爬取不到,分析了下源代码之后,发现源代码中并没有视频的dom 但是在浏览器检查元 ...

  3. 磁盘分区(1):fdisk和parted

    一.Linux存储管理 关于Linux硬盘的识别: (1)如果是IDE设备,在计算机中将被识别为hd,第一个IDE设备会被识别为hda,第二个IDE设备会被识别为hdb,依此类推. (2)如果是SAT ...

  4. Custom LED Keychain, Small And Surefire Gifts

    The    LED Keychain    makes it easy for people to carry their keys with them and carry them with th ...

  5. java项目连接Oracle配置文件

    转载自:https://blog.csdn.net/shijing266/article/details/42527471 driverClassName=oracle.jdbc.driver.Ora ...

  6. macos 杀掉端口 命令行

    sudo lsof -i:3000 kill 11111 1111就是pid下面的数字

  7. 【转载】Mapreduce实现自定义的InputFormat

    转自:http://www.cnblogs.com/dlutxm/archive/2011/09/30/2196653.html 在mapreduce程序运行的开始阶段,hadoop需要将待处理的输入 ...

  8. SqlDataAdapter、DataSet、DataTable使用

    原文链接:https://blog.csdn.net/zhang_hui_cs/article/details/7327395 using System.Data; using System.Data ...

  9. Form DataGridView绑定BindingSource的几种方式

    本文链接:https://blog.csdn.net/qq_15138169/article/details/83341076 在WinForm的开发中,ListView和DataGridView应用 ...

  10. 微服务介绍和springCloud组件

      微服务架构模式是:将整个web服务 组织成一系列小的web 服务,这些小的web服务可以进行独立的编译和部署,并通过各自暴露的API接口 进行相互通信,他们相互协作,作为一个整体,为客户提供服务功 ...