第十章C++标准模板库

合集下载

C++的标准模板库

C++的标准模板库

C++的标准模板库(Standard Template Library,简称STL)是一个容器和算法的类库。

容器往往包含同一类型的数据。

STL中比较常用的容器是vector,set和map,比较常用的算法有Sort等。

.一. vector1.声明:一个vector类似于一个动态的一维数组。

vector<int> a; //声明一个元素为int类型的vector avectot<MyType> a; //声明一个元素为MyType类型的vector a这里的声明的a包含0个元素,既a.size()的值为0,但它是动态的,其大小会随着数据的插入和删除改变而改变。

vector<int> a(100, 0); //这里声明的是一已经个存放了100个0的整数vector 2.向量操作常用函数:size_t size(); // 返回vector的大小,即包含的元素个数void pop_back(); // 删除vector末尾的元素,vector大小相应减一void push_back(); //用于在vector的末尾添加元素T back(); // 返回vector末尾的元素void clear(); // 将vector清空,vector大小变为0其他访问方式:cout<<a[5]<<endl;cout<<a.at(5)<<endl;以上区别在于后者在访问越界时会抛出异常,而前者不会。

例:int intarray[10];vector<int> first_vector(intarray, intarray + 10);vector<int> second_vector(first_vector.begin(),first_vector.end());class man{public:AnsiStirng id;AnsiString mc;}vector<man> manList;man thisman;thisman.id="2001";="yourname";manList.push_back thisman; //加入第一个元素thisman.id="2002";="myname";manList.push_back thisman; //加入第二个元素manList.clear(); //清空3.遍历(1). for(vector<datatype>::iterator it=a.begin(); it!=a.end();it++)cout<<*it<<endl;(2). for(int i=0;i<a.size;i++)cout<<a[i]<<endl;二. mapMap是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性map内部的实现自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能。

C++标准模板库

C++标准模板库

std::map
map或multimap是一个字典模板类,其索引可以是任意用户 指定类型。且能按用户指定排序规则将map内的数据进行排 序的集合库,map内不允许有相同的数据,而multimap允许 有重复数据。 namespace std { template <class Key, class T, class Compare = less<Key>, class Allocator = allocator<pair<const Key,T> > > class map; template <class Key, class T, class Compare = less<Key>, class Allocator = allocator<pair<const Key,T> > > class multimap; }
STL容器库
<string> <vector> <list> <set> <map> 通用字符串库 通用向量(数组)库 通用链表库 通用集合库 通用字典库
std::string
string&wstring string是一个处理字符串数据的类,支持变长 字符串,支持随机存取。 wstring接口同string相同,只是其处理的是宽 字符(wchar_t)数据。 typedef base_string<char> string typedef base_string<wchar_t> wstring
模板举例
模板函数 template<typename T> T max(T a,T b) { return a>b?a:b; } int x=10,y=15; std::cout<<max<int>(x,y)<<std::endl;

C++_标准模板类库STL

C++_标准模板类库STL

11.1 基本数据结构知识11.2 标准模板类库STL 简介11.3 向量11.4 链表类的使用11.5 双端队列11.6 栈与队列11.7 集合第11 章标准模板类库STLC++语言的标准模板类库STL(Standard Template Library)已经成为一个标准,它是一个基于模板的群性类库,包含群体类(链表、向量、栈、队列、集合、映象),算法(排序、查找)以及迭代子(iterator)。

本章将着重介绍STL 的使用。

实现了数组和链表,它们属于线性群体。

还有两种特殊的线性群体:栈和队列。

Ele1……Ele2Elen入栈出栈栈顶栈底图栈的示意图栈是只能从一端访问的线性群体,可以访问的这一端称栈顶,另一端称栈底。

对栈顶位置的标记称为栈顶指针,对栈底位置的标记称为栈底指针。

向栈顶添加元素称为“压入栈”(push),删除栈顶元素称为“弹出栈”(pop)。

栈中元素的添加和删除操作具有“后进先出”(LIFO )的特性。

【11.1 基本数据结构知识】有一种限定的线性数据群体叫双端队列,它类似于限定删除和插入操作都必须在两端进行的链表。

队列是一种特殊的线性群体。

队列只能向一端添加元素,从另一端删除元素的线性群体,可以添加元素的一端称队尾,可以删除元素的一端称队头。

对队头位置的标记称为队头指针,对队尾位置的标记称为队尾指针。

