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

泛型程序设计的基本概念

  • 编写不依赖于具体数据类型的程序
  • 将算法从特定的数据结构中抽象出来,成为通用的
  • C++的模板为泛型程序设计奠定了关键的基础

术语:概念

  • 用来界定具备一定功能的数据类型。例如:

    • 将“可以比大小的所有数据类型(有比较运算符)”这一概念记为Comparable
    • 将“具有公有的复制构造函数并可以用‘=’赋值的数据类型”这一概念记为Assignable
    • 将“可以比大小、具有公有的复制构造函数并可以用‘=’赋值的所有数据类型”这个概念记作Sortable
  • 对于两个不同的概念A和B,如果概念A所需求的所有功能也是概念B所需求的功能,那么就说概念B是概念A的子概念。例如:
    • Sortable既是Comparable的子概念,也是Assignable的子概念

术语:模型

  • 模型(model):符合一个概念的数据类型称为该概念的模型,例如:

    • int型是Comparable概念的模型。
    • 静态数组类型不是Assignable概念的模型(无法用“=”给整个静态数组赋值)

用概念做模板参数名

  • 很多STL的实现代码就是使用概念来命名模板参数的。
  • 为概念赋予一个名称,并使用该名称作为模板参数名。
  • 例如
    • 表示insertionSort这样一个函数模板的原型:
    • template <class Sortable>
      void insertionSort(Sortable a[], int n);

STL简介

标准模板库(Standard Template Library,简称STL)提供了一些非常常用的数据结构和算法

STL简介

  • 标准模板库(Standard Template Library,简称STL)定义了一套概念体系,为泛型程序设计提供了逻辑基础
  • STL中的各个类模板、函数模板的参数都是用这个体系中的概念来规定的。
  • 使用STL的模板时,类型参数既可以是C++标准库中已有的类型,也可以是自定义的类型——只要这些类型是所要求概念的模型。

STL的基本组件

  • 容器(container)
  • 迭代器(iterator)
  • 函数对象(function object)
  • 算法(algorithms)

STL的基本组件间的关系

  • Iterators(迭代器)是算法和容器的桥梁。

    • 将迭代器作为算法的参数、通过迭代器来访问容器而不是把容器直接作为算法的参数。
  • 函数对象作为算法的参数而不是将函数所执行的运算作为算法的一部分。
  • 使用STL中提供的或自定义的迭代器和函数对象,配合STL的算法,可以组合出各种各样的功能。

STL的基本组件——容器(container)

  • 容纳、包含一组元素的对象。
  • 基本容器类模板
    • 顺序容器

      • array(数组)、vector(向量)、deque(双端队列)、forward_list(单链表)、list(列表)
    • (有序)关联容器
      • set(集合)、multiset(多重集合)、map(映射)、multimap(多重映射)
    • 无序关联容器
      • unorderedset (无序集合)、unorderedmultiset(无序多重集合)
      • unorderedmap(无序映射)、unordermultimap(无序多重映射)
  • 容器适配器
    • stack(栈)、queue(队列)、priority_queue(优先队列)
  • 使用容器,需要包含对应的头文件

STL的基本组件——迭代器(iterator)

  • 迭代器是泛化的指针,提供了顺序访问容器中每个元素的方法
  • 提供了顺序访问容器中每个元素的方法;
  • 可以使用“++”运算符来获得指向下一个元素的迭代器;
  • 可以使用“*”运算符访问一个迭代器所指向的元素,如果元素类型是类或结构体,还可以使用“->”运算符直接访问该元素的一个成员;
  • 有些迭代器还支持通过“--”运算符获得指向上一个元素的迭代器;
  • 迭代器是泛化的指针:指针也具有同样的特性,因此指针本身就是一种迭代器;
  • 使用独立于STL容器的迭代器,需要包含头文件。

STL的基本组件——函数对象(function object)

  • 一个行为类似函数的对象,对它可以像调用函数一样调用。
  • 函数对象是泛化的函数:任何普通的函数和任何重载了“()” 运算符的类的对象都可以作为函数对象使用
  • 使用STL的函数对象,需要包含头文件

STL的基本组件——算法(algorithms)

  • STL包括70多个算法

    • 例如:排序算法,消除算法,计数算法,比较算法,变换算法,置换算法和容器管理等
  • 可以广泛用于不同的对象和内置的数据类型。
  • 使用STL的算法,需要包含头文件。
  • 例10-1从标准输入读入几个整数,存入向量容器,输出它们的相反数

STL程序实例

transform算法的一种实现:

