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++程序员提供了一个可扩展的应 ...
随机推荐
- Python 3 mysql 简介安装
Python 3 mysql 简介安装 一.数据库是什么 1. 什么是数据库(DataBase,简称DB) 数据库(database,DB)是指长期存储在计算机内的,有组织,可共享的数据的集合.数据 ...
- Java 9 逆天的十大新特性
在介绍java9之前,我们先来看看java成立到现在的所有版本. 1990年初,最初被命名为Oak: 1995年5月23日,Java语言诞生: 1996年1月,第一个JDK-JDK1.0诞生: 199 ...
- html基础学习(注意点)
浏览器会自动地在块级元素(<p><h1>)的前后添加空行 当显示页面时,浏览器会移除源代码中多余的空格和空行.所有连续的空格或空行都会被算作一个空格.需要注意的是,HTML 代 ...
- 分享知识-快乐自己:Struts2 拦截器 与 过滤器
拦截器的使用以及配置: package com.gdbd.interceptor; import com.gdbd.pojo.UserInfo; import com.opensymphony.xwo ...
- 分享知识-快乐自己:MyBtis内置缓存机制
在实际的项目开发中,通常对数据库的查询性能要求很高,而mybatis提供了查询缓存来缓存数据,从而达到提高查询性能的要求. mybatis的查询缓存分为一级缓存和二级缓存,一级缓存是SqlSessio ...
- WCF寄宿(Host)之自我寄宿(Self-Hosting)简单实例【Windows应用程序宿主】
前言: 以各种应用程序做自我寄宿的宿主原理方法大同小异,故:这儿直接上案例! 步骤一:创建服务契约和服务 1.新建解决方案:添加WCF服务库项目. 2.为了演示,我把自动生成的接口以及实现接口的类删 ...
- NFL原则告诉我们做决策的时候,试图找到一个能解决所有问题,“大而全”的方案是不存在的。我们应当找到最关心的问题,因地制宜做出选择。——聚焦目标,取舍有道!
资源匮乏原则:有限的资源无法满足无穷的需要及欲望:因此想要多一点的某件东西,意味着必须放弃一些其他的东西:因为资源匮乏,所以我们必须做出选择. NFL原则:没有免费午餐定理(No Free Lunch ...
- vc6++Release和Debug
1. 如何快速地规范代码缩进格式 选中所需要规范的代码,按shift+F8 2. 如何在Release状态下进行调试 Project->Setting=>ProjectSetting对话框 ...
- 51nod 1686 第K大区间 二分瞎搞
题目: 定义一个区间的值为其众数出现的次数. 现给出n个数,求将所有区间的值排序后,第K大的值为多少. 题解: 答案明显单调,我们考虑二分答案. 转化为判定问题后我们需要观察到一个性质: 如果一个区间 ...
- bzoj 3572: [Hnoi2014]世界树 虚树
题目: Description 世界树是一棵无比巨大的树,它伸出的枝干构成了整个世界.在这里,生存着各种各样的种族和生灵,他们共同信奉着绝对公正公平的女神艾莉森,在他们的信条里,公平是使世界树能够生生 ...