Ele1出队入队Ele2Elen ……队头队尾非线性群体:集合和映射。

集合由若干个元素组成,对于一个指定的元素,它或者属于该集合,或者不属于;可以对两个集合求交集和差等。

映射则类似于字典的功能,如一个身份证号码可以映射为某个确定的人,图书馆中一本书的编号和这本书也是一个映射。

向队尾添加元素称为“入队”,删除队头元素称为“出队”。

队列中元素的添加和删除操作具有“先进先出”(FIFO )的特性。

图队列的逻辑结构示意图1994年7月,STL 正式成为标准C++库的一部分。

STL 中的群体类是基于模板的,它既包含线性群体类,也包含非线性群体类,其中主要有:vector(向量)list(链表)stack(栈)queue(队列)deque(双端队列)set(集合)map(映射)STL 的迭代子可以看成是指针的推广,迭代子也可以是普通的指针。

C++ 标准模板库(STL)

C++ 标准模板库(STL)
目录
1 STL 简介 ..............................................................................................................................................2 2 顺序性容器...........................................................................................................................................2
首先,vector 会申请一块更大的内存块; 然后,将原来的数据拷贝到新的内存块中; 其次,销毁掉原内存块中的对象(调用对象的析构函数); 最后,将原来的内存空间释放掉。 如果vector 保存的数据量很大时,这样的操作一定会导致糟糕的性能(这也 是vector 被设计成比较容易拷贝的值类型的原因)。所以说vector 不是在什么情 况下性能都好,只有在预先知道它大小的情况下vector 的性能才是最优的。
vector 的特点:
(1) 指定一块如同数组一样的连续存储,但空间可以动态扩展。即它可以像数组 一样操作,并且可以进行动态操作。通常体现在push_back() pop_back() 。 (2) 随机访问方便,它像数组一样被访问,即支持[ ] 操作符和vector.at() (3) 节省空间,因为它是连续存储,在存储数据的区域都是没有被浪费的,但是 要明确一点vector 大多情况下并不是满存的,在未存储的区域实际是浪费的。 (4) 在内部进行插入、删除操作效率非常低,这样的操作基本上是被禁止的。 Vector 被设计成只能在后端进行追加和删除操作,其原因是vector 内部的实现 是按照顺序表的原理。 (5) 只能在vector 的最后进行push 和pop ,不能在vector 的头进行push 和pop 。 (6) 当动态添加的数据超过vector 默认分配的大小时要进行内存的重新分配、拷 贝与释放,这个操作非常消耗性能。 所以要vector 达到最优的性能,最好在创 建vector 时就指定其空间大小。

C++标准模板库STL介绍

C++标准模板库STL介绍
2 C++基础 ........................................................................................................................................4 2.1 类........................................................................................................................................4 2.2 函数对象(Function Objects)..............................................................................................5 2.3 模板(Template) ..................................................................................................................5 2.3.1 函数模板.................................................................................................................5 2.3.2 类模板.....................................................................................................................6 2.3.3 模板特化.................................................................................................................7

C完整PPT课件第10章泛型程序设计与C标准模板库

C完整PPT课件第10章泛型程序设计与C标准模板库

适配器
第十章 C++标准模板库
概 适配器是一种接口类

为已有的类提供新的接口。

目的是简化、约束、使之安全、隐藏或者 改变被修改类提供的服务集合。
术 三种类型的适配器:

容器适配器
用来扩展7种基本容器,它们和顺序容器相结 合构成栈、队列和优先队列容器
迭代器适配器
函数对象适配器。
迭代器
第十章 C++标准模板库
int i, key, item;
for(i=0;i < 10;i++)// 输入10个整数依次向表头插入
{
cin>>item;
Link.push_front(item);
}
cout<<"List: "; // 输出链表
15
list<int>::iterator p=Link.begin();
while(p!=Link.end())//输出各节点数据,直到链表尾
列表主要用于存放双向链表,可以从任意一端开始遍

历。列表还提供了拼接(splicing)操作,将一个 序列中的元素从插入到另一个序列中。
例10-3 改写例9-7

从键盘输入10个整数,用这些整数值作为结点数 据,生成一个链表,按顺序输出链表中结点的
数值。然后从键盘输入一个待查找整数,在链
表中查找该整数,若找到则删除该整数所在的
第十章 C++标准模板库
命名空间(Namespace)
概 念
一个命名空间将不同的标识符集合在一个命名作用域
(named scope)内 为了解决命名冲突

