10第十章 C++标准模板库

合集下载

C “准”标准库BOOST简介

C  “准”标准库BOOST简介

C++“准”标准库Boost简介标准C++的当前版本发布于1998,它为传统的面向过程编程、面向对象编程和泛型编程提供了坚实的支持。

正如旧C++(1998之前的)独力承担了把面向对象普及到日常的软件开发中一样,C++98在为泛型编程做着同样的事情。

九十年代中期标准模板库(STL)与标准C++的集成已经引起了另一次编程范式的转变,就象八十年代的时候Bjarne Stroustrup把类引入到C一样。

现在大多数的C++开发者都熟悉STL的概念,这再次提升了整体的水平。

C++能力的应用仍旧被不断发现。

今天许多的C++库,包括特殊的数学库,都大量利用了模板元编译的技术,它是设计C++模板的时候没有预测到的幸运结果。

随着C++社区里的高级工具和技术不断涌现,开发复杂应用软件正变得更简单、更令人愉快。

很难描述Boost对于C++世界的重要性。

自从C++98发布后,除了ISO的标准C++委员会,没有一个团体对于C++的发展方向有比Boost更大的影响(许多Boost的成员本身就是WG21的重要成员,包括它的创始人,我的朋友Beman Dawes)。

成千上万个杰出的Boost志愿者无私地,以对等审查方式开发了许多C++98没有提供的很有用的库。

这些库中的十个已被接受将加入到即将到来的C++0x的库中,更多的库正被考虑接受。

Where a library approach has been shown to be wanting,the wisdom gained from the cross-pollination of Boost and WG21 has suggested a few modest language enhancements,which are now being entertained.你不太可能没有听说过Boost,我来问一下你…你需要在文本和数字之间进行转换,或在任意的可流处理的类之间进行转换?没有问题,用Boost.lexical_cast。

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)
目录
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++标准模板库使用

c++标准模板库使用

当然我们不建议这么做,因为宏没有类型检查。
上面是一个函数模板的实现,我们在后面还要提到类模板。现在先让我们来看看模板的格式。 1 template < class T >————〉○ T Max( const T &Input1, const T &Input2 ) { return ( Input1 > Input2 ) ? Input1 : Input2; } 1 这个是模板头,此项是必须的,其中 T 是一个替代符,它可以是除去固有符号(int 、long 等)的任何 ○ 字符,用来表示一个类型(可以是原生类型,也可以是自定义类型) 。 除去模板头,其它地方的书写和正常的函数定义是完全一样的。 请注意,在上面的 Input 参数中,我用的是 const&的,这样做的好处是减少函数调用时候的开销,因为 我们不知道 T 类型到底有多大。
第4页
共 35 页
NEU-APN(IA) 事业部培训资料——C++模版库使用简介
template < class T > class CVector { public: CVector() : m_Size(0) { } unsigned int Size() { return m_Size; } int push_back( const T& Element ) { if( m_Size > MAX_NUM - 1 ) { return FAILURE; } DataList[ m_Size ] = Element; m_Size++; return SUCCESS; } int pop_back( T &Element ) { if( 0 == m_Size ) { return FAILURE; } Element = DataList[ m_Size - 1 ]; m_Size --; return SUCCESS; } private: unsigned int m_Size; T DataList[ MAX_NUM ]; }; 这是一个简单的用模板实现的容器类,他可以支持各种数据类型,支持尾部添加和尾部删除操作。使用 的时候应该是这种方式: CVector< TypeName > TypeList; TypeList.push_back( Element ); TypeList.pop_back( Element ); ……… 类型名,可以是任何类型

标准模板库——精选推荐

标准模板库——精选推荐

