8、泛型程序设计与c++标准模板库4.标准c++库中的算法
标准c++算法是通过迭代器和模板来实现的,其实算法本身就是一种函数模板。
算法从迭代器那里获得一个元素,而迭代器则知道一个元素在容器中的什么位置。迭代器查找元素的位置并将这些信息提供给算法以便算法能够访问这些元素。算法不必关心具体的元素存储在容器中什么位置的细节,通常情况下,算法也不必直到存储元素的容器的种类。算法只需要简单地申请一个元素就可以了,根本无须直到这个元素是什么或者这个元素可能存储在什么地方。这样的话一个标准的算法就可以处理几乎所有类型的容器,并且一个容器可以容纳几乎任何类型的元素。这种通用化是的程序员可以无需做任何额外的工作就重复地使用代码和解决方案。
STL的算法是通用的,每个算法都适合与若干中不同的数据结构,而不是仅仅能够用一种数据结构。算法不是直接使用容器作为参数,而是使用迭代器类型。这样用户就可以在自己定义的数据结构上应用这些算法,仅仅要求这些自定义容器的迭代器类型满足算法要求。STL中几乎所有算法的头文件都是<algorithm>。
STL标准模板库中的算法大致上可以分为4类:第一类是非可变序列的算法,通常,这类算法在对容器进行操作时不会改变容器的内容;
第二类是可变序列的算法,这类算法一般会改变他们所操作容器的内容;
第三类是排序相关的算法,包括包括排序算法和合并算法、二分查找算法以及有序序列的集合操作算法等;
第四类是通用数值算法,这类算法的数量比较少。
算法是c++标准模板库的另一个核心内容,每种算法又有各自的特点,不可能通过一个算法的应用来展示所有算法的应用特点。
1、STL通用算法调用形式
原型定义形式及使用说明:
template <typename InputIterator,typename InputIteartor>
OutputIterator copy( InputIterator first,InputIterator last,OutputIterator result);
在该函数原型中,InputIterator代表输入型迭代器类型,OutputIterator代表输出型迭代器类型。该算法功能是将区间[first,last)中的元素赋值到区间[result,result+(last-first))中。
ostream_iterator<int> output(count," ");//创建一个输出流迭代器output
cout<<"List col1 contains:";
copy(col1.begin().col1.end(),output);//输出初始列表容器col1中的元素
这里,首先创建一个输出流迭代器output,然后将初始列表容器col1中的元素通过copy函数复制给流迭代器output,从而实现数据的输出。其中,col1.begin()和col1.end()分别指向初始列表容器col1的第一个元素和最后一个元素末尾的位置。
在STL通用算法中,很多算法还包含有一种以函数对象为输入参数的调用形式,比如最常用的排序算法sort就包含有两种调用形式:
第一种形式:
template <typename RandomAccessIterator>
void sort(RandomAccessIterator first,RandomAccessIterator last);
第二种形式:
template <typename RandomAccessIterator,typename Compare>
void sort(RandomAccessIterator first,RandomAccessIterator last,Compare comp);
在这两种调用形式中,第一种采用默认操作符operator<进行比较排序,最终默认情况是按升序排序,而第二种形式是按函数对象comp规定的比较标准进行排序,即可以是升序,也可以是降序,或者其他特定的规则。这样一来,用户可以通过设计相应的函数对象来达到特殊排序的要求,程序设计的灵活性更大。
sort例子:
#include<iostream>
#include<vector>
#include<algorithm>
#include<functional>
#include<iterator>
using namespace std;
int main()
{
int A[] = { 1, 2, 3, 4, 5 };
const int N = sizeof(A) / sizeof(int);
vector<int> col1(A, A + N);
ostream_iterator<int> output(cout, " ");
cout << "Vector col1 contains:";
copy(col1.begin(), col1.end(), output);//输出初始列表容器col1中的元素
sort(col1.begin(), col1.end());//第一种调用形式
cout << "\nafter sorted in ascending order col1 contains:";
copy(col1.begin(), col1.end(), output);//升序排序元素后列表容器col1中的元素
sort(col1.begin(), col1.end(), greater<int>());//第二种调用形式使用标准函数对象
cout << "\nagter sorted in descening ordercol1 contains:";
copy(col1.begin(), col1.end(), output);//降序排列元素后列表容器col1中的元素
getchar();
cout << endl;
}
8、泛型程序设计与c++标准模板库4.标准c++库中的算法的更多相关文章
- 8、泛型程序设计与c++标准模板库1、泛型程序设计的概念和术语
有效地利用已有的成果,将经典的.优秀的算法标准化.模块化,从而提高软件的生产率,是软件产业化的需求,为了实现这一需求,不仅需要面向对象设计思想,而且需要泛型程序设计思想. c++语言提供的标准模板库( ...
- C++学习笔记53:泛型程序设计与C++标准模板库
泛型程序设计的基本概念 编写不依赖于具体数据类型的程序 将算法从特定的数据结构中抽象出来,成为通用的 C++模板为泛型编程程序设计奠定了关键的基础 模型:符合一个概念的数据类型称为该概念的模型,例如: ...
- 8、泛型程序设计与c++标准模板库2、c++标准模板库中的容器
顺序容器类以逻辑线性排列方式存储元素,在这些容器类型中的元素在逻辑上被认为是连续的存储空间中存储的.顺序容器可用于存储线性群体. 在关联容器类中,元素的存储和检索基于关键字和元素与其他元素之间的关系, ...
- 8、泛型程序设计与c++标准模板库3.迭代器
理解迭代器对于理解STL框架并掌握STL的使用至关重要.简单地说,迭代器是面向对象版本的指针,STL算法利用迭代器对存储在容器中的元素序列进行遍历,迭代器提供了访问容器和序列中每个元素的方法. 虽然指 ...
- C++ 泛型程序设计与STL模板库(1)---泛型程序设计简介及STL简介与结构
泛型程序设计的基本概念 编写不依赖于具体数据类型的程序 将算法从特定的数据结构中抽象出来,成为通用的 C++的模板为泛型程序设计奠定了关键的基础 术语:概念 用来界定具备一定功能的数据类型.例如: 将 ...
- 标准模板库--STL
标准模板库STL 1.泛型程序设计 C++ 语言的核心优势之一就是便于软件的重用 C++中有两个方面体现重用: 1.面向对象的思想:继承和多态,标准类库 2.泛型程序设计(generic progra ...
- C++ 标准模板库介绍(STL)
1. STL 基本介绍 C++ STL(标准模板库)是惠普实验室开发的一系列软件的统称,是一套功能强大的 C++ 模板类.STL的目的是为了标准化组件,这样就不用重新开发,让后来者可以使用现成的组件, ...
- C++——标准模板库
1.泛型程序设计:将程序尽可能写的通用,将算法从特定的数据结构中抽象出来,成为通用的:C++模板为泛型程序设计奠定了关键的基础:STL是泛型程序设计的一个范例:容器container.迭代器itera ...
- STL标准模板库(简介)
标准模板库(STL,Standard Template Library)是C++标准库的重要组成部分,包含了诸多在计算机科学领域里所常见的基本数据结构和基本算法,为广大C++程序员提供了一个可扩展的应 ...
随机推荐
- day3--集合、文件操作、字符编码与转换、函数(递归,lambda,filter,map)、字典排序
list1 = set([1, 2, 3, 4, 5, 6, 5, 5, 5])list2 = set([11, 2, 36, 'a', 5, 6, 5, 5, 5])list3 = set([1, ...
- 算法(Algorithms)第4版 练习 1.4.5
a. N b. 1 c. 1 d. N3 e. 1 f. 1 g. 1(0)
- Java JDK环境配置及说明
一.Java程序运行机制 Java语言编写的程序需要经过编译生成与平台无关的字节码(.class文件). 这种字节码必须使用Java解释器(JVM)来解释执行. JVM是可运行Java字节码文件的虚拟 ...
- matlat之KDTreeSearcher()函数
Create Kd-tree nearest neighbor searcher(创建kd-树最近邻搜索器). Description KDTreeSearcher model objects sto ...
- 分析CSS布局中BFC
1.什么是BFC BFC(Block Formatting Context,块级元素格式化上下文)是 W3C CSS 2.1 规范中的一个概念,它决定了元素如何对其内容进行定位,以及与其他元素的关系和 ...
- Java集合类--->入门上篇
最近我又在研究Java语言,这是第五次还是第六次学习Java的集合类,你也许会惊讶为什么这么多次?哈哈,因为之前的我没有记录下来,忘记了,当然最主要还是觉得自己毅力不够,没有坚持.那么,这次我将换一种 ...
- Python中进度条如何实现
print源码,参数end默认值为换行符,需要置成空,就会实现打印一行的效果 import time for i in range(100): time.sleep(1)#sleep一秒再输出 # 需 ...
- web项目路径如何更改
- leetcode 6 ZigZag Conversion(水题)
就是简单的模拟一下就可以了.但是我一开始是用一个二维char数组来存的,这样在最终扫全体时会扫很多空的位置,浪费了很多时间,所以就time limit error了. 所以改进一下就用string数组 ...
- linux命令学习笔记(49):at命令
在windows系统中,windows提供了计划任务这一功能,在控制面板 -> 性能与维护 -> 任务计划, 它的功能就是安排自动运行的任务. 通过'添加任务计划'的一步步引导,则可建立一 ...