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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-09-30 09:03:13

C++标准模板库STL算法与自适应容器(栈和队列)的相关文章

实验8 标准模板库STL

一.实验目的与要求: 了解标准模板库STL中的容器.迭代器.函数对象和算法等基本概念. 掌握STL,并能应用STL解决实际问题. 二.实验过程: 完成实验8标准模板库STL中练习题,见:http://acm.hpu.edu.cn/contest.php?cid=1020,密码c++08,共有5道题.将答题过程简单记录到实验过程中. 将答题结果写到实验结果中,并根据答题结果进行分析.反思,将其写到实验分析中,并写上实验时间.

标准模板库(STL)学习探究之vector容器

标准模板库(STL)学习探究之vector容器  C++ Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据.为了可以使用vector,必须在你的头文件中包含下面的代码:#include <vector>构造函数. Vectors 包含着一系列连续存储的元素,其行为和数组类

八、C++ 标准模板库-STL概述

C++ 标准模板库-STL概述 一.基本概念 1.1 泛型程序设计 C++ 语言的核心优势之一就是便于软件的重用,重用在两个方面有体现: 面向对象的思想:继承和多态,标准类库 泛型程序设计(generic programming) 的思想: 模板机制,以及标准模板库 STL 简单地说就是使用模板的程序设计法.将一些常用的数据结构(比如链表,数组,二叉树)和算法(比如排序,查找)写成模板,以后则不论数据结构里放的是什么对象,算法针对什么样的对象,则都不必重新实现数据结构,重新编写算法. 标准模板库

标准模板库--STL

标准模板库STL 1.泛型程序设计 C++ 语言的核心优势之一就是便于软件的重用 C++中有两个方面体现重用: 1.面向对象的思想:继承和多态,标准类库 2.泛型程序设计(generic programming) 的思想: 模板机制,以及标准模板库STL 简单地说就是使用模板的程序设计法. 将一些常用的数据结构(比如链表,数组,二叉树)和算法(比如排序,查找)写成模板,以后则不论数据结构里放的是什么对象,算法针对什么样的对象,则都不必重新实现数据结构,重新编写算法.标准模板库 (Standard

PKU C++程序设计实习 学习笔记6 标准模板库STL

标准模板库STL 8.1 STL概述 1.泛型程序设计 C++ 语言的核心优势之一就是便于软件的重用 C++中有两个方面体现重用:1.面向对象的思想:继承和多态,标准类库  2.泛型程序设计(generic programming) 的思想: 模板机制,以及标准模板库 STL 简单地说就是使用模板的程序设计法. 将一些常用的数据结构(比如链表,数组,二叉树)和算法(比如排序,查找)写成模板,以后则不论数据结构里放的是什么对象,算法针对什么样的对象,则都不必重新实现数据结构,重新编写算法. 标准模

C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用

摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解.即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第一篇,主要针对线性表中的顺序表(动态数组)STL vector进行分析和总结. 引言 因为前段时间对台大的机器学习基石和技法课程进行了学习,发如今详细的实现中经常涉及到各种类型的数据结构,比方线性表.二叉树.图等,在使用这些数据结构时感到有些吃力.主要是对一些主要的数据结构理解的不够.所以趁着暑假假期.近期一段时间总会抽出时间复习一

C++ 标准模板库STL 队列 queue 使用方法与应用介绍

C++ 标准模板库STL 队列 queue 使用方法与应用介绍 queue queue模板类的定义在<queue>头文件中. 与stack模板类很相似,queue模板类也需要两个模板参数,一个是元素类型,一个容器类型,元素类型是必要的,容器类型是可选的,默认为deque类型. 定义queue对象的示例代码如下: queue<int> q1; queue<double> q2; queue的基本操作有: 入队,如例:q.push(x); 将x接到队列的末端. 出队,如例:

C++的标准模板库(STL)简介

STL(Standard Template Library,标准模板库)是C++对泛型编程思想的实现,最早是惠普实验室开发的.在被引入C++之前该技术就已经存在了很长的一段时间.后来STL成为ANSI/ISO C++标准的一部分.各个C++厂商也有各自相应的模板库,这些库效率可能很高,但可移植性不一定好. 在C++标准中,STL被组织为下面的17个头文件:<algorithm>.<deque>.<functional>.<iterator>.<arra

【c++】标准模板库STL入门简介与常见用法

一.STL简介 1.什么是STL STL(Standard Template Library)标准模板库,主要由容器.迭代器.算法.函数对象.内存分配器和适配器六大部分组成.STL已是标准C++的一部分,使用STL开发系统可以提高开发效率. 2.容器(Containers) 容器类是可以包含其它对象的模板类,如向量类(vector).链表类(list).双向队列类(deque).集合类(set)和映射类(map)等.其中vector.list.deque为序列式容器,set.map为关联式容器.