标准模板库-------------------siwuxie095在长期的编码中,聪明的程序员们发现:有⼀些代码经常碰到,⽽且需求特别稳定,于是,各⼤公司在出售⾃⼰的 IDE 环境时,就会把这些模板代码打包,⼀起销售慢慢地,这些⼤公司之间就达成了某种共识,觉得应该把这些涉及模板的通⽤代码进⼀步的统⼀和规范,于是,⼤家慢慢形成了⼀套 C++ 的标准模板,就是现在所看到的标准模板库标准模板库标准模板库,即 Standard Template Lib,简称为 STL标准模板库所涉及的内容⾮常多,⽆法⼀⼀列举,这⾥只介绍其中具有代表性的、最常⽤的部分(1)向量 vector向量,多么⾼⼤上的名字,⼤家千万不要被它的名字所吓倒就其本质来说,向量就是对数组的封装⼤家可以把它看做是⼀个数组,只不过相对于此前所学的传统数组,向量这个数组的功能要强⼤的多,它可以根据存储的元素个数⾃动的变长或缩短,并且它具有⼀个很优秀的特点,即能够在随机读取数据的时候,在常数时间内完成,这是⾮常不容易的也就是说,⽆论这个向量中是存⼗个数据,还是存⼀万个数据,它都能够很快的从中找出我们想要的数据向量的初始化或定义的⽅法,常⽤的有 4 种:在使⽤时:第⼀⾏代码使⽤的是第⼀种初始化的⽅法,初始化了⼀个空的向量 ivec1,第⼆⾏代码是⽤空的向量 ivec1 ⼜去初始化了另外⼀个空的向量 ivec2第三⾏和第四⾏代码,同理 … 只不过参数不同罢了第五⾏代码是⽤10个-1数字初始化 ivec4,⽽第六⾏代码则是⽤10个hi!字符串来初始化 svec向量初始化之后必须要有⼀些配套的使⽤⽅法,这样程序员才能真正体会到标准模板所带来的⽅便,如下:在使⽤时:就像通过类模板去实例化⼀个模板类时⼀样,需要在 vector 后⾯的尖括号中传⼊⼀个参数,这⾥是 int,后⾯就是对象 vec 了vec 调⽤push_back() 时,就会在当前向量的尾部插⼊元素 10,⽽调⽤pop_back()就会将这个 10 抹掉,最后打印vec.size()即总共数据的个数为 0对于数组来说,遍历数组是⼀种⾮常常见的操作,⽽对于向量来说,遍历时可以像数组⼀样去遍历它,如下:除了上⾯的遍历⽅法之外,还有⼀个常⽤的遍历⽅法,即⽤迭代器来进⾏遍历迭代器,即iterator,通过它就可以访问标准模板库对象⾥的每⼀个元素如:通过迭代器去遍历向量中的每⼀个元素将向量定义为 vec,通过 vec 的push_back() 向向量中压⼊很多的元素,并依次放在向量的尾部,当然,第⼀次调⽤时,会放在第⼀个元素上 …向量迭代器的定义⽅法:在 vector 后⾯的尖括号中标记出当前的向量所使⽤的数据类型,再接⼀对冒号::,⽤它来标记出当前的迭代器是属于向量的迭代器,然后是迭代器 citer,即 citer 的数据类型是vector<string>::iterator,然后通过迭代器 citer 来指向当前向量 vec 的第⼀个元素,最后⽤ for 循环就可以⽤迭代器 citer 去遍历整个向量了遍历的⽅法很有意思:1)⾸先作为 for 循环来说,第⼀个条件可以什么都不写2)第⼆个条件,即 for 循环的截⽌条件是citer != vec.end(),其中end() 表⽰当前向量 vec 的最后⼀个元素的下⼀个位置,显然,这是合理的3)第三个条件citer++表明:citer 作为迭代器来说,是可以通过 ++来进⾏修饰的,它的意义就相当于通过⼀个指针⼜指向了向量的下⼀个元素,既然可以++,⾃然也可以--,即指向向量的上⼀个元素4)要打印当前迭代器所指向的向量的值,切记要在迭代器 citer 前加⼀个 *,这样,就指的是当前迭代器所指向的元素本⾝了(2)链表 list链表的本质,即它的数据结构,如下:链表⼀般由若⼲结点组成,如果⼀个结点都没有,称之为空链表,如果有多个结点,把第⼀个结点称之为头结点对于每⼀个结点来说,⼜由两部分组成:⼀部分是数据部分,也叫做数据域,另⼀部分是指针部分,也叫做指针域,指针部分⽤来将各个结点串联起来有⼀种链表叫双链表,即不仅可以从头找到尾,还可以从尾找到头对于链表来说,如果它想插⼊⼀个数据,如:在 D 和 E 之间插⼊数据,可以让 D 的指针域指向插⼊进来的数据,再让插⼊进来的数据的指针域指向 E可见:链表插⼊数据的操作⾮常简单,⽽向量如果想在中间插⼊⼀个数据,那么它其后的所有数据就要向后移⼀个位置,相对于链表来说,就⾮常复杂所以,对于链表来说,它的特点就是数据插⼊的速度⽐较快在使⽤⽅法上,链表与向量的使⽤⽅法基本相同,它也有 begin()、end()等等函数,并且它也可以通过迭代器进⾏遍历的访问(3)映射 map关于映射,先来看⼀下它的数据结构,如下:对于映射来说,存储的数据都是成对出现的,把它们标记为key 和value,key 称之为键,⽽ value 称之为值key 和 value 是⼀对⼀对出现的,它们往映射这种数据结构中存放时,也是⼀对⼀对去放的所以在访问时,就可以通过键来找到对应的值看如下实例:当通过映射 map 定义了⼀个对象 m 后,需要向 m 中放若⼲对key-value⽽正是通过pair来定义对,即键值对,再通过 m 调⽤insert()函数将键值对放⼊到映射当中去如果想要访问 value,就可以通过 m 接 key 的索引即可,如:通过m[10]就可以访问到shanghai,这种访问⽅式和数组很相似再看另⼀实例:与上例不同的是,key 不再是数字,⽽是字符串,通过m["S"]即可访问到shanghai程序 1:main.cpp:#include"stdlib.h"#include <iostream>#include <vector>using namespace std;int main(void){//注意向量vector是⼀个⾸字母⼩写的类型//给⼀个类的参数这⾥是int 再写变量名vector<int> vec;//从向量的尾部插⼊数据vec.push_back(3);vec.push_back(4);vec.push_back(6);//cout << vec.size() << endl;//当前数据的个数//vec.pop_back();//将尾部的数据删除(弹出)//cout << vec.size() << endl;//遍历该向量for (int i = 0; i < vec.size();i++){cout << vec[i] << endl;}//拿到向量的第⼀个元素迭代器相当于是⼀个指针通过指针指向第⼀个元素vector<int>::iterator itor = vec.begin();//cout << *itor << endl;//打印第⼀个元素//通过迭代器遍历向量//vec.end();是最后⼀个元素的下⼀个位置for (; itor != vec.end();itor++){cout << *itor << endl;}cout << endl;cout << vec.front() << endl;//取第⼀个元素cout << vec.back() << endl;//取最后⼀个元素system("pause");return0;}//向量就其本质来说其实就是数组的封装可以看做⼀个数组//只是向量这个数组相对于传统数组来说功能要强⼤的多//它可以根据存储的元素个数⾃动变长或缩短//并且具有⼀个很优秀的特点就是在能够随机读取数据的时候//在常数时间内完成(读取能在常数时间内完成)//10个或者10000个数据都能很快找出想要的数据////迭代器与类相关的如果要去迭代向量当中的每⼀个元素//就要通过向量的迭代器进⾏迭代程序 2:main.cpp:#include"stdlib.h"#include <iostream>#include <list>#include <map>#include <string>using namespace std;int main(void){list<int> list1;//链表list1.push_back(4);list1.push_back(7);list1.push_back(9);//这种遍历是错误的只能通过迭代器进⾏遍历/*for (int i = 0; i < list1.size();i++){cout << list1[i] << endl;}*/list<int>::iterator itorx = list1.begin();for (; itorx != list1.end();itorx++){cout << *itorx << endl;}cout << endl << endl;//作为映射来说存储的数据都是成对出现的前⾯的是key(键)//后⾯的是value(值)每⼀个元素都是⼀对 m是映射的对象map<int, string> m;pair<int, string> p1(3, "hello");//⼀对定义若⼲对key vallue值pair<int, string> p2(6, "world");pair<int, string> p3(9, "beijing");//映射没有 push_back() ⽅法,通过 insert() 进⾏插⼊m.insert(p1);m.insert(p2);m.insert(p3);//访问的时候通过索引加key值的⽅式即通过键来找值//若开始定义的映射是这样//map<string,string> m;//pair<string,string> p1("H","hello"); 再插⼊//访问时就可以 m["H"] 同样是通过键来找值cout << m[3] << endl;cout << m[9] << endl;cout << endl << endl;map<int, string>::iterator itor = m.begin();for (; itor != m.end();itor++){cout << itor->first << endl;//第⼀个keycout << itor->second << endl;//第⼆个valuecout << endl;//不能通过 cout<<*itor<<endl; 的⽅式访问因为作为映射来说//每⼀个元素都是⼀对也就是⼀个pair////其中包含⼀个key ⼀个value 如果直接通过*(星号)来指出这个//元素的内容的话计算机是不知道该如何输出的怎么办//必须要将key和value分别输出出来//⽅式如上}system("pause");return0;}【made by siwuxie095】。

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

