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++程序员提供了一个可扩展的应 ...
随机推荐
- 【Flask】Column常用参数
### Column常用参数:1. primary_key:设置某个字段为主键.2. autoincrement:设置这个字段为自动增长的.3. default:设置某个字段的默认值.在发表时间这些字 ...
- Unity 中 GetComponentsInChildren 的应用
在实际项目中,我们经常要去查找一个节点下的某个子节点,但是子节点太多,或者每次我们都要去自己写GameObject.FindChald("xxx")实在是太过繁琐,那么这是后就可以 ...
- java入门了解之快捷键
IDE(Integrated Development Environment ): 集成开发环境,集合开发.运行.调试于一体的一个软件 Eclipse 是一个开放源代码的.基于Java的可扩展开发平台 ...
- 用用OGRE1.74搭建游戏框架(转载)
用OGRE1.74搭建游戏框架(一) 新版的OGRE出来了,不知什么原因抛弃了CEGUI.国内的教程好像也更新比较少了,在官网上还是发现不少资料的,现在参考官网上的一些资料来搭建一个游戏的框架. 参考 ...
- hdu 5475 线段树
An easy problem Time Limit: 8000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 翻译Lanlet2
Here is more information on the basic primitives that make up a Lanelet2 map. Read here for a primer ...
- JQuery 常用代码
1.选择器 1.根据标签名: $('p') 选择文档中的所有段落 2. 根据ID: $("#some-id") 3.类: $('.some-class') $('.t ...
- double 与0比较时有个精度问题,有时需精确到小数点后面几位,例如与>0.0001,而不能与>0比较
double 与0比较时有个精度问题,有时需精确到小数点后面几位,例如与>0.0001,而不能与>0比较 例如杭电1408 盐水的故事 ac #include<iostream> ...
- elasticsearch的store属性跟_source字段——如果你的文档长度很长,存储了_source,从_source中获取field的代价很大,你可以显式的将某些field的store属性设置为yes,否则设置为no
转自:http://kangrui.iteye.com/blog/2262860 众所周知_source字段存储的是索引的原始内容,那store属性的设置是为何呢?es为什么要把store的默认取值设 ...
- 并发问题引出ThreadLocal
ThreadLocal Thread-->人类Runnable-->任务类 多线程并发问题引出ThreadLocal 多线程并发问题的原因: 操作同一个对象,对对象具有读写权限(只读如拍照 ...