IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c++中STL -> 正文阅读

[C++知识库]c++中STL

STL(starand template lib):标准模板库

背景:
1、c++面向对象和泛型编程思想,目的是复用性的提升
2、为了建立数据结构和算法的一套标准诞生了STL

  • STL从广义上分为:容器(container)算法(algorithm)迭代器(iterator)
  • 容器和算法之间通过迭代器无缝对接
  • STL几乎所有的代码都采用了模板类和模板函数

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

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

容器
容器可分为序列式容器和关联式容器

函数对象(仿函数)
概念

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

本质:
函数对象(仿函数)本质上是一个类,不是一个函数

函数对象使用:

  • 函数对象在使用时,可以像普通函数那样调用,可以有参数,也可以有返回值
  • 函数对象超出普通函数的概念,函数对象可以有自己的状态
  • 函数对象可以作为参数传递

下面列子:

1//函数对象在使用时,可以像普通函数那样调用,可以有参数,也可以有返回值
 class MyAdd {
public:
	int operator()(int v1, int v2)
	{
		return v1 + v2;
	}
};

void test02()
{
	MyAdd myAdd;
	cout << myAdd(10, 10) << endl; //这里对象使用就像函数调用
}


2、函数对象超出普通函数的概念,函数对象可以有自己的状态
class MyAdd {
public:
	int operator()(int v1, int v2)
	{
		return v1 + v2;
		count++;
	}
    int count; 记录operator()函数调用的次数 也就是有自己的状态
};

3、函数对象可以作为参数传递
void doPrint(MyAdd &myAdd, int v1, int v2)
{
    myAdd(v1, v2);
}

谓词
概念:

  • 返回bool类型的仿函数称为谓词
  • 如果operator()接收一个参数则称为一元谓词
  • 如果operator()接收两个参数则称为二元谓词

其中一元谓词的例子如下:

class PrintWorker {
public:
	bool operator()(int val)  //一元谓词的返回必须时bool
	{
		return val > 5;
	}
};

void test03()
{
	vector<int> v;
	for (int i = 0; i < 5; i++)
	{
		v.push_back(i);
	}

	vector<int>::iterator pos = find_if(v.begin(), v.end(), PrintWorker()); //返回满足条件的迭代器  PrintWorker()对象函数返回true时
	if (pos != v.end())
	{
		cout << "找到了大于5的数" << endl;
		cout << *pos << endl;
	}
	else {
		cout << "m没找到大于5的数" << endl;
	}
}

二元谓词例子如下:

//二元谓词
class MyCompare {
public:
	bool operator()(int val1, int val2)
	{
		return val1 > val2;
	}
};

void test04()
{
	vector<int> v;
    v.push_back(10);
	v.push_back(40);
	v.push_back(30);
	v.push_back(20);
	v.push_back(60);
	v.push_back(50);
	
	//系统默认提供的sort 算法策略是默认从小到大
	sort(v.begin(), v.end());
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << endl;
	}

	//使用函数对象(二元谓词)改变算法策略,改变规则为从大到小
	sort(v.begin(), v.end(), MyCompare());
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << endl;
	}
}

下面讲述内建函数对象

内建函数对象:STL定义了一些函数对象

分类:

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

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

算术仿函数:(+、-、*、/、!)

#include <functional>
void test05()
{
	//negate 一元仿函数 取反
	negate<int> n;
	cout << n(20) << endl;  //结果-20
    // plus 二元仿函数 加法
    plus<int> p;
	cout << p(10, 20) << endl;
}

关系仿函数: (大于、小于)

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-31 23:45:54  更:2022-03-31 23:49:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:56:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码