C标准模板库.ppt

C标准模板库.ppt
✓ vector(vector<T>& X)
C++标准模板库
(Standard Template Library, 简称STL)
17:37:52
1
标准模板库简介
❖ 库(library)是一系列程序组件的集合,它们可以在不同的 程序中重复使用。库函数设计的第一位的要求就是通用性
❖ 模板(template)为通用性带来了不可估量的前景。
❖ 标准模板库(Standard Template Library)简称STL,是 C++最有特色、最实用的部分之一。
❖ STL包含: 容器类(container)、 迭代器(iterator)、 算法 (algorithm)、函数对象(function object)
17:37:52
2
泛型程序设计 与标准模板库有关的概念和术语 容器类 迭代器 算法 函数对象
17:37:52
3
泛型程序设计
❖ 将程序写得尽可能通用 ❖ 将算法从特定的数据结构中抽象出来,成为通用的 ❖ C++的模板为泛型程序设计奠定了关键的基础 ❖ STL是泛型程序设计的一个范例
17:37:52
10
标准库容器共有的函数
说明
operator= swap() operator<
operator<=
operator>
operator>=
operator==
operator!=
将一个容器赋值复制给另一个同类容器 交换两个容器的元素 如果前面的容器小于后面的容器,则返回true,否 则返回false,不适用于priority_queue 如果前面的容器小于等于后面的容器,则返回true ,否则返回false,不适用于priority_queue 如果前面的容器大于后面的容器,则返回true,否 则返回false,不适用于priority_queue 如果前面的容器大于等于后面的容器,则返回true ,否则返回false,不适用于priority_queue 如果前面的容器等于后面的容器,则返回true,否 则返回false,不适用于priority_queue 如果前面的容器不等于后面的容器,则返回true, 否则返回false,不适用于priority_queue

C++标准模板库简介

C++标准模板库简介
vector( size_type count, ConstType & Val ) 说明:构造一个vector,初始元素个数为count,初始值均为Val。 例: vector< int > iv( 3, 2 );
vector( const vector& SourceVector ) 说明:构造一个新vector,并将SouceVector中的元素完全复制到 新的vector中。 例: vector< int > iv1; vector< int > iv2( iv1 ); reference at( size_type Pos ) 说明:取得vector在Pos位置的元素的数据,此函数和数组下标用 法类似。 例: vector < int > iv; iv.push_back( 1 ); iv.push_back( 2 ); iv.push_back( 3 ); int i = iv.at(2); //此时i的值应该是3 size_type size() const 说明:返回vector中实有元素个数。
再向vector尾部加入一个元素“2” :
0 1 2 在这个操作之前,vector空间为2,向vector中再加入元素时发现 空间不够,则以原空间的2倍申请一块新的内存,于是: iv.size( ) == 3 iv.capacity( ) == 4 黑色块表示预留空间,用于以后加入新元素之用,这是vector的策 略。前面说过,vector的空间是连续的,而且得到的堆空间之后的 空间不见得是“一片空地”,不能用简单扩张来取得新空间,于是 要用三个一连串的动作来完成新地盘的取得。而连续空间的申请和 释放操作都相当耗费时间。 为了避免频繁申请和释放,就采用了 “预留空间”策略。但这样的做的弊端也非常明显——空间浪费。 P
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

符都声明在命名空间std中,头文件都
不使用扩展名
.
5
C++语言程序设计
容器
清华大学 郑莉

