《2022年c++STL总结 .pdf》由会员分享,可在线阅读,更多相关《2022年c++STL总结 .pdf(22页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、2016 年 3 月 8 日C+ STL 学习总结 1STL容器C+ 标准模板库: C+ Standard Template Libarary。主要内容:(1)STL 概述:组件、容器、迭代器(iterator) 、算法(2)STL 容器:常用容器: vector 、deque 、 list、 map/multimap 、set 特殊容器: stack 、queue,priority_queue 其他容器: hashtable STL(3)算法:搜寻、排序、拷贝、数值运算1. STL 概述1.1 STL简介(1)STL 是 C+ 标准程序库的核心,深刻影响了标准程序库的整体结构。(2)STL
2、是泛型 (generic) 程序库,利用先进、高效的算法来管理数据。(3)STL 由一些可适应不同需求的集合类(collection class), 以及在这些数据集合上操作的算法(algorithm) 构成。(4)STL 内的所有组件都由模板(template) 构成,其元素可以是任意类型。(5)STL 是所有 C+ 编译器和所有操作系统平台都支持的一种库。例: /普通 C+代码#include int main(void) double a = 1, 2, 3, 4, 5; std:coutmean(a, 5); std:coutstd:endl; return 0; /使用了 STL 的
3、代码#include #include int main() std:vector a; a.push_back(1); a.push_back(2); a.push_back(3); a.push_back(4); a.push_back(5); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 22 页 - - - - - - - - - 2016 年 3 月 8 日C+ STL 学习总结 2for(int i = 0; i a.size(); +i) std:cout
4、aistd:endl; return 0; 1.2 模板(template)针对一个或多个尚未明确的类型所撰写的函数 或类。1.2.1 函数模板#include#includeusing namespace std; / 定义函数模板templateT MAX(T a, T b) return (ab)?a:b; int main() int x=2,y=6; double x1=9.123,y1=12.6543; coutmax(x,y)endl; coutmax(x1,y1)endl;return 0;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - -
5、 - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 22 页 - - - - - - - - - 2016 年 3 月 8 日C+ STL 学习总结 31.2.2 类模板/ 类模板#includeusing namespace std;/ 定义名为 ex_class 的类模板template class ex_classT value;public:ex_class(T v)value = v;void set_value(T,v)value = v;T get_value(void)return value;int main() / 测试 char 类型数据e
6、x_class ch(A);coutch.value:ch.get_value()endl;ch.set_value(a);coutch.value:ch.get_value()engl;/ 测试 double 类型的数据ex_class d(5.5);coutd.value:d.get_value()endl;x.set_value(7.4);coutx.value:x.get_value()engl;return 0;1.3 STL组件(1)容器 (Container) - 管理某类对象的集合(2)迭代器 (Iterator) - 在对象集合上进行遍历(3)算法 (Algorithm) -
7、 处理集合内的元素(4)容器适配器(container adaptor) (5)函数对象 (functor) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 22 页 - - - - - - - - - 2016 年 3 月 8 日C+ STL 学习总结 41.4 STL容器类别(1)序列式容器-排列次序取决于插入时机和位置。(2)关联式容器- 排列顺序取决于特定准则 。1.5 STL 容器的共通能力(1)所有容器中存放的都是值而非引用 ,即容器进行安插操作时内部实施的是
8、拷贝操作 。因此容器的每个元素必须能够被拷贝 。如果希望存放的不是副本,容器元素只能是指针。(2)所有元素都形成一个次序(order) ,可以按相同的次序一次或多次遍历每个元素。(3)各项操作并非绝对安全,调用者必须确保传给操作函数的参数符合需求,否则会导致未定义的行为。1.6 STL 容器元素的条件(1)必须能够通过拷贝构造函数进行复制。(2)必须可以通过赋值运算符 完成赋值操作。(3)必须可以通过析构函数 完称销毁动作。(4)序列式容器元素的默认构造函数 必须可用。(5)某些动作必须定义operator = ,例如搜寻操作。名师资料总结 - - -精品资料欢迎下载 - - - - - -
9、- - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 22 页 - - - - - - - - - 2016 年 3 月 8 日C+ STL 学习总结 5(6)关联式容器必须定义出排序准则 ,默认情况是重载。operator 对于基本数据类型(int,long,char,double,)而言,以上条件总是满足1.7 STL 容器的共通操作(1)初始化 (initialization) 产生一个空容器std:list l; 以另一个容器元素为初值完成初始化。std:list l; std:vector c(l.begin(),l.end();以
10、数组元素为初值完成初始化。int array=2,4,6,1345; std:setc(array,array+sizeof(array)/sizeof(array0);(2)与大小相关的操作(size operator) size()- 返回当前容器的元素数量。empty()- 判断容器是否为空。max_size()- 返回容器能容纳的最大元素数量。(3)比较 (comparison) =,!=,= 1)比较操作两端的容器必须属于同一类型。2)如果两个容器内的所有元素按序相等,那么这两个容器相等。3)采用字典式顺序判断某个容器是否小于另一个容器。(4)赋值 (assignment) 和交换
11、(swap) swap 用于提高赋值操作效率。(5)与迭代器 (iterator) 相关的操作begin()- 返回一个迭代器,指向第一个元素。end()- 返回一个迭代器,指向最后一个元素之后。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 22 页 - - - - - - - - - 2016 年 3 月 8 日C+ STL 学习总结 6rbegin()- 返回一个逆向迭代器,指向逆向遍历的第一个元素。rend()- 返回一个逆向迭代器,指向逆向遍历的最后一个元素之后
12、。(6)元素操作insert(pos,e)-将元素 e 的拷贝安插于迭代器pos 所指的位置。erase(beg,end)-移除beg,end 区间内的所有元素。clear()- 移除所有元素。1.8 迭代器 (iterator) 1.8.1 迭代器的特点(示例 :iterator) (1)可遍历STL 容器内全部或部分元素的对象。(2)指出容器中的一个特定位置。(3)迭代器的基本操作:(4)所有容器都提供获得迭代器的函数名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 2
13、2 页 - - - - - - - - - 2016 年 3 月 8 日C+ STL 学习总结 7半开区间 beg, end) 的好处:1.为遍历元素时循环的结束时机提供了简单的判断依据(只要未到达end() ,循环就可以继续)。2.不必对空区间采取特殊处理(空区间的begin() 就等于 end() 。(5)所有容器都提供两种迭代器container:iterator 以“读/写”模式遍历元素。container:const_iterator 以“只读 ”模式遍历元素。(6)迭代器示例:iterator 1.8.2 迭代器分类(1)双向迭代器例: listl;for(pos=l.begin(
14、);pos!=l.end();+pos 1)可以双向行进 , 以递增运算前进或以递减运算后退、可以用=和!=比较。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 22 页 - - - - - - - - - 2016 年 3 月 8 日C+ STL 学习总结 82)list、set 和 map提供双向迭代器。(2)随机存取迭代器1)除了具备双向迭代器的所有属性,还具备随机访问能力。2)可以对迭代器增加或减少一个偏移量、处理迭代器之间的距离或者使用之类的关系运算符比较两个迭
15、代器。3)vector 、deque 和 string提供随机存取迭代器vector v; for(pos=v.begin();posv.end();+pos 2. STL 容器2.1 vector 容器2.1.1 vector容器的特点(1)vector 模拟动态数组。(2)vector 的元素可以是任意类型T,但必须具备 赋值和拷贝 能力(具有 public 拷贝构造函数和重载的赋值操作符)。(3)必须包含的头文件#include(4)vector 支持随机存取(5)vector 的大小 (size) 和容量 (capacity) size 返回实际元素个数。capacity返回 vect
16、or能容纳的元素最大数量。如果插入元素时,元素个数超过capacity,需要重新配置内部存储器。2.1.2 vector的构造、拷贝和析构名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 22 页 - - - - - - - - - 2016 年 3 月 8 日C+ STL 学习总结 92.1.3 vector 非变动操作2.1.4 vector 的赋值操作名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师
17、精心整理 - - - - - - - 第 9 页,共 22 页 - - - - - - - - - 2016 年 3 月 8 日C+ STL 学习总结 10所有的赋值操作都有可能调用元素类型的默认构造函数,拷贝构造函数,赋值操作符和析构函数。std:listl; std:vector v;v.assign(l.begin(),l.end();2.1.5 vector 元素存取std:vectorv;/empty v5= t; /runtime error std:cout v.front(); /runtime error名师资料总结 - - -精品资料欢迎下载 - - - - - - - -
18、 - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 22 页 - - - - - - - - - 2016 年 3 月 8 日C+ STL 学习总结 112.1.6 vector 迭代器相关函数迭代器持续有效,除非发生以下两种情况:(1)删除或插入元素。(2)容量变化而引起内存重新分配。2.1.7 vector 安插 (insert) 元素2.1.8 vector 移除 (remove) 元素名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - -
19、 第 11 页,共 22 页 - - - - - - - - - 2016 年 3 月 8 日C+ STL 学习总结 122.1.9 vector应用实例备注:2.2 list 容器2.2.1 特点(1)使用双向链表管理元素。(2)list 的元素可以是任意类型T,但必须具备赋值和拷贝能力。(3)必须包含的头文件#include 。(4)list不支持随机存取,因此不提供下标操作符。(5)在任何位置上执行元素的安插和移除都非常快。(6)安插和删除不会导致指向其他元素的指针、引用、iterator 失效。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - -
20、 - - - - - 名师精心整理 - - - - - - - 第 12 页,共 22 页 - - - - - - - - - 2016 年 3 月 8 日C+ STL 学习总结 132.2.2 list 构造、拷贝和析构2.2.3 非变动性操作2.2.4 list 赋值名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 22 页 - - - - - - - - - 2016 年 3 月 8 日C+ STL 学习总结 142.2.5 list 元素存取std:list l;
21、/empty std:cout l.front(); /runtime error if(!l.empty() std:coutl.back(); /ok2.2.6 list 迭代器相关函数名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 22 页 - - - - - - - - - 2016 年 3 月 8 日C+ STL 学习总结 152.2.7 list 安插 (insert) 元素2.2.8 list 移除 (remove) 元素2.2.9 list 特殊变动性操
22、作名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 22 页 - - - - - - - - - 2016 年 3 月 8 日C+ STL 学习总结 162.2.10 list 应用实例备注:2.3 map 容器2.3.1 map/multimap特点(1)使用平衡二叉树管理元素。(2)元素包含两部分(key,value),key和 value 可以是任意类型。(3)必须包含的头文件#include 。(4)根据元素的key 自动对元素排序,因此根据元素的key 进行定位
23、很快,但根据元素的value 定位很慢。(5)不能直接改变元素的key, 可以通过 operator 直接存取元素值。(6)map 中不允许key 相同的元素, multimap允 key 相同的元素。(7)map/multimap 内部存储结构图:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 16 页,共 22 页 - - - - - - - - - 2016 年 3 月 8 日C+ STL 学习总结 172.3.2 map/multimap 构造、拷贝和析构其中 map 可以是
24、下列形式:map 一个以 less() 为排序准则的 map 。map 一个以 op为排序准则的 map 。2.3.3 map/multimap 非变动性操作名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 17 页,共 22 页 - - - - - - - - - 2016 年 3 月 8 日C+ STL 学习总结 182.3.4 map/multimap 赋值2.3.5 map/multimap 特殊搜寻操作2.3.6 map/multimap 迭代器相关函数名师资料总结 - -
25、-精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 18 页,共 22 页 - - - - - - - - - 2016 年 3 月 8 日C+ STL 学习总结 192.3.7 map/multimap 安插 (insert) 元素2.3.8 map/multimap 移除 (remove) 元素2.3.9 map/multimap map应用实例备注: map3. STL 算法(1)STL 提供了一些标准算法来处理容器内的元素。搜寻、排序、拷贝、数值运算。(2)STL 的算法是全局函数名师资料总结 - -
26、 -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 19 页,共 22 页 - - - - - - - - - 2016 年 3 月 8 日C+ STL 学习总结 20a.明确划分数据和操作。b.泛型函数式编程模式。c.所有算法可以对所有容器适用,甚至可以操作不同类型容器的元素(3)算法头文件#include #include (4)STL算法实例: algorithm3.1 区间(range) (1)所有算法都用来处理一个或多个区间内的元素。(2)区间可以但不一定涵盖容器内所有元素。(3)为了操作元素的某
27、个子集必须将区间的首尾(iterator) 当作两个参数传递给算法。(4)调用时必须确保区间有效性。a.从起点出发,逐一前进,能够到达终点。b.区间首尾两个迭代器必须属于同一容器,且前后放置正确。c.无效区间可能会引起无限循环或者内存非法访问(5)所有算法处理的都是半开区间begin, end) 。3.2 STL 算法分类(1)非变动性算法(nonmodifying algorithms) (2)变动性算法(modifying algorithms) (3)移除性算法(removing algorithms) (4)变序性算法(mutating algorithms) (5)排序性算法(sor
28、ting algorithms) (6)已序区间算法(sorted range algorithms) (7)数值算法 (numeric algorithms)名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 20 页,共 22 页 - - - - - - - - - 2016 年 3 月 8 日C+ STL 学习总结 213.3 for_each()算法for_each(InputIterator beg, InputIterator end, UnaryProc op) 对区间 b
29、eg, end) 中的每一个元素调用。op(elem) 返回 op 之后的容器副本。op 可以改变元素。op 的返回值被忽略。复杂度: O(n) 示例 :foreach3.4 非变动性算法既不改变元素次序也不改变元素值3.4.1元素计数(1)count(InputIterator beg,InputIterator end, const T& value) 计算区间中值等于value 的元素个数。(2)count(InputIterator beg,InputIterator end, Predicate op) 计算区间中使判断式op 结果为 true 的元素个。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 21 页,共 22 页 - - - - - - - - - 2016 年 3 月 8 日C+ STL 学习总结 22op 接受单个参数,返回值为bool 型。3.4.2 排序算法需要动用随机存取迭代器。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 22 页,共 22 页 - - - - - - - - -