自学内容网 自学内容网

从C向C++14——STL初识及函数对象

一.STL初识

1.STL的诞生

  • 长久以来,软件界一直希望建立一种可重复利用的东西
  • C++的面向对象泛型编程思想,目的就是复用性的提升
  • 多情况下,数据结构和算法都未能有一套标准,导致被迫从事大量重复工作
  • 为了建立数据结构和算法的一套标准,诞生了STL

2.STL的基本概念

  • STL(Standard Template Library,标准模板库)
  • STL从广义分为: 容器(container) 算法(algorithm) 迭代器(iterator)
  • 容器和算法之间通过迭代器进行无缝连接
  • STL 几平所有的代码都采用了模板类或者模板函数

3.STL六大组件

STL大体分为六大组件,分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器

  • 1.容器: 各种数据结构,如vector、list、deque、set、map等,用来存放数据.
  • 2.算法: 各种常用的算法,如sort、find、copy、for_each
  • 3.迭代器: 扮演了容器与算法之间的胶合剂
  • 4.仿函数: 行为类似函数,可作为算法的某种策略。
  • 5.适配器:一种用来修饰容器或者仿函数或迭代器接口的东西。
  • 6.空间配置器: 负责空间的配置与管理。

4. 容器、算法、迭代器

容器:置物之所也。
STL容器就是将运用最广泛的一些数据结构实现出来,常用的数据结构:数组,链表,树,栈队列,集合,映射表等。

这些容器分为序列式容器和关联式容器两种:

  • 序列式容器:强调值的排序,序列式容器中的每个元素均有固定的位置,上面例子常见容器都是序列式容器
  • 关联式容器:二叉树结构,各元素之间没有严格的物理上的顺序关系

算法:问题之解法也。

有限的步骤,解决逻辑或数学上的问题,这一门学科我们叫做算法(Algorithms)]

算法分为:质变算法和非质变算法。

  • 质变算法: 是指运算过程中会更改区间内的元素的内容。例如拷贝,替换,删除等等;
  • 非质变算法:是指运算过程中不会更改区间内的元素内容,例如查找、计数、遍历、寻找极值等等。

迭代器:容器和算法之间粘合剂。

提供一种方法,使之能够依序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表示方式

每个容器都有自己专属的选代器

迭代器使用非常类似于指针,初学阶段我们可以先理解迭代器为指针

迭代器种类:
在这里插入图片描述

常用的容器中迭代器种类为双向迭代器,和随机访问选代器

二.函数对象

1.函数对象理解

  • 重载函数操作调用符()的类,其对象常称为函数对象
  • 函数对象使用重载的()时,行为类似函数调用,也叫仿函数

函数对象(仿函数)本质是一个类,而不是一个函数。

函数对象使用:

  • 函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值

    class Myadd
    {
    public:
        int operator()(int v1, int v2)
        {
            return v1 + v2;
        }
    };
    
    void test01()
    {
        Myadd myadd;
        cout << myadd(10, 10) << endl;
    }
    
  • 函数对象超出普通函数的概念,函数对象可以有自己的状态

    class Myadd
    {
    public:
        Myadd() {
            this->count = 0;
        }
        int operator()(int v1, int v2)
        {
            return v1 + v2;
        }
        int count;
    };
    
  • 函数对象可以作为参数传递

三.谓词

1.一元谓词

  • 返回bool类型的仿函数称为谓词
  • 如果operator()接受一个参数,那么叫做一元谓词
  • 如果operator()接受两个参数,那么叫做二元谓词
class greatfive
{
public:
bool operator()(int val)
{
return val>5;
}
};

2.二元谓词

class Myadd
{
public:
    bool operator()(int v1, int v2)
    {
        return v1>v2;
    }
  
};

四.内建函数对象

1.内建函数概念

STL自己建立一些仿函数,叫它内建函数

这些仿函数分类有:

  • 算数仿函数
  • 关系仿函数
  • 逻辑仿函数

这些仿函数所产生的对象,用法和一般函数完全相同

使用内建函数对象,需要引入头文件#include <functional>

2.算术仿函数

功能:

  • 实现四则运算
  • 其中negate取反是一元运算,其他都是二元运算

仿函数原型:

template<class T> T plus<T>                    //加法仿函数
template<class T> T minus<T>                   //减法仿函数
template<class T> T multiplies<T>              //乘法仿函数
template<class T> T divides<T>                 //除法仿函数
template<class T> T modulus<T>                 //取模仿函数
template<class T> T negate<T>                  //取反仿函数

使用一元仿函数:

negate<int> n;
cout<<n(50)<<endl;

使用二元仿函数

plus<int> n;
cout<<n(50,50)<<endl;

3.关系仿函数

实现关系对比:

template<class T> bool equal_to<T>                                //等于
template<class T> bool not_equal_to<T>                            //不等于
template<class T> bool greater<T>                                 //大于
template<class T> bool greater_equal<T>                           //大于等于
template<class T> bool less<T>                                    //小于
template<class T> bool less_equal<T>                              //小于等于

4.逻辑仿函数

template<class T> bool logical_and<T>                           //逻辑与
template<class T> bool logical_or<T>                            //逻辑或
template<class T> bool logical_not<T>                           //逻辑非




















原文地址:https://blog.csdn.net/weixin_51496226/article/details/137957793

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!