第十章C++标准模板库
C++的标准模板库
![C++的标准模板库](https://img.taocdn.com/s3/m/0de23dfd0242a8956bece4d1.png)
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++标准模板库](https://img.taocdn.com/s3/m/18b6320d4a7302768e993944.png)
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](https://img.taocdn.com/s3/m/216d972058fb770bf78a5522.png)
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)](https://img.taocdn.com/s3/m/335d714f33687e21af45a91e.png)
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介绍](https://img.taocdn.com/s3/m/cae3a927915f804d2b16c134.png)
C完整PPT课件第10章泛型程序设计与C标准模板库
![C完整PPT课件第10章泛型程序设计与C标准模板库](https://img.taocdn.com/s3/m/82246993aef8941ea76e0589.png)
适配器
第十章 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](https://img.taocdn.com/s3/m/f5e200a8964bcf84b8d57b65.png)
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++标准模板库简介](https://img.taocdn.com/s3/m/3f8f4e46e518964bcf847c7d.png)
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
C++模板与标准模板库
![C++模板与标准模板库](https://img.taocdn.com/s3/m/d4a6e0e75ef7ba0d4a733b38.png)
template< class T > T& Array< T >::operator [] ( int i ) { if (i < 0 || i >= size) { cerr << "index " << i << "Out of bounds: "; return dummy_val; } return a[i]; }
}
#include < iostream > #include < string > #include < list > using namespace std; void dump( list< sting > &);
int main() { list< string > names; names.insert( names.begin(), "Kamiko" ); names.insert( names.end(), "Andre" ); names.insert( names.begin(), "Chengwen" ); names.insert( names.begin(), "Maria" ); dump( names );
private: int* a; int size; intArray(); //*** for emphasis int dummy_val; //arbitrary value };
int& intArray::operator [] ( int i ) { if (i < 0 || i >= size) { cerr << "index " << i << "Out of bounds: "; return dummy_val; } return a[i]; }
标准模板库优秀课件
![标准模板库优秀课件](https://img.taocdn.com/s3/m/e5af30cc964bcf84b8d57bb2.png)
习题
• 1.包含10个元素的序列逐个插入verctor容器中,插入完成后将 verctor容器中的所有元素输出。
• 【解答】该试题主要考查verctor容器的使用。根据前面的学习 ,读者知道verctor容器利用索引直接存取任何一个元素,在尾 部插入元素或移除元素均非常快速。此处可以调用verctor容器 的一些函数即可,需要读者注意的是,在头文件中必须加上 verctor。
多重集合(multiset) 栈(stack)
队列(queue)
连续存储的元素 由节点组成的双向链表,每个节点包含着一个元素
连续存储的指向不同元素的指针所组成的数组
由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排 列,没有两个不同的元素能够拥有相同的次序 允许存在两个次序相等的元素的集合 后进先出的值的排列 先进先出的执的排列
• 2.编写一个C++程序,创建了一个矢量容器(STL的和数组等 价的对象),并使用迭代器在其中搜索,找到值为100的元素。
标准模板库
课程内容安排
• 标准模板库 • 算法 • 容器 • 迭代器 • 指针与引用的区别 • 小结 • 习题
标准模板库
• STL(Standard Template Library),即标准模板库,是一 个具有工业强度的、高效的C++程序库。它被容纳于C++标准 程序库(C++ Standard Library)中,是ANSI/ISO C++标准 中最新的也是极具革命性的一部分。该库包含了诸多在计算机 科学领域里所常用的基本数据结构和基本算法,为广大C++程 序员们提供了一个可扩展的应用框架,高度体现了软件的可复 用性。这种现象有些类似于Microsoft Visual C++中的MFC( Microsoft Foundation Class Library) , 或 者 是 Borland C++ Builder中的VCL(Visual Component Library)。
C++标准模版库使用简介
![C++标准模版库使用简介](https://img.taocdn.com/s3/m/b2cf58f5f90f76c661371a25.png)
C++标准模板库使用2005年8月目录一、模板简单介绍: (3)1. 函数模板 (3)2. 类模板 (4)二、STL概论 (6)三、STL的组件以及关系 (6)四、常用容器介绍 (7)1. 序列式容器 (7)1.1 Vector (7)1.2 List (16)2. 关联式容器: (22)2.1 Set (22)2.2 multiset (24)2.3 map (27)2.4 multimap (29)五、写在后面 (34)六、附录:如何选择容器 (34)一、模板简单介绍:1.函数模板请看看下面这个题目:实现一个函数,输入2个变量,输出这两个变量中值比较大的元素。
要求:此函数可以接受int、char以及double类型的参数。
对于这个问题,如果是C语言的话,估计实现会是这个样子:// 用于比较char的函数char MaxOfChar( char cNum1, char cNum2 ){return ( cNum1 > cNum2 ) ? cNum1 : cNum2;}// 用于比较int的函数int MaxOfInt( int iNum1, int iNum2 ){return ( iNum1 > iNum2 ) ? iNum1 : iNum2;}// 用于比较double的函数double MaxOfDouble( double dNum1, double dNum2 ){return ( dNum1 > dNum2 ) ? dNum1 : dNum2;}但是到了C++时代,由于存在重载的概念,所以实现起来应该是这个样子:// 用于比较char的函数char Max( char cNum1, char cNum2 ){return ( cNum1 > cNum2 ) ? cNum1 : cNum2;}// 用于比较int的函数int Max( int iNum1, int iNum2 ){return ( iNum1 > iNum2 ) ? iNum1 : iNum2;}// 用于比较double的函数double Max( double dNum1, double dNum2 ){return ( dNum1 > dNum2 ) ? dNum1 : dNum2;}对比上面两个例子,对于函数的实现来说,代码量没有什么变化,只不过函数的名字由3个变成了1个。
标准模板库
![标准模板库](https://img.taocdn.com/s3/m/ce94652f52ea551810a687ae.png)
标准模板库标准模板库,也叫STL,是一个 C++ 容器类库,算法和迭代器。
他提供许多基本算法,数据结构。
STL 是一个通用库,即可以充份定制:几乎所有的 STL 组件都是模板。
在你使用 STL 前,你必须了解模板的工作情况。
容器和算法和许多类库一样,STL 包含容器类 - 可以包含其他对象的类。
STL 包含向量类,链表类,双向队列类,集合类,图类,等等。
他们中的每个类都是模板,能包含各种类型的对象。
例如,你可以用 vector<int> ,就象常规的 C 语言中的数组,除了 vector 不要你象数组那样考虑到动态内存分配的问题。
vector<int> v(3); // 定义一个有三个元素的向量类v[0] = 7;v[1] = v[0] + 3;v[2] = v[0] + v[1]; // v[0] == 7, v[1] == 10, v[2] == 17STL 还包含了大量的算法。
他们巧妙地处理储存在容器中的数据。
你能够颠倒vector 中的元素,只是简单使用 reverse 算法。
reverse(v.begin(), v.end()); // v[0] == 17, v[1] == 10, v[2] == 7在调用 reverse 的时候有两点要注意。
首先,他是个全局函数,而不是成员函数。
其次,他有两个参数,而不是一个:他操作一定范围的元素而不是操作容器。
在这个例子中他正好是对整个容器 V 操作。
以上两点的原因是相同的:reverse 和其他 STL 算法一样,他们是通用的,也就是说, reverse 不仅可以用来颠倒向量的元素,也可以颠倒链表中元素的顺序。
甚至可以对数组操作。
下面的程序是合法的。
double A[6] = { 1.2, 1.3, 1.4, 1.5, 1.6, 1.7 };reverse(A, A + 6);for (int i = 0; i < 6; ++i)cout << "A[" << i << "] = " << A[i];这个例子也用到了范围,和我们上面的向量的例子一样:第一个参数是指向要操作的范围的头的指针,第二个参数是指向尾的指针。
10类库和C++的标准模板库STL
![10类库和C++的标准模板库STL](https://img.taocdn.com/s3/m/981521e3f61fb7360b4c65ed.png)
using name::member;
• 可使用using name::member;命令把名字空 间name中的成员引入到当前作用域。如 下例所示。 #include <iostream> using namespace std; #include "header1.h" #include "header2.h"
• 例如,有两个头文件:
//header1.h char *user_name = "myown1"; //header2.h char *user_name = "myown2";
#include <iostream.h> #include "header1.h" #include "header2.h"
名字空间 namespace
• 使用名字空间来划分全局名字空间可 以避免名字冲突。
• 解决的办法就是将程序中相同的名字 定义在两个不同的名字空间中。
名字空间 namespace (续)
• 名字空间就是为解决C++中的变量、函数 等的名字冲突而服务的。 • 程序规模越大,名字空间就越有用。 The larger a program is, the more useful namespaces are to express logical separations of its parts. namespace又译作 :命名空间、名称空间
用命名空间限制符 myown1访问变量 user_name
cout<< "\n"<< "Hello, "
10第十章 C++标准模板库
![10第十章 C++标准模板库](https://img.taocdn.com/s3/m/9667d3b169dc5022aaea009b.png)
顺序容器
容 器
顺序容器:其中的元素被视为逻辑上线性排列 的,有头有尾,有前导有后继,索引值即位臵 值。 以上特点使顺序容器可以随机访问其中的元素。 STL 提供三个基本顺序容器: – vector list deque STL 还提供三个容器适配器: – stack queue priority_queue
21
cout << "Data in Container-1 :" << container1[0] << container1[1] << container1[2] <<"\n"; cout << "Data in Container-2 :" << container2[0] << container2[1] << container2[2] <<"\n";
for(i = 3; i < n; i++) 找出哪些语句使用 { if (primecount == A.size()) 了向量的接口? 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; }
标准库与标准模板库
![标准库与标准模板库](https://img.taocdn.com/s3/m/0464e59885868762caaedd3383c4bb4cf7ecb77f.png)
标准库与标准模板库C++强⼤的功能来源于其丰富的类库及库函数资源。
C++标准库的内容总共在50个标准头⽂件中定义。
在C++开发中,要尽可能地利⽤标准库完成。
这样做的直接好处包括:(1)成本:已经作为标准提供,何苦再花费时间、⼈⼒重新开发呢;(2)质量:标准库的都是经过严格测试的,正确性有保证;(3)效率:关于⼈的效率已经体现在成本中了,关于代码的执⾏效率要相信实现标准库的⼤⽜们的⽔平;(4)良好的编程风格:采⽤⾏业中普遍的做法进⾏开发。
⼀、C++标准库C++标准库的内容分为10类,分别是:(⼀)语⾔⽀持;(⼆)输⼊/输出;(三)诊断;(四)⼀般⼯具;(五)字符串;(六)容器;(七)迭代器⽀持;(⼋)算法;(九)数值操作;(⼗)本地化。
(⼀)标准库中与语⾔⽀持功能相关的头⽂件(11个)头⽂件描述<cstddef>定义宏NULL和offsetof,以及其他标准类型size_t和ptrdiff_t。
与对应的标准C头⽂件的区别是,NULL是C++空指针常量的补充定义,宏offsetof接受结构或者联合类型参数,只要他们没有成员指针类型的⾮静态成员即可。
<limits>提供与基本数据类型相关的定义。
例如,对于每个数值数据类型,它定义了可以表⽰出来的最⼤值和最⼩值以及⼆进制数字的位数<climits>提供与基本整数数据类型相关的C样式定义。
这些信息的C++样式定义在<limits>中<cfloat>提供与基本浮点型数据类型相关的C样式定义。
这些信息的C++样式定义在<limits>中<cstdlib>提供⽀持程序启动和终⽌的宏和函数。
这个头⽂件还声明了许多其他杂项函数,例如搜索和排序函数,从字符串转换为数值等函数。
它与对应的标准C头⽂件stdlib.h不同,定义了abort(void)。
abort()函数还有额外的功能,它不为静态或⾃动对象调⽤析构函数,也不调⽤传给atexit()函数的函数。
c++ 标准模板 手册
![c++ 标准模板 手册](https://img.taocdn.com/s3/m/3aeabf9251e2524de518964bcf84b9d529ea2c6d.png)
c++ 标准模板手册C++标准模板库(Standard Template Library,STL)是C++语言的一个重要组成部分,提供了一套丰富的模板类和函数,用于实现常用的数据结构和算法。
STL的设计目标是提供高效、可靠和可复用的代码,使开发人员能够快速地开发高质量的C++程序。
STL包含了三个主要的组件:容器(Containers)、算法(Algorithms)和迭代器(Iterators)。
容器是STL的核心组件之一,提供了一系列的数据结构,例如向量(vector)、链表(list)、集合(set)、映射(map)等。
这些容器类提供了高度封装的接口,使得开发人员可以方便地操作和管理数据。
容器类的设计考虑了高效性能和内存管理,可以自动调整内存大小,提供了一系列的成员函数和操作符重载,方便开发人员进行数据的插入、删除、查找等操作。
算法是STL的另一个重要组成部分,提供了一系列的通用算法,例如排序、查找、遍历等。
这些算法可以应用于各种容器类,使得开发人员可以方便地对数据进行处理和操作。
STL的算法库是高度模板化的,可以适用于不同类型的数据,提供了丰富的功能和灵活的接口。
迭代器是STL的第三个重要组件,用于遍历和访问容器中的元素。
迭代器提供了一种统一的访问容器元素的方式,使得开发人员可以方便地对容器进行遍历和操作。
迭代器可以分为输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器等不同类型,每种类型的迭代器提供了不同的功能和操作。
除了容器、算法和迭代器,STL还提供了一些其他的组件,例如函数对象(Function Objects)、适配器(Adapters)等。
函数对象是一种可调用的对象,可以像函数一样被调用,用于对容器中的元素进行处理和操作。
适配器是一种用于修改或扩展现有组件功能的工具,例如堆栈适配器(stack adapter)可以将一个容器适配为堆栈结构。
C++标准模板库的手册提供了详细的文档和示例,介绍了STL的各个组件和功能的使用方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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() {