标准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++库中的算法的更多相关文章

  1. 8、泛型程序设计与c++标准模板库1、泛型程序设计的概念和术语

    有效地利用已有的成果,将经典的.优秀的算法标准化.模块化,从而提高软件的生产率,是软件产业化的需求,为了实现这一需求,不仅需要面向对象设计思想,而且需要泛型程序设计思想. c++语言提供的标准模板库( ...

  2. C++学习笔记53:泛型程序设计与C++标准模板库

    泛型程序设计的基本概念 编写不依赖于具体数据类型的程序 将算法从特定的数据结构中抽象出来,成为通用的 C++模板为泛型编程程序设计奠定了关键的基础 模型:符合一个概念的数据类型称为该概念的模型,例如: ...

  3. 8、泛型程序设计与c++标准模板库2、c++标准模板库中的容器

    顺序容器类以逻辑线性排列方式存储元素,在这些容器类型中的元素在逻辑上被认为是连续的存储空间中存储的.顺序容器可用于存储线性群体. 在关联容器类中,元素的存储和检索基于关键字和元素与其他元素之间的关系, ...

  4. 8、泛型程序设计与c++标准模板库3.迭代器

    理解迭代器对于理解STL框架并掌握STL的使用至关重要.简单地说,迭代器是面向对象版本的指针,STL算法利用迭代器对存储在容器中的元素序列进行遍历,迭代器提供了访问容器和序列中每个元素的方法. 虽然指 ...

  5. C++ 泛型程序设计与STL模板库(1)---泛型程序设计简介及STL简介与结构

    泛型程序设计的基本概念 编写不依赖于具体数据类型的程序 将算法从特定的数据结构中抽象出来,成为通用的 C++的模板为泛型程序设计奠定了关键的基础 术语:概念 用来界定具备一定功能的数据类型.例如: 将 ...

  6. 标准模板库--STL

    标准模板库STL 1.泛型程序设计 C++ 语言的核心优势之一就是便于软件的重用 C++中有两个方面体现重用: 1.面向对象的思想:继承和多态,标准类库 2.泛型程序设计(generic progra ...

  7. C++ 标准模板库介绍(STL)

    1. STL 基本介绍 C++ STL(标准模板库)是惠普实验室开发的一系列软件的统称,是一套功能强大的 C++ 模板类.STL的目的是为了标准化组件,这样就不用重新开发,让后来者可以使用现成的组件, ...

  8. C++——标准模板库

    1.泛型程序设计:将程序尽可能写的通用,将算法从特定的数据结构中抽象出来,成为通用的:C++模板为泛型程序设计奠定了关键的基础:STL是泛型程序设计的一个范例:容器container.迭代器itera ...

  9. STL标准模板库(简介)

    标准模板库(STL,Standard Template Library)是C++标准库的重要组成部分,包含了诸多在计算机科学领域里所常见的基本数据结构和基本算法,为广大C++程序员提供了一个可扩展的应 ...

随机推荐

  1. webpack打包笔记

    optimist是一个node库,将webpack.config.js与shell参数整合成options对象 options对象包含之后构建的重要信息,类似于webpack.config.js we ...

  2. 基于msm8909高通平台Android驱动开发之hello程序

    本文转载自:http://www.itwendao.com/article/detail/227839.html Android驱动开发之Hello实例:   驱动部分 modified:   ker ...

  3. centos 中 增强web服务器安全

    一.修改ssh连接的默认端口: 1.1 用root 连接进入系统: 1.2 修改ssh的配置文件 #vi /etc/ssh/sshd_config 在13行找到#Port 22 (默认端口22) 1. ...

  4. Vim 分隔窗口

    一,分隔窗口: 打开文件时在:命令模型时下面输入:split 将分隔为上下2个窗口:默认上窗口为活动窗口,可以通过CTRL-w来来回切换窗口; :close 为关闭窗口,最后一个窗口不能关闭: :on ...

  5. 关于spring事务注解

    关于事务的注解常用如下1.如果有事务, 那么加入事务, 没有的话新建一个(默认情况下),也就是当我们要开启事务的时候才用,即有数据库有增删改操作@Transactional(rollbackFor=E ...

  6. Android 布局文件

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools=&q ...

  7. os.path

  8. STL stl_construct.h

    stl_construct.h // Filename: stl_construct.h // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com // Blog ...

  9. 【leetcode刷题笔记】Search in Rotated Sorted Array

    Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...

  10. freeMarker(十二)——模板语言补充知识

    学习笔记,选自freeMarker中文文档,译自 Email: ddekany at users.sourceforge.net 1.特殊变量参考 特殊变量是由FreeMarker引擎自己定义的变量. ...