第11章 标准模板库
- 格式:pptx
- 大小:174.85 KB
- 文档页数:25
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。
标准模板库的earse()1 摘要本文首先介绍了STL基本容器的一些概念和实际应用,然后着重分析了下vector、list的earse()使用方式及注意事项。
2 STL容器简介标准模板库(STL)是一个容器类模板库和算法库。
STL支持多中容器类型,这些容器的类型分为序列式容器(sequence container)和结合式容器(associative container)。
这些容器都有许多相似的地方,但每个容器也都有自己的特点。
首先分析一下vector、deque、list之间的相似与不同之处。
对于vector,可以看成一个动态的数组,可以通过迭代器随机的存取,当往其插入新的元素时,如果在结尾插入,将会执行效率比较高,而如果往中间的某个位置插入,其插入位置之后的元素都要后移,因此效率就不是那么的高。
对于deque它和vector 特别的相似;它的元素也存在于动态数祖中,也支持随机存取,和vector有几乎一样的接口。
最大的不同之处就是,deque是双向的。
与vector相比(1)在首和尾插入和移动元素都特别的快;(2)对于元素的存取和迭代器的移动相对vector来说比较慢(这是由于deque内部的结构导致);(3)deque中的迭代器(iterators)类似智能指针,而不同于普通的指针;(4)因为可能用到了不止一块内存( one block of memory),max_size()将比vector的max_size()大;(5)不支持reallocation;(6)支持内存缩小,当某些内存块不用时,将得到释放。
在接口的实现上与vector几乎一样,只是少了capacity()与reserve()(原因上面已提到)而多了两个push_front()、pop_front()(因为deque是双向的)。
对于list可以将它的元素看成是方向链表。
它和vector、deque有很大的不同。
主要如下(1)它不能随机存取,必须从头一个一个遍历;(2)插入和删除任意位置都比较快,因为仅仅是操作指针;(3)插入和删除不会导致它的指针、引用、迭代器无效;(4)不能利用下表算符[]或者at()来存取元素(同(1));(5)不支持capacity 或者重新分配,因为每个元素有自己的内存;(6)list自己提供了一些成员函数来支持元素的移动等,这些成员方法比<algorithm>中的同名方法有更高的效率。
第十一章标准模板库(STL)习题一. 基本概念与基础知识自测题11.1填空题11.1.1 STL大量使用继承和虚函数是(1)(填对或错)。
因为(2)。
答案:(1)错(2)它使用的是模板技术,追求的是运行的效率,避免了虚函数的开销11.1.2 有两种STL容器:(1)和(2)。
STL不用new和delete,而用(3)实现各种控制内存分配和释放的方法。
答案:(1)第一类容器(2)近容器(3)分配子(allocator)11.1.3 五种主要迭代子类型为(1)、(2)、(3)、(4)和(5)。
STL算法用(6)间接操作容器元素。
sort算法要求用(7)迭代子。
答案:(1)输入(InputIterator)(2)输出(OutputIterator)(3)正向(ForwardIterator)(4)双向(BidirectionalIterator)(5)随机访问(RandomAccessIterator)(6)迭代子(7)随机访问(RandomAccessIterator)11.1.4 三种STL容器适配器是(1)、(2)和(3)。
答案:(1)stack(栈)(2)queue(队列)(3)priority_queue(优先级队列)11.1.5 成员函数end()得到容器(1)的位置,而rend得到容器(2)的位置。
算法通常返回(3)。
答案:(1)最后一个元素的后继位置(2)引用容器第一个元素的前导位置。
实际上这是该容器前后反转之后的end()(3)迭代子11.1.6 适配器是(1),它依附于一个(2)容器上,它没有自己的(3)函数和(4)函数,而借用其实现类的对应函数。
答案:(1)不独立的(2)顺序(3)构造函数(4)析构函数11.1.7 返回布尔值的函数对象称为(1),默认的是(2)操作符。
答案:(1)谓词(predicate)(2)小于比较操作符“<”11.1.8C++标准库中给出的泛型算法包括(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];这个例子也用到了范围,和我们上面的向量的例子一样:第一个参数是指向要操作的范围的头的指针,第二个参数是指向尾的指针。