C++模板与标准模板库

C++模板与标准模板库

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]; }

案例库【范本模板】

案例库【范本模板】

案例库第1章绪论1。

两种药用于同一种病,A药治疗5例,4例好转;B药治疗50例,36例好转.结论是:A药优于B药。

请问其结论合理吗?为什么?应该如何?2. 某研究者为了探讨原发性高血压患者肾小管早期损害的监控指标,选取尿常规、蛋白定性检查阴性,血肌酐、尿素氮均在正常范围内的原发性高血压患者74例作为病例组,其中男43例,女31例,平均年龄61岁(40~73岁)。

根据高血压的病程将患者分为三组,Ⅰ组高血压病期<10年,Ⅱ组高血压病期10~20年,Ⅲ组高血压病期>20年。

另选取53名体检健康的职工为对照组。

观测两组尿视黄醇结合蛋白(retinal binding protein,RBP)、微量白蛋白(microalbumin,mALB)、β2微球蛋白(β2 microglobulin,β2-MG)和N-乙酰-β-D—氨基葡萄糖苷酶(N—acetyl—β—D-glucosaminidase, NAG)四项定量指标的取值。

结论为:尿RBP、mALB、β2—MG和NAG是原发性高血压患者肾小球、肾小管早期损害的敏感指标.请辨析这样设计实验存在什么问题?正确的做法是什么?3。