容器类是容纳、包含一组元素或元素 集合的对象。
念 异类容器类与同类容器类
和 术 语
顺序容器与关联容器 七种基本容器:
– 向量(vector)、双端队列(deque)、
列表(list)、集合(set)、多重集合
C++的模板为泛型程序设计奠定了关键的基 础
STL是泛型程序设计的一个范例
– 容器(container) – 迭代器(iterator) – 算法(algorithms) – 函数对象(function object)
.
3
C++语言程序设计
清华大学 郑莉
命名空间(namespace)
பைடு நூலகம்
一个命名空间将不同的标识符集合在一个
vector<int> A(10); int n; int primecount = 0, i, j; cout<<"Enter a value>=2 as upper limit: "; cin >> n; A[primecount++] = 2;
13
for(i = 3; i < n; i++) { if (primecount == A.size())
术 这些算法的一个最重要的特性就是它
语 们的统一性,并且可以广泛用于不同
的对象和内置的数据类型。
.
10
C++语言程序设计
顺序容器
清华大学 郑莉
顺序容器的接口

– 插入方法
push_front(),push_back(),insert(),运算符“=”
– 删除方法

pop() ,erase(),clear()
– 迭代访问方法
使用迭代器
– 其他顺序容器访问方法(不修改访问方法)
front(),back(),下标[]运算符
.
11
C++语言程序设计
顺序容器——向量
清华大学 郑莉
向量属于顺序容器,用于容纳不定长

线性序列(即线性群体),提供对序 列的快速随机访问(也称直接访问)
向量是动态结构,它的大小不固定,
.
8
C++语言程序设计
迭代器
清华大学 郑莉
概 念 和
迭代器是面向对象版本的指针,它 们提供了访问容器、序列中每个元素的 方法。


.
9
C++语言程序设计
算法
清华大学 郑莉
概 念 和
C++标准模板库中包括70多个算法
– 其中包括查找算法,排序算法,消除算 法,记数算法,比较算法,变换算法, 置换算法和容器管理等等。
A.resize(primecount + 10); if (i % 2 == 0)
continue; j = 3; while (j <= i/2 && i % j != 0)
j += 2; if (j > i/2) A[primecount++] = i; } for (i = 0; i<primecount; i++)//输出质数 { cout<<setw(5)<<A[i]; if ((i+1) % 10 == 0) //每输出10个数换行一次
cout << endl; } cout<<endl; }
14
C++语言程序设计
清华大学 郑莉
顺序容器——双端队列
双端队列是一种放松了访问权限的队

列。元素可以从队列的两端入队和出 队,也支持通过下标操作符“[]”进行
直接访问。
器 例10-2
– 使用双端队列容器保存双精度数值序列
.
15
C++语言程序设计

命名作用域(named scope)内
念 和
– 为了解决命名冲突 – 例如,声明一个命名空间NS:
namspace NS {

class File; void Fun ();

}
则引用标识符的方式如下,
NS:: File obj;
NS:: Fun ();
没有声明命名空间的标识符都处于无名的
命名空间中
(multiset)、映射(map)和多重映射
(multimap)
.
6
C++语言程序设计
容器的接口
清华大学 郑莉
通用容器运算符
– ==,!=,>,>=,<,<=,=
方法(函数)
–迭代方法
begin(),end(),rbegin(),rend()
–访问方法
size(),max_size(),swap(),empty()
.
4
C++语言程序设计
清华大学 郑莉
命名空间(续)
可以用using来指定命名空间

– 例如,经过以下声明:

using NS::File;

在当前作用域中就可以直接引用File
术 语
– using namespace std; 命名空间std中所有标识符都可直接引用
在新的C++标准程序库中,所有标识
.
7
C++语言程序设计
适配器
清华大学 郑莉
概 念
适配器是一种接口类
– 为已有的类提供新的接口。 – 目的是简化、约束、使之安全、隐藏或

者改变被修改类提供的服务集合。
术 三种类型的适配器:

– 容器适配器
用来扩展7种基本容器,它们和顺序容器相结 合构成栈、队列和优先队列容器
– 迭代器适配器
– 函数对象适配器。
链表中查找该整数,若找到则删除该整数所在
的结点(如果出现多次,全部删除),然后输
顺序容器——列表
清华大学 郑莉
列表主要用于存放双向链表,可以从任意
一端开始遍历。列表还提供了拼接

(splicing)操作,将一个序列中的元素从
插入到另一个序列中。
例10-3 改写例9-7

– 从键盘输入10个整数,用这些整数值作为结点
数据,生成一个链表,按顺序输出链表中结点
的数值。然后从键盘输入一个待查找整数,在
C++语言程序设计
第十章 C++标准模板库
清华大学 郑 莉
C++语言程序设计
主要内容
清华大学 郑莉
泛型程序设计 与标准模板库有关的概念和术语 C++标准模板库中的容器 迭代器 标准C++库中的算法 函数对象
.
2
C++语言程序设计
泛型程序设计
清华大学 郑莉
将程序写得尽可能通用
将算法从特定的数据结构中抽象出来,成 为通用的
器 可以在程序运行时增加或减少。
例10-1
– 求范围2~N中的质数,N在程序运行时由 键盘输入。
.
12
//10_1.cpp #include <iostream> #include <iomanip> #include <vector> //包含向量容器头文件 using namespace std ; int main() {
相关文档
最新文档