STL提供了一组表示容器,迭代器,函数对象和算法的模板。

容器是一个与数组类似的单元,可以存储若干个值。容器是同质的,即存储的值的类型一样。

算法是完成特定任务的处方。

迭代器能够用来遍历容器的对象,与能够遍历数组的指针类似,是广义指针。

函数对象类似于函数的对象,可以是类对象和函数指针(包括函数名,因为函数名被用作指针)

STL使能够构造各种容器(包括数组,队列,链表)和执行各种操作(搜索,排序和随机排列)。


STL不是面向对象编程,而是一种通用编程技术(generic programming)


一、vector模板类

1、创建一个vector对象,将一个vector对象赋给另一个对象,使用【】操作符来访问vector元素,要是类成为通用的,应将它设计为模板类。这正是STL所做的在头文件vector中定义了一个vector模板。

vector动态分配内存。

#include <vector>
using namespace std;
vector<int>ratings(5);
int n;
cin>>n;
vector<double>scores(n);
//由于[]重载,因此创建vector对象后可以使用通常的数组表示法来访问各个元素
ratings[0]=9;
for(int i=0;i<n;i++)
cout<<score[i]<<endl;

 2、分配器

int NUM=3;
vector<int> rating(NUM);
vector<string> titles(NUM); cout<<"you will enter\n"<<NUM<<"booktitles and your rating"<<endl;
int i;
for (i=0; i<NUM; i++) {
cout<<"enter title #"<<i+1<<":"<<endl;
getline(cin, titles[i]);
cout<<"enter your book rating"<<endl;
cin>>rating[i];
cin.get();
} for (i=0; i<NUM; i++) {
cout<<rating[i]<<':'<<titles[i]<<endl;
}

  3、可对矢量执行的操作

size()返回容器中元素个数,swap()交换两个容器的内容,begin()返回一个指向容器中第一个元素的迭代器,end()返回一个表示超过容器尾的迭代器。

什么是迭代器,它是一个广义指针,事实上,它可以是指针,也可以是一个可对其执行类似指针的操作——如解除引用(如operator*())和递增(operator++())的对象,每一个容器都定义了一个合适的迭代器,改迭代器是一个名为iterator的typedef,其作用域为整个类。例如要为vector的double类型规范声明一个迭代器。

vector<double>::iterator pd;

vector<double>scores; //假设scores是vector<double>的对象。

pd=scores.begin();

*pd=22.3;

++pd;

空字符和超过结尾的区别,空字符是一个值,而超过结尾是一个指向元素的指针(迭代器)

push_back()是一个方便的方法,它将新元素添加到矢量尾,这样做时,它将负责内存管理,增加矢量长度,使之容纳新成员。

 

    vector<int> rating;
vector<string> titles; int temple;
while (cin>>temple&&temple>=0) {
rating.push_back(temple);
}
cout<<"you enterd"<<rating.size()<<endl;

  erase()方法删除矢量中给定区间的元素,他接收两个迭代器参数。

scores.erase(scores.begin(),scores.begin()+2);

insert()方法和erase()方法相反,它接收3个迭代器参数。

vector<int>old;

vector<int>new;

4、对矢量可执行的其他操作

STL定义一个适用于所有容器类的非成员函数find()。

介绍3个普遍的STL函数:for_each(),Random_shuffle(),sort()

for_each()接收3个参数,前两个是定义容器中区间的迭代器,最后一个是指向函数的指针(最后一个参数是函数对象)。for_each()将被指向的函数应用于容器区间的各个元素,被指向的元素不能修改容器元素的值。可以用for_each()代替for循环。

vector<Review>::iterator pr;
for (pr=books.begin(); pr!=books.end(); pr++)
ShowReview(*pr);
//可以替代为
for_each (books.begin(),books.end(),ShowReview);
//这样可避免显示地使用迭代器变量

Random_shuffle()接收两个制定区间的迭代器参数,并随机排列。

random_shuffle(books.begin(),books.end());

将随机排列books矢量中的所有元素,与可用与任何容器类的for_each()不同,该函数要求容器类可以随机访问,vector类可以做到这一点。

sort()类也要求容器可以允许支持随机访问


二、通用编程技术

面向对象编程关注的是编程的数据方面,而通用编程技术关注的是算法。之间的共同点是抽象和创建可重用代码但是理念决然不动。

1、为何使用迭代器?

模板使算法独立于数据的存储类型,而迭代器使算法独立于使用的容器类型。

2、迭代器类型

STL定义了5种迭代器,输入迭代器,输出迭代器,正向迭代器,双向迭代器,随机访问迭代器。

输入迭代器是单向迭代器,可以递增,但不能倒退。

输出迭代器只能修改容器值,而不能读取。

正向迭代器总是按相同的顺序遍历一系列的值。使多次通行算法成为可能。既可以能够读取和修改数据,也可以使得只能读取数据。

双向迭代器双向迭代器具有正向迭代器所以功能,并且同时支持两种递减操作符。

随机访问迭代器,具有双向迭代器所以功能,同时添加了支持随机访问的操作。

3、迭代器的层次结构

4、容器种类

11个容器

5、序列(sequence) 

可以通过添加要求来改进基本的容器概念。 

vector可以反转容器,是最简单的序列类型,除非其他类型的特殊优点能够更好地满足程序的要求,否则默认使用这个类型。

for_each(dice.begin(),dice.end(),Show);
cout<<endl;
for_each(dice.rbegin(),dice.rend(),Show);
cout<<endl;

deque模板类表示双端队列(double-ended quene)如果多操作发生在序列的起始和结尾处,则考虑deque数据结构。