某研究者的论文题目为“大学生身心健康状况及其影响因素研究”,以某地职业技术学院理、工、文、医学生(三年制)为研究对象,理、工、文、医学生分别挑选了60、38、19和46人,以问卷方式调查每位学生的一般健康状况、焦虑程度、抑郁程度等.得出的结论是:“大学生身心健康状况不容乐观,学业问题、就业压力、身体状况差、人际交往不良、社会支持不力为主要影响因素”。

请问其结论合理吗?为什么?应该如何?4。

某部队共有1 200人,在某段时间内患某病的人数有120人,其中男性114人,女性6人。

某卫生员进行统计分析后说,经假设检验,该病的两性发病率(114/120=95%与6/120=5%)之间的差别有统计学意义,由此得出结论:“该病男性易得”。

你对这个结论有何看法?若结论是错误的,那么,错误的实质是什么?正确的做法是什么?第二、三、四章1.某人编制了一张统计表(表1),你认为哪些需要改进?表1 1976—1979年吉林市各型恶性肿瘤的死亡率2.某医生观察了1 402名临产母亲的住院天数(表2),并得到平均住院天数为6.6天.请对此发表评论。

C++标准模版库使用简介

C++标准模版库使用简介

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个。

标准模板库

标准模板库

标准模板库标准模板库,也叫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
符myown2访问变 量user_name
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, "

c标准文档

c标准文档

c标准文档
C标准文档是由国际标准化组织(ISO)和国际电工委员会(IEC)共同制定的,用于规范C语言编程的标准。

它包括了C语言的语法、语义、库函数等方面的规定,是C语言程序员必须遵守的规范。

C标准文档分为多个部分,其中最常使用的是C99标准。

C99标准于1999年发布,对C语言进行了一系列的改进和完善,增加了一些新的语言特性,如变长数组、复合字面量等。

此外,C99标准还对原有的语法进行了一些调整和优化,提高了代码的可读性和可维护性。

除了C99标准之外,还有一些其他的C标准文档,如C89、C11等。

这些标准的发布时间不同,对C语言的支持程度也有所不同。

一般来说,最新的标准包含更多的语言特性和更好的性能优化,因此建议使用最新版本的标准进行编程。

C标准文档是C语言编程的基础,对于学习和掌握C语言非常重要。

通过熟悉并遵守这些标准,可以提高代码的质量和效率,同时也能够更好地与其他程序员进行交流和合作。

10第十章 C++标准模板库

10第十章 C++标准模板库

顺序容器
容 器
顺序容器:其中的元素被视为逻辑上线性排列 的,有头有尾,有前导有后继,索引值即位臵 值。 以上特点使顺序容器可以随机访问其中的元素。 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; }

标准库与标准模板库

标准库与标准模板库

标准库与标准模板库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()函数的函数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

