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迭代器

1.迭代器 的认知

迭代器: 就是一个类中类,通过运算符重载通过类中类的对象去遍历容器

迭代器的分类 : 正向迭代器: iterator? ? ? ? ? ? ? ? ?? ? begin();? ? ? ? ? ?? end();

? ? ? ? ? ? ? ? ? ? ? ? ? ?反向迭代器: reverse_iterator? ??? ?rbegin();? ? ? ? ? ??rend();

? ? ? ? ? ? ? ? ? ? ? ? ? ?常正向迭代器: const_iterator? ? ???cbegin();? ? ? ? ? ?cend();

? ? ? ? ? ? ? ? ? ? ? ? ? ?常反向迭代器:const_reverse_iterator? ? ???crbegin();? ? ? ??crend();

按功能分:正向:只能++

? ? ? ? ? ? ? ? ? 双向:能++能--

? ? ? ? ? ? ? ? ? 随机访问迭代器:访问哪里都可以

#include <iostream>
#include <vector>
using namespace std;

int main()
{
	vector<int>data = { 1,2,3,6,5,4 };
	vector<int>::iterator iter;
	for (iter = data.begin(); iter != data.end(); iter++)
	{
		cout << *iter << endl;//对象模仿指针*iter取数据
	}//正向迭代器
	auto riter = data.rbegin();
	for (; riter != data.rend(); riter++)
	{
		cout << *riter << endl;
	}//反向迭代器
	vector<int>::const_iterator c_iter;
	for (c_iter = data.begin(); c_iter != data.end(); c_iter++)
	{
		cout << *c_iter << endl;//对象模仿指针*iter取数据
	}//常正向迭代器
    return 0;
}

?容器中迭代器的分类

容器名迭代器类型
array随机访问
vector随机访问
deque随机访问
stack/queue/priority_queue(特定顺序存取不支持
list双向
set/multiset双向
map/multimap双向

迭代器辅助函数:

? ? ?advance(iterator iter,n);//移动

? ? ?distance(iterator begin,iterator end);//两个迭代器间的间距

? ? ?iter swap(iterato first,iterator end);//交换

拓展内容:特殊迭代器 流型迭代器-->一般用在辅助打印

输出流型

?ostream_iterator<_Ty> iter(ostream& out);

?ostream_iterator<_Ty> iter(ostream& out,char* str); ?输出流型迭代做赋值运算,意味着就是打印数据到屏幕上

?输入流型

?istream_iterator<_Ty> iter; //构造无参对象,是一个错误流 end_of_ostream? ? ? ? ? ? ? ? ?istream_iterator<_Ty> iter(istream& in); + *iter 等效cin>>操作

2.? Lambda表达式

? ? ? ? ?Lambda: 就是一个返回函数指针的表达式,它定义和返回值函数指针在一起的

? ? ? ? ?Lambda表达式的组成部分

? ? ? ? ?c++ // [捕获方式](函数参数)mutable exception->函数返回值类型{函数体;}

int Max(int a,int b)

{ return a>b?a:b; }

void print()

{ //Max的Lambda表达式写法 int(*pMax)(int,int)=[](int a,int b)mutable noexcept->int{ return a>b?a:b;};

/省略写法: 中间描述此都可以省略 auto ppMax=[](int a,int b){reutrn a>b?a:b;};

//捕获方式-->函数使用外部的变量的方式

[=] //值的方式捕获

[&] //引用的方式捕获

[this]//this指针方式捕获

[] //不捕获任何变量

[=,&x];//x用引用方式捕获,其他变量用值的方式捕获

#include <vector>
using namespace std;
int main()
{
	int(*pMax)(int, int) = nullptr;
	//Lambad表达式
	pMax = [](int a, int b)mutable noexcept->int {return a > b ? a : b; };
	cout << pMax(8, 9) << endl;//结果为9
	return 0;
}

3 仿函数

类模仿函数的行为,实质是无名对象调用重载的函数

仿函数做排序准则,或算法的计算准则

关键点:重载()

标准库中的仿函数

#include <iostream>
#include <vector>
#include <string>
#include <functional>//仿函数的头文件
#include <map>
using namespace std;

class Sum
{
public:
	int operator()(int a, int b)const
	{
		return a + b;
	}
};
int main()
{
	Sum s;
	cout << "显示调用" << s.operator()(8, 8) << endl;//显示调用成员函数
	cout << "隐式调用" << s(9, 9) << endl;
	cout << "无名对象调用" << Sum()(8, 9) << endl;
	cout << "无名对象调用" << Sum{}(8, 9) << endl;
	//标准库中的仿函数
	//算数
	cout << plus<int>{}(9, 9) << endl;//9+9=18
	//关系
	cout << equal_to<int>{}(8, 9) << endl;
	map<int, less<int>> map1;
	map<int, greater<int>> map2;
	//逻辑
	cout << logical_and<int>{}(5, 4);
	return 0;
}

4? ? 函数适配器

用来绑定函数调用时的参数,让其适应其他调用的用法

int Max(int a,int b)
{
	return a < b ? a : b;
}
void print(int(*pMax)(int,int), int a,int b)
{
	cout << pMax(a, b) << endl;
}

int main()
{
	cout << Max(8, 9) << endl;
	//基本用法
	auto pMax = bind(Max, std::placeholders::_1, 100);//把第二个参数置为100
	cout << pMax(99) << endl;//99和100比
	return 0;
}

5? ?函数包装器

函数包装器是什么?就是把函数指针包装成一个对象。通过这个对象调用函数?

一旦函数指针被函数包装器包装了,那这个包装器对象可以直接替

#include <iostream>
#include <string>
#include <functional>
using namespace std;
int Max(int a, int b) 
{
	cout << "包装普通函数:" << endl;
	return a > b ? a : b;
}
class MM 
{
public:
	void print(int a)    //void print(int a, MM* mm);
	{
		cout << "包装成员函数" << endl;
	}
	static void printStatic() 
	{
		cout << "包装静态的函数" << endl;
	}
protected:
};
void testMMFunc() 
{
	MM mm;
	function<void(int)> func(bind(&MM::print,&mm,std::placeholders::_1));
	func(12);
}
class Test 
{
public:
	void operator()(string str) 
	{
		cout << str << endl;
	}
};
void printData(int a, MM mm, string str) 
{
	cout << "bind和function" << endl;
}
void TestFuncBind() 
{
	function<void(string, int, MM)> pf = bind(printData,
		std::placeholders::_2, std::placeholders::_3, std::placeholders::_1 );
	pf("string", 1, MM());
	//3  1  2
}

int main() 
{
	function<int(int, int)> funcMax(Max);
	cout << funcMax(1, 3) << endl;

	function<int(int, int)> funcMax2=Max;
	function<void()> funcS(MM::printStatic);
	funcS();

	//仿函数包装
	Test test;
	function<void(string)> func = test;
	func("包装仿函数");
	TestFuncBind();
	//包装成员函数
	testMMFunc();
	return 0;
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-01-03 15:53:52  更:2022-01-03 15:56:00 
 
开发: 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 11:00:53-

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