list模板类表示双向链表list在链表任意位置插入和删除时间都是一样的,强调元素的快速插入和删除。list也可以反转容器,与vector不同,list支持数组表示法和随机访问。

6、联合容器

4种

7、函数对象

8、算法

  • 非修改式序列操作
  • 修改式序列操作
  • 排序和相关操作
  • 通用数字运算

2013.7.19 STL库的学习的更多相关文章

  1. Numpy库的学习(三)

    今天我们继续学习一下Numpy库的学习 废话不多说 ,开始讲 比如我们现在想创建一个0-14这样一个15位的数组 可以直接写,但是很麻烦,Numpy中就给我们了一个方便创建的方法 numpy中有一个a ...

  2. go标准库的学习-net/http

    参考:https://studygolang.com/pkgdoc 概念解释: request:用户请求的信息,用来解析用户的请求信息,包括post.get.cookie.url等信息 respons ...

  3. 几个经典的数学库之一学习---VCGlib(2)

    几个经典的数学库之一学习---VCGlib(2) 1. Optional Component(可选的组件) 有许多Vertex和Face的属性并不是一直都是必要的,如Face-Face的邻接关系.VC ...

  4. 模拟实现STL库

    最近在复习STL,感觉再看的时候比刚开始学的时候通透很多.以前模拟实现了一个STL库,最近复习完又重构了一遍.代码放出来以供后面学习.如果有写的不好的地方欢迎大家批评指正. STL_List.h #p ...

  5. 从0开始学爬虫9之requests库的学习之环境搭建

    从0开始学爬虫9之requests库的学习之环境搭建 Requests库的环境搭建 环境:python2.7.9版本 参考文档:http://2.python-requests.org/zh_CN/l ...

  6. 【uva 1152】4 Values Whose Sum is Zero(算法效率--中途相遇法+Hash或STL库)

    题意:给定4个N元素几个A,B,C,D,要求分别从中选取一个元素a,b,c,d使得a+b+c+d=0.问有多少种选法.(N≤4000,D≤2^28) 解法:首先我们从最直接最暴力的方法开始思考:四重循 ...

  7. [转] C++的STL库,vector sort排序时间复杂度 及常见容器比较

    http://www.169it.com/article/3215620760.html http://www.cnblogs.com/sharpfeng/archive/2012/09/18/269 ...

  8. GEOS库的学习之一:介绍和编译

    对GEOS库的学习,源于一个项目:要在c++中判断二维平面中两个多边形的关系(无论凹凸).也就是判断两个多边形是否相交.相容等.听起来很简单,可实现起来却比较难,而项目又催得紧.于是我去搜索了一下,看 ...

  9. 使用STL库sort函数对vector进行排序

    使用STL库sort函数对vector进行排序,vector的内容为对象的指针,而不是对象. 代码如下 #include <stdio.h> #include <vector> ...

随机推荐

  1. CSDN Markdown简明教程4-UML画画

    0.文件夹 文件夹 前言 序列图 1 序列图演示样例 2 序列图语法 流程图 1 流程图演示样例 2 流程图语法 节点定义 节点连接 Gravizo 声明 1. 前言 Markdown是一种轻量级的标 ...

  2. SQL Server编程系列(1):SMO介绍

    原文:SQL Server编程系列(1):SMO介绍 续篇:SQL Server编程系列(2):SMO常用对象的有关操作 最近在项目中用到了有关SQL Server管理任务方面的编程实现,有了一些自己 ...

  3. Eclipse:引用一个项目作为库(图文教程)

    前言:工程TestRoid要引用Volley项目作为一个库 过程,如下面: 一:选择导入Android工程 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc ...

  4. linux高级技巧:rsync同步(一个)

    1.rsync基本介绍         rsync这是Unix下的一款应用软件,它能同步更新两处计算机的文件与文件夹,并适当利用差分编码以降低数据传输.rsync中一项与其它大部分类似程序或协议中所未 ...

  5. jQuery中的 return false, e.preventDefault(), e.stopPropagation()的区别

    e.stopPropagation()阻止事件冒泡 <html><head>     <title></title>     <script sr ...

  6. ASP.NET MVC 使用TryUpdateModel 更新的技巧

    有使用 ASP.NET MVC 的朋友應該會對於 TryUpdateModel 有一定的認知,他不但可以利用 Metadata 來做欄位的驗證確保資料的正確性,也可以指定更新的條件以及不更新的條件來達 ...

  7. linux_java_redis_postgresql_常用命令

     redis 常用语法telnet 192.168.18.210 6379keys *llen队列名称llen 队列名称 postgresql常用语法psql -h192.168.18.210 -Up ...

  8. oracle_自动备份用户数据,删除N天前的旧数据(非rman,bat+vbs)

    有时数据没有实时备份恢复那么高的安全性需求,但每天 ,或者定期备份表结构 和数据依旧是很有必要的,介绍一种方法 在归档和非归档模式均可使用的自动备份方法. 预期效果是备份用户下的数据含表结构,备份文件 ...

  9. cocos2dx 3.0正式版 于mac在新建项目

    下载cocos2dx 3.0正式版,和安装python2.7.*版本号. 加入cocos命令: mac下: 在cocos2d-x\tools\cocos2d-console\bin文件夹下.执行ins ...

  10. vS2010 列表控件 加入右键菜单

    1.首先,就需要信息加入权限控制,例如,下面的对话框弹出 2,例如以下图选择须要的消息响应,这里选择NM_RCLICK 消息. 3,加入例如以下代码 </pre><pre name= ...