template <class InputIterator, class OutputIterator, class UnaryFunction>
OutputIterator transform(InputIterator first, InputIterator last, OutputIterator result, UnaryFunction op) {
    for (;first != last; ++first, ++result)
        *result = op(*first);
    return result;
}
  • transform算法顺序遍历firstlast两个迭代器所指向的元素;
  • 将每个元素的值作为函数对象op的参数;
  • 将op的返回值通过迭代器result顺序输出;
  • 遍历完成后result迭代器指向的是输出的最后一个元素的下一个位置,transform会将该迭代器返回

本文内容参考自C++语言程序设计(第4版),郑莉,清华大学出版社

时间: 2024-08-09 12:55:30

C++ 泛型程序设计与STL模板库(1)---泛型程序设计简介及STL简介与结构的相关文章

C++STL模板库之vector

目录 STL之Vecter 一丶STL简介 二丶Vector用法 1.vector容器的使用 2.vector迭代器. 3.vector中的方法. STL之Vecter 一丶STL简介 STL 是标准模板库的意思. 就是数据结构,封装成类让我们使用. 使用的时候我们要了解数据结构才可以使用这些类.因为数据结构不知道是什么结构你用类的话也用不明白. 二丶Vector用法 1.vector容器的使用 首先介绍的第一个序列容器就是 vector. 它底层是数组.可以理解为是动态数组. 我们自己也可以写

STL 模板库中的Stack(栈)使用

Stack 从名字中可以看得出来意思是栈, 栈的特点就是先进后出,FILO. 具体使用看下面的代码: #include <iostream> #include <stack> using namespace std; int main() { stack<int> sc; for(int i = 0; i < 10l; ++i) sc.push(i); while( !sc.empty()) { cout<<sc.top()<<"

C++ STL模板库

list vector  set map区别 本质解释: 对比: 1)vector与数组 数组声明时要指定大小.vector可变. 两者内存都是连续的. 2)vector与list vector是连续的内存,list是双向连接表,在内存中不一定连续. 当数值内存不够时,vector会重新申请一块足够大的连续内存,把原来的数据拷贝到新的内存里面:list因为不用考虑内存的连续,因此新增开销比vector小. list只能通过指针访问元素,随机访问元素的效率特别低,在需要频繁随机存取元素时,使用ve

C++STL模板库关联容器之set/multiset

目录 一丶关联容器简介.set/multiset 二丶演示代码. 一丶关联容器简介.set/multiset 我们的序列容器,底层都是线性表构成的. 比如 vector list deque. 关联容器底层就是红黑树. 以set集合为例. set内部元素根据其值自动排序.每个元素的值只允许出现一次.不能重复. multiset 跟set一样.只不过值可以重复. 二丶演示代码. #include <set> using namespace std; int main(char *argc, ch

C++STL模板库序列容器之deque

目录 一丶队列容器deque简介 二丶使用代码演示 一丶队列容器deque简介 deque底层跟vector一样,都是数组维护.不同的是可以操作头部. 二丶使用代码演示 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <time.h> #include <algorithm> #include <iostream> #include &

C++标准模板库-STL库基本算法

原文链接:http://blog.csdn.net/wangfengwf/article/details/11580989#t9 16.4  STL库基本算法 标准C++STL库中算法组件为一个很重要的组成部分,该组件提供了大多数最常见的通用算法的实现,并且这些实现是经过很多测试试验并被公认在处理上是高效的.将这些最常见的算法通用化实现,最大的优势就是开发者在应用中不需要为具体的常见算法的实现而费神,只需要包含相应的头文件直接使用即可,不仅仅提高的软件开发的效率,同时还有助于软件重用性的提高.

C++标准模板库学习。。。

作为C++标准库相当重要的一部分,STL库提供一系列组件操作.它主要可以分为容器.迭代器.基本算法.函数对象以及内存分配器和配接器六个部分.整个STL库的代码都采用模板函数以及模板类的方式实现,具有高度的通用性.对于传统的应用程序来讲,模板库支持并且倡导一种新的编程风格,即称为泛型编程思想,以通用的模板方式来编写应用程序中的数据结构与算法. 16.1  STL常见容器 C++标准STL库中封装实现了常见数据结构,并以容器的方式提供给用户使用.STL容器主要包含vector向量.deque队列.l

Part10 泛型程序设计与C++标准模板库 10.1泛型程序设计及STL的结构

1泛型程序设计的基本概念泛型程序设计: 编写不依赖于具体数据类型的程序 将算法从特定的数据结构中抽象出来,成为通用的 C++的模板为泛型程序设计奠定了关键的基础 术语:概念用来界定具备一定功能的数据类型.例如: 将"可以比大小的所有数据类型(有比较运算符)"这一概念记为Comparable 将"具有公有的复制构造函数并可以用'='赋值的数据类型"这一概念记为Assignable 将"可以比大小.具有公有的复制构造函数并可以用'='赋值的所有数据类型&quo

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

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