STL的关键组件
算法
取出 放入 迭代器 迭代器 选用
容器
迭代器
容器
函数对象
C++ STL 主要组件的关系
容器 仓库
数据
原料
迭代子
工人
算法
车床
函数对象
刀具
容器
概 念 和 术 语
容器类是容纳、包含一组元素对象或元素集合 的类。 异类容器类与同类容器类; 顺序容器与关联容器 七种基本容器: – 向量(vector)、双端队列(deque)、列表 (list)、集合(set)、多重集合 (multiset)、映射(map)和多重映射 (multimap) 注意:容器不像数组,它可以是空容器!Why?
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; }
25
//输出向量容器的信息 cout << "\n max_size(): " << StrVector.max_size() << "\n size(): " << StrVector.size() << "\n capacity(): " << StrVector.capacity() << endl; swap (StrVector[1], StrVector [3]); //交换第二个和第四个元素 //在元素"?"前插入字符串 "there" StrVector.insert (find(StrVector.begin(), StrVector.end(),"?"),"there"); StrVector.back() = "!";//将最后一个元素设置为"!" //输出向量容器中的元素,通过空格隔开 copy (StrVector.begin(), StrVector.end(), ostream_iterator<string>(cout," ")); //输出向量容器的信息 cout << "\n max_size(): " << StrVector.max_size() << "\n size(): " << StrVector.size()<< "\n capacity(): " << StrVector.capacity() << endl; }
是将所有容器所用的处理函数提炼,抽象成可共 用的函数的总称。剥离了“为谁干”和“干什么”功 能,专司“干什么”之职。 C++标准模板库中包括70多个算法 – 其中包括查找算法,排序算法,消除算法,记 数算法,比较算法,变换算法,置换算法和容 器管理等等。 这些算法的一个最重要的特性就是它们的统一 性,并且可以广泛用于不同的对象和内置(基 本)的数据类型。
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"; cout << "After do container1 = container2 "<<"\n"; container1 = container2; cout << "Data in Container-1 :" << container1[0] << container1[1] << container1[2] <<"\n"; cout << "Data in Container-2 :" << container2[0] << container2[1] << container2[2] <<"\n"; }
– 迭代器适配器 – 函数对象适配器。
迭代器
概 念 和 术 语
迭代器是面向对象版的指针,它们提供了访 问容器、序列中每个元素的方法。 通俗讲,就是“定位器”、 “映射器” ,是指 针的泛化。 如军事上的夜视仪,寻的雷达,瞄准镜;还 有旅游向导;网络的搜索引擎等等。
算法
概 念 和 术 语
是为每个人各自修建到达其目的 地的道路,还是大家都使用公共 交通?
顺序容器
容 器
顺序容器:其中的元素被视为逻辑上线性排列 的,有头有尾,有前导有后继,索引值即位置 值。 以上特点使顺序容器可以随机访问其中的元 素。 STL 提供三个基本顺序容器: – vector list deque STL 还提供三个容器适配器: – stack queue priority_queue
顺序容器的接口(通用方法)
容 器
– 插入方法
push_front(),push_back(),insert(),运算符“=”
– 删除方法
pop_front(),pop_back () ,erase(),clear()
– 迭代访问方法
使用迭代器
– 其它顺序容器访问方法(只读访问)
front(),back(),下标[]运算符
C++语言程序设计
第十章 C++标准模板库
主要内容
泛型程序设计 与标准模板库有关的概念和术语 C++标准模板库中的容器 迭代器 标准C++库中的算法 函数对象
为何需要STL
编程的数据需要存放、组织、管理。不需要每个 程序员都从头自行设计。将已有的经典的优秀的成 果标准化、规范化、模块化,是提高软件生产率, 实现产业化的趋势; “为了建立数据结构和算法的一套标准,降低其 间的耦合关系,以提升各自的独立性、弹性、交互 操作性(相互合作性),C++社群里诞生了STL.” ——侯捷
向量的模型
vector <T> ve 接口函数:
begin() end() push_back() pop_back() resize() back() clear() size() empty() insert() swap() erase() capacity() _first _last _end
STL (Standard Templatr Library)
1993年C++标准化委员会接受了Alexandar Stepenov的提案,为C++增加了STL; 可以用来创建动态增减的数据结构; 可用于基本数据类型和扩展类型。
STL的价值
提了一套极具实用价值的零部件,以及一 个整合的极好的组织; 以泛型思维为基础提供了高层次的、系统 化的、条理分明的“软件组织分类学”; 是类型无关的,故具有很高的可复用性; 与平台无关,于是保证了可移植性。
标准模板库STL是C++语言的外延,也是面向对象 语言的高级形态,甚至超越了面向对象的设计思想, 是基本概念的升华; C++是多范型(multiparadigm)语言,它同时支持面 向过程的设计、面向对象的设计及泛型设计等多种编 程风格(范型);
泛型程序设计
( Generic Programming )
顺序容器——向量
容 器
向量属于顺序容器,用于容纳不定长线性序列 (即线性群体),提供对序列的快速随机访问 (也称直接访问) 向量是动态结构,它的大小不固定,可以在程 序运行时增加或减少。 P334-335 给出了向量的部分接口。 例10-1 p336 – 求范围2~N中的质数,N在程序运行时由键盘 输入。
heap
T vob_1 T vob_2 这块叫 size 这块叫 capacity
T vob_n 预留空间
20
// vector 的例子 #include <vector> #include <iostream> using namespace std; void main() { int temp[3] = {4,5,6}; vector<int> container1(3); vector<int> container2(temp,temp+3); container1[0] = 1; container1[1] = 2; container1[2] = 3;
相关文档
最新文档