C++标准模板库STL算法与自适应容器(栈和队列)
参考《21天学通C++》第23与第24章节,对STL算法与自适应容器进行介绍。
实际上在前面的STL顺序容器、关联容器进行介绍时或多或少引用到了一些STL算法中的模板函数。而自适应容器是在顺序容器的基础上按照stack、queue的性质进行定制实现的。所以,本篇博文将言简意赅地总结出需要掌握的纲要。
一、STL算法
查找、搜索、删除、计数、排序等都是一些通用算法,STL通过模板函数提供了这些算法,可通过迭代器对容器进行操作。需要包含<algorithm>头文件。
1. find,find_if
用于在vector等顺序容器中查找与值匹配或满足条件的元素,返回值为对应的迭代器;
2. count,count_if
用于计算在给定范围内的元素数;
3. search,search_n
用于在一个序列中查找另一个序列;
4. fill,fill_n
用于将容器中的元素初始化为指定值;
5. generate,generate_n
用于将元素设置为运行阶段生成的值;比如:generate(vecIntegers.begin(),vecIntegers.end(), rand)//用随机数填充;generate_n(vecIntegers.begin(), 5,
rand) //用随机数填充开始五个数据
6. for_each
用来对指定范围的元素进行处理;采用一个指定的一元函数对象。
7. transform
用来对源范围内每个元素调用指定的函数对象;函数对象可以是一元函数,也可以是二元函数。for_each与transform非常相似。
8. copy,copy_if,copy_backward
copy沿着前向复制,copy_if仅在指定的一元谓词返回true时才返回,copy_backward沿着后向复制。
9. replace,replace_if
用于替换集合中等于指定值和满足给定条件的元素。
10. sort
用于排序;
11. partition,stable_partition
将输入范围分为两个部分:一部分满足谓词,一部分不满足谓词。stable_partition还能保证每个分区中元素的相对顺序不变,而partition则不能保证。
12. unique
用于删除重复的元素;
13. binary_search
用于有序容器中的快速查找;
14. lower_bound,upper_bound
用于将元素插入到有序集合时,其可插入到有序范围内的最前位置和最后位置。
15. remove,remove_if
从容器中移除符合条件的元素;
总结:
使用算法remove、remove_if、unique之后要使用容器的成员函数erase调整容器大小;返回值为迭代器的时候要注意检查返回值与容器end(),以确定迭代器的有效性;仅当元素相对顺序很重要时,才使用stable_partition来做。记住在调用unique之前,先使用sort对容器进行排序,保证相同值得元素彼此相邻,这样unique才能发挥作用。
二、自适应容器之栈 stack
1.stack概念和定义
栈的数据结构特性是:先入后出,后入先出,只能从栈顶插入、删除和访问。可将栈视为一叠盘子,最后叠上去的盘子首先被取下来,而不能从中间或底部取出盘子。
std::stack的定义如下:
template <class elementType, class Container=deque<Type>> class stack;
elementType为stack存储的对象类型;Container是stack使用的默认底层容器实现类。stack默认在内部使用std::deque实现,但可指定vector、list来存储数据。
2. stack实例化
stack实例化的形式可以有:
std::stack<int> stackInts;//整型stack
std::stack<Tuna>
stackObjs;//存储类对象Tuna的栈
std::stack<double,vector<double>>
stackDoublesInVector;//double型stack,指定内部使用vector容器实现。
3.stack成员函数
push//在栈顶插入
pop//在栈顶删除
empty//检查栈是否为空
size//返回栈中元素数
top//获得指向栈顶元素的引用
三、自适应容器之队列 queue
1.queue概念和定义
队列的数据结构特性是:先进先出,允许在开头删除,在末尾插入,类似排队系统。
queue的定义如下:
template <class
elementType, class Container=deque<Type>> class
queue;
elementType为queue存储的对象类型;Container是queue使用的默认底层容器实现类。queue默认在内部使用std::deque实现,但可指定vector、list来存储数据。
2.
queue实例化
queue实例化的形式可以有:
std::queue<int>queueInts;//整型queue
std::queue<Tuna>queueObjs;//存储类对象Tuna的queue
std::queue<double,list<double>>queueDoublesInList;//double型queue,指定内部使用list容器实现。
3.queue成员函数
push//在队尾插入
pop//在队首删除
front//返回指向队首的元素引用
back//返回指向队尾的元素引用
empty//检查队列中是否为空
size//返回队列中元素数
四、自适应容器之优先级队列 priority_queue
1.priority_queue概念和定义
优先级队列与队列的最大区别是含有最大值(或二元谓词认为的最大值)的元素位于队首,且只能在队首执行操作。
priority_queue定义如下:
template <class
elementType, class Container=vector<Type>, class Compare=less<typename Container::value_type>> class priority_queue;
elementType为priority_queue存储的对象类型;Container是priority_queue使用的默认底层容器实现类。priority_queue默认使用vector进行内部实现。第三个参数指定一个二元谓词,帮助实现优先级的,如果没有指定二元谓词,将默认使用std::less,使用运算符<比较对象。
2.priority_queue实例化
std::priority_queue<int> priority_queueInts;//整型priority_queue
std::priority_queue<Tuna> priority_queueObjs;//存储类对象Tuna的priority_queue
std::queue<double,deque<double>,greater<int>> priority_queueGreaterDoublesInDeque;//double型priority_queue,指定内部使用deque容器实现,按照小到大的顺序存储在deque中。
3.priority_queue成员函数
push//在优先级队列中插入一个元素
pop//在队首(最大元素)删除
top//返回指向队首(最大元素)的元素引用
size//返回优先级队列中元素数
empty//检查优先级是否为空
总结:
本文阐述了3个重要的自适应容器STL stack,queue,priority_queue。这些容器使用顺序容器并进行改造,以满足其具体的数据结构特性,再通过成员函数呈现出栈、队列独特的行为特征。
*******************************************************************************************************
2015-8-6
C++标准模板库STL算法与自适应容器(栈和队列)的更多相关文章
- 标准模板库(STL)学习探究之vector容器
标准模板库(STL)学习探究之vector容器 C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被 ...
- C++ 标准模板库(STL)
C++ 标准模板库(STL)C++ STL (Standard Template Library标准模板库) 是通用类模板和算法的集合,它提供给程序员一些标准的数据结构的实现如 queues(队列), ...
- STL学习系列之一——标准模板库STL介绍
库是一系列程序组件的集合,他们可以在不同的程序中重复使用.C++语言按照传统的习惯,提供了由各种各样的函数组成的库,用于完成诸如输入/输出.数学计算等功能. 1. STL介绍 标准模板库STL是当今每 ...
- 7.4 C++标准模板库(STL)的概念
参考:http://www.weixueyuan.net/view/6401.html 总结: 标准模板库为C++提供了完善的数据结构及算法. 标准模板库包括三部分:容器.算法和迭代器. 容器是对象 ...
- 标准模板库--STL
标准模板库STL 1.泛型程序设计 C++ 语言的核心优势之一就是便于软件的重用 C++中有两个方面体现重用: 1.面向对象的思想:继承和多态,标准类库 2.泛型程序设计(generic progra ...
- 实验8 标准模板库STL
一.实验目的与要求: 了解标准模板库STL中的容器.迭代器.函数对象和算法等基本概念. 掌握STL,并能应用STL解决实际问题. 二.实验过程: 完成实验8标准模板库STL中练习题,见:http:// ...
- C++的标准模板库STL中实现的数据结构之链表std::list的分析与使用
摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解,即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第二篇.主要针对线性表中的链表 ST ...
- 标准模板库(STL)学习探究之stack
标准模板库(STL)学习探究之stack queue priority_queue list map/multimap dequeue string
- C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用
摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解.即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第一篇,主要针对线性表中的顺序表(动 ...
随机推荐
- 问题--Notepad++保存文件遇到Failed to save file
一.问题如下 使用Notepad编码,保存时遇到问题:Failed to save file. Not enough space on disk to save file? 如下图所示: 二.解决方法 ...
- Java与设计模式之单例模式(上)六种实现方式
阎宏博士在<JAVA与模式>中是这样描述单例模式的:作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. ...
- DDD应对运营活动系统腐化实践
前言 任何人类的设计都会腐化,软件系统也不例外 腐化之谜 随着系统的规模增长和复杂度膨胀,系统会慢慢腐化. 于是改一个很简单的下单地址,就会牵动整个交易系统十几处的改动. 如何解决这种腐化之谜呢? 参 ...
- ubuntu之路——day10.1 ML的整体策略——正交化
orthogonalization 正交化的概念就是指,将你可以调整的参数设置在不同的正交的维度上,调整其中一个参数,不会或几乎不会影响其他维度上的参数变化,这样在机器学习项目中,可以让你更容易更快速 ...
- #C++初学记录(字符串与指针操作库函数)
测试程序 #include<iostream> #include<cstring> using namespace std; int a[204],b[204],lena,n; ...
- C 套接字
套接字函数 1 创建套接字──socket() 应用程序在使用套接字前,首先必须拥有一个套接字,系统调用socket()向应用程序提供创建套接字的手段, 其调用格式如下:SOCKET PASCAL ...
- Ubuntu 命令行连接WiFi
查看是否已经正确安装无线网卡 iwconfig .启动无线网卡, 如果网卡是wlan0 # 方式1 ifconfig wlan0 up # 或者方式2 ip link set wlan0 up .扫描 ...
- SC3聚类 | 拉普拉斯矩阵 | Laplacian matrix | 图论 | R代码
Laplacian和PCA貌似是同一种性质的方法,坐标系变换.只是拉普拉斯属于图论的范畴,术语更加专业了. 要看就把一篇文章看完整,再看其中有什么值得借鉴的,总结归纳理解后的东西才是属于你的. 问题: ...
- 似然函数 | 最大似然估计 | likelihood | maximum likelihood estimation | R代码
学贝叶斯方法时绕不过去的一个问题,现在系统地总结一下. 之前过于纠结字眼,似然和概率到底有什么区别?以及这一个奇妙的对等关系(其实连续才是f,离散就是p). 似然函数 | 似然值 wiki:在数理统计 ...
- 清理Windows.edb
解决Windows.edb文件巨大的windows 10问题的另一个快速解决方法是删除Windows.edb文件. 步骤1:在任务管理器中终止SearchIndexer.exe --按Ctrl + A ...