C++语法复习笔记-9.C++STl、Boost库、多线程编程(进行中)

2023-05-16

文章目录

  • 1. STL
    • 1. 概览
    • 2. 容器
      • 2.1. 序列式容器vector、list、deque
        • 初始化
        • 遍历-for_each函数
      • 2.2. 适配器stack、queue、priority_queue
        • 初始化
        • 访问方式
      • 2.3. 关联型容器map、set
        • 插入元素
        • 遍历-仿函数
        • 查询-find函数
        • 删除-erase函数
          • 用for循环
          • 用find函数查找删除或直接删除
    • 3. 仿函数
      • 3.1 概念
      • 3.2 排序代码示例
        • C++ 原生函数
        • C++ 泛型编程
        • C++ 仿函数
        • C++ 仿函数模板
    • 4. 算法库
      • 4.1 总览
      • 4.2 `transform`和`lambda`表达式使用
      • 4.3 容器统计与二分查找
        • `count`统计指定元素出现次数
        • `count_if`条件统计
          • `binder2nd`&&`binder1st`比较函数
        • `binary_search`二分查找
        • `search`查找子序列

慕课网C++教程

1. STL

1. 概览

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. 容器

在这里插入图片描述

2.1. 序列式容器vector、list、deque

初始化

在这里插入图片描述

int iArr[] = { 1, 2,3,4,5 };
vector<int> iVector(iArr, iArr + 4); // 通过地址,初始化vector[1,2,3,4]
list<int> iList(iArr, iArr + 4);
deque<int> iDeque(iArr, iArr + 4);

遍历-for_each函数

在这里插入图片描述

// 显示-重载运算符-函数
struct Display { 
	void operator()(int i)
	{
		cout << i << " ";
	}
};

int main() {
	for_each( iVector.begin(), iVector.end(), Display());
	cout << endl;
	for_each(iList.begin(), iList.end(), Display());
	cout << endl;
	for_each(iDeque.begin(), iDeque.end(), Display());
	cout << endl;
	return 0;
}

在这里插入图片描述

2.2. 适配器stack、queue、priority_queue

初始化

	int iArr[] = { 1, 2,3,4,5 };
	// 序列式容器
	vector<int> iVector(iArr, iArr + 4); // 通过地址,初始化vector[1,2,3,4]
	list<int> iList(iArr, iArr + 4);
	deque<int> iDeque(iArr, iArr + 4);
	// 适配器
	queue<int> iQueue(iDeque);  // 队列 先进先出
	stack<int> iStack(iDeque);  // 栈 先进后出
	priority_queue<int> iPQueue(iArr, iArr + 4); // 优先队列,按优先权

访问方式

// 遍历适配器
	while ( !iQueue.empty() )
	{
		cout << iQueue.front() << " ";  // 1  2 3 4
		iQueue.pop();
	}
	cout << endl;

	while (!iStack.empty())
	{
		cout << iStack.top() << " ";    // 4 3  2  1
		iStack.pop();
	}
	cout << endl;

	while (!iPQueue.empty())
	{
		cout << iPQueue.top() << " "; // 4 3 2 1
		iPQueue.pop();
	}
	cout << endl;

2.3. 关联型容器map、set

插入元素

map<string, double> studentSocres;
	// 插入元素
	// 方式1:像数组一样操作
	studentSocres["LiMing"] = 95.0;
	studentSocres["LiHong"] = 98.5;
	// 方式2:insert方法
	studentSocres.insert(pair<string, double>("zhangsan", 100.0) );
	studentSocres.insert(pair<string, double>("Lisi", 98.6));
	studentSocres.insert(pair<string, double>("wangwu", 94.5));
	// 方式3:value_type方法-指明插入数据的类型
	studentSocres.insert(map<string, double>::value_type("zhaoliu", 95.5) );

遍历-仿函数

// 仿函数
struct Display
{
	void operator()(pair<string, double> info)
	{
		cout << info.first << ": " << info.second << endl;
	}
};


int main() {
	for_each(studentSocres.begin(),studentSocres.end(), Display());
	cout << endl;
	return 0;
}

在这里插入图片描述

查询-find函数

// 查询操作-使用find函数完成查找工作
	map<string, double>::iterator iter;
	iter = studentSocres.find("zhaoliu");
	if (iter != studentSocres.end())
	{
		cout << "Found the score is: " << iter->second << endl;
	}
	else
	{
		cout << "Didn't find the key." << endl;
	}

删除-erase函数

在这里插入图片描述

  • 注意迭代器失效问题,删除迭代器指针后,迭代器要向下个位置移动一位,继续判断下个位置的key,value
  • 即,先清除临时迭代器中的内容,再将迭代器指向下个位置的内容studentSocres.erase(iter++);
// 使用迭代器完成遍历查找的过程
	iter = studentSocres.begin();
	while (iter != studentSocres.end())
	{
		if (iter->second < 98.0)  // 去除不是优秀的同学
		{
			studentSocres.erase(iter++);  // 注意:迭代器失效问题
		}
		else
		{
			iter++;
		}
	}
	for_each(studentSocres.begin(), studentSocres.end(), Display());
	cout << endl;

在这里插入图片描述

用for循环
	// 用for循环进行迭代器的遍历
	for (iter = studentSocres.begin(); iter != studentSocres.end(); iter++)
	{
		if (iter->second <= 98.5)
		{
			// 清除临时迭代器的值,函数返回时会指向下个迭代器,要有指针能够接收
			iter = studentSocres.erase(iter);  
		}
	}
	for_each(studentSocres.begin(), studentSocres.end(), Display());
	cout << endl;
用find函数查找删除或直接删除
// find得到迭代器并删除-避免由于循环导致迭代器失效问题
	iter = studentSocres.find("LiHong");
	studentSocres.erase(iter); 
	for_each(studentSocres.begin(), studentSocres.end(), Display());

	// 直接删除key
	int n = studentSocres.erase("LiHong1");
	cout << n << endl;
	for_each(studentSocres.begin(), studentSocres.end(), Display());

	// 删除范围内的值
	studentSocres.erase(studentSocres.begin(), studentSocres.end());
	for_each(studentSocres.begin(), studentSocres.end(), Display());
	cout << endl;

3. 仿函数

3.1 概念

在这里插入图片描述

3.2 排序代码示例

C++ 原生函数

// 自定义排序函数
bool MySort(int a, int b)
{
	return a < b; // a在前,a小,即从小到大排序
}
// 自定义输出函数
void Display(int a)
{
	cout << a << " ";
}

int main() {
// C++方式
	int arr[] = { 4, 3, 2, 1, 7 };
	sort(arr, arr + 5, MySort);  // 起始位置,原生定义函数
	for_each(arr, arr + 5, Display);
	cout << endl;
	return 0;
} 

在这里插入图片描述

C++ 泛型编程

// 定义泛型函数
template<class T>
inline bool MySortT(T const& a, T const& b) // 用const& 优化性能
{
	return a < b;
}
template<class T>
inline void DisplayT(T const& a)
{
	cout << a << " ";
}

int main() {
// C++泛型
	int arr2[] = { 4, 3, 2, 1, 7 };
	sort(arr2, arr2 + 5, MySortT<int>);
	for_each(arr2, arr2 + 5, DisplayT<int>);
	cout << endl;
	return 0;
} 

C++ 仿函数

// 定义仿函数
struct SortF
{
	bool operator() (int a, int b)
	{
		return a < b;
	}
};
struct DisplayF
{
	void operator() (int a)
	{
		cout << a << " ";
	}
};

int main() {
// C++仿函数
	int arr3[] = { 4, 3, 2, 1, 7 };
	sort(arr3, arr3 + 5, SortF());
	for_each(arr3, arr3 + 5, DisplayF());
	cout << endl;
	return 0;
}

C++ 仿函数模板

// C++仿函数模板
template<class T>
struct SortTF
{
	inline bool operator() (T const& a, T const& b) const
	{
		return a < b;
	}
};
template<class T>
struct DisplayTF
{
	inline void operator() (T const& a) const
	{
		cout << a << " ";
	}
};

int main() {
// C++仿函数模板
	int arr4[] = { 4, 3, 2, 1, 7 };
	sort(arr4, arr4 + 5, SortTF<int>() );
	for_each(arr4, arr4 + 5, DisplayTF<int>());
	cout << endl;
    return 0;
}

4. 算法库

4.1 总览

在这里插入图片描述

4.2 transformlambda表达式使用

在这里插入图片描述

// transform和lambda表达式
	int ones[] = { 1, 2, 3, 4, 5 };
	int twos[] = { 10, 20, 30, 40, 50 };
	int results[5];
	// 两个数组容器中的元素依次相加并返回
	// 传入第一个容器开始结束位置,第二个容器开始位置,结果容器,处理函数
	// 注意第二个容器和结果容器要能容纳第一个容器传入的大小
	transform(ones, ones + 5, twos, results, std::plus<int>()); 
	// lambda表达式(匿名函数)
	// [] :可以传入外部定义的变量,例如外部变量int a, [a]
	// () :接收自己函数中的参数
	// ->类型:接收函数返回类型
	// {}:函数的主体语句
	for_each(results, results + 5,
		[ ](int a)->void {cout << a << endl; } ); 
	cout << endl;

在这里插入图片描述

4.3 容器统计与二分查找

count统计指定元素出现次数

int arr[] = { 0, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 7, 8 };
int len = sizeof(arr) / sizeof(arr[0]);

// count:传入起始位置,要查找的数字,统计一共出现的次数
cout << count(arr, arr + len, 6) << endl; // 统计6的个数
	

count_if条件统计

在这里插入图片描述

int arr[] = { 0, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 7, 8 };
int len = sizeof(arr) / sizeof(arr[0]);
// count_if 条件查找
// bind2nd:数值在右边,函数是<,数值为7 ->表示 <7的个数
cout << count_if(arr, arr + len, bind2nd(less<int>(),  7) ) << endl; // <7的数:10个
// bind1st:数值在左边,函数是<,数值为7 ->表示 >7的个数
cout << count_if(arr, arr + len, bind1st(less<int>(),  7) ) << endl; // >7的数:1个
binder2nd&&binder1st比较函数

在这里插入图片描述
在这里插入图片描述

binary_search二分查找

在这里插入图片描述

int arr[] = { 0, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 7, 8 };
int len = sizeof(arr) / sizeof(arr[0]);
// binary_search二分查找指定元素是否存在
cout << binary_search(arr, arr + len, 9) << endl; // 返回0: 表示9找不到

search查找子序列

  • 传入两个容器序列的起始位置,查找第二个序列在第一个序列中的位置
    在这里插入图片描述
int arr[] = { 0, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 7, 8 };
int len = sizeof(arr) / sizeof(arr[0]);
vector<int> iA(arr + 2, arr + 6);   // {2,3,3,4} // 创建子序列
vector<int> iA2;
iA2.push_back(1);
iA2.push_back(9); // {1, 9}
// 查找子序列
// 返回地址位置,进行解引用,可以取地址中的值:2,如果不存在,返回一个负值表不存在
cout << *search(arr, arr + len, iA.begin(), iA.end()) << endl; // 2
cout << *search(arr, arr + len, iA2.begin(), iA2.end()) << endl; // 一个负数

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++语法复习笔记-9.C++STl、Boost库、多线程编程(进行中) 的相关文章

  • Linux-KVM虚拟机的创建和快照命令

    KVM xff1a Kernel based Virtual Machine的简称 xff0c 是一个开源的系统虚拟化模块 xff0c 自Linux 2 6 20之后集成在Linux的各个主要发行版本中 安装虚拟机脚本 xff1a 虚拟机的
  • 浅谈stm32的低功耗模式

    stm32标准库实现低功耗 一 概述 stm32不同系列芯片支持的低功耗模式各有差异 xff0c 本文以F103系列芯片为例 xff0c 简单讲解不同低功耗模式的特点和使用方法 二 低功耗 简述 默认情况下 xff0c 系统或电源复位后 x
  • Vncservice多用户登陆

    1 修改 etc sysconfig vncserver 添加一个 longgangtest 的用户 2 在系统中新建一个 longgangtest的用户 adduser longgangtest 然后执行 好像需要执行 xff0c 测试的
  • 使用正点原子资料点亮野火linux开发板LED

    64 TOC
  • 斜杠、反斜杠的区别

    我们在写程序时候经常会混淆 和 xff0c 经常听到别人讲 斜杠 xff0c 反斜杠 xff0c 那么怎么区分它们呢 xff1f 还有它们各在什么样的场景下使用呢 xff1f 本篇文章是来区别这两个符号和总结使用它们的情形 1 区分 是斜杠
  • 七月在线机器学习

    异方差性ID3算法中文分词HMM非参数统计和参数统计切比雪夫不等式条件熵K L变换和主成分分解生成模型和判别模型非抽样误差径向基函数线性回归的基本假设最大熵SVM中的C和gamma参数距离度量牛顿法和拟牛顿法拉灯问题铺瓷砖问题哈夫曼编码树最
  • ros2串口通信

    目录 前期准备新建工程添加头文件添加源文件添加节点源文件修改package xml和CMakeLists txt安装依赖编译执行打开虚拟串口打开发布者打开订阅者打开监听 xff0c 查看是否有数据接收 前期准备 登录github下载代码ht
  • 产品化思维

    1 1 产品的本质 能够供给市场 xff0c 被人们使用和消费 xff0c 并能满足人们某种需求的任何东西 xff0c 包括有形的物品 无形的服务 组织 观念或它们的组合 定义 xff1a 市场是提供给买卖双方交易的平台 xff0c 而人在
  • Orcad生成BOM包含封装信息的方法

    在使用ORCAD开发后期 xff0c 总少不了导出BOM xff0c 根据BOM备料的过程 但是ORCAD默认的生成BOM方式并不能直接包含封装等信息 xff0c 这就需要在生成BOM的过程中做一些改动了 首先就如生成BOM界面 而后在需要
  • linux防恶意软件防病毒 防护工具

    保持Linux系统的安全 抵御Linux恶意软件和Linux病毒 据大多数估计 xff0c 目前互联网上超过50 的网络服务器正在运行某种版本的Linux或者相关的 nix系统 这应该足以让你认识到 xff0c 分析 识别 根除Linux系
  • STM32片内FLASH烧写错误导致ST-LINK烧录不进程序的问题解决过程

    STM32片内FLASH烧写错误导致ST LINK烧不进程序的问题解决过程 项目及配置描述 这个问题是在做bootloader OTA测试时出现的 xff0c 其中bootloader由http iot rt thread com 生成的S
  • 使用word写CSDN博客文章

    版权声明 xff1a 本文为博主原创文章 xff0c 可以转载 xff0c 但是请注明出处 http blog csdn net bjarnecpp article details 70185890 用CSDN自带的xhEditor撰写工具
  • stm32外部中断的操作步骤

    简述 本文简单介绍stm32外部中断的一般操作步骤 xff0c 后续会补充外部中断的相关内容 stm32的中断控制器支持19个外部中断 事件请求 xff1a line0 line15 xff1a 这16条line分别对应不同GPIO口的输入
  • java 中 public,default,protected,private区别

    对于继承自己的class xff0c base class可以认为他们都是自己的子女 xff0c 而对于和自己一个目录下的classes xff0c 认为都是自己的朋友 1 public xff1a 对 所有用户 开放 xff0c 所有用户
  • 多传感器融合技术(基本概念、前融合和后融合的区别)

    多传感器信息融合 xff08 Multi sensor Information Fusion MSIF xff09 xff0c 就是利用计算机技术将来自多传感器或多源的信息和数据 xff0c 在一定的准则下加以自动分析和综合 xff0c 以
  • Eigen 取三角矩阵(对应matlab tril triu函数)

    include lt Eigen Dense gt include lt iostream gt using namespace Eigen using namespace std int main MatrixXf zzz 4 4 Eig
  • git clone 项目所有分支方法

    git clone 默认是克隆Head指向的master分支 xff0c 如果是多分支 xff0c 我们可以单个克隆分支项目 1 只克隆单分支 xff08 非master xff09 xff1a git clone b 分支名 https
  • Eclipse中的报错: Error setting expression 'submit' with value ['确定', ]

    1 Eclipse中的报错 xff1a Error setting expression 39 submit 39 with value 39 确定 39 2 页面中的报错 xff1a Struts Problem Report Strut
  • Vue.js 中,7种定义组件模板的方法

    摘要 xff1a 有多种方式可以在vue中定义模板组件 我算了一下 xff0c 至少有7种不同的方法 xff1a 字符串 xff08 String xff09 模板字符串 xff08 Template literal xff09 X Tem
  • 高效编写简历项目经验,备受500强HR推荐的STAR法则

    随着就业竞争越来越大 xff0c 投简历获取面试机会 xff0c 不仅仅需要有良好的技能储备 xff0c 更需要一份优秀的求职简历 什么样的简历才能通过层层筛选 xff0c 获得HR的青睐 xff1f 项目经验绝对是重要的参考之一 一份简历

随机推荐

  • es6删除对象的某个属性

    1 不改变原始对象 方法1 删除age属性为例 const obj 61 name 39 xingxing 39 gender 39 girl 39 age 24 const objNew 61 name gender 61 gt name
  • STM32电路晶振

    晶振是由石英晶体组成的 xff0c 石英晶体之所以能当为振荡器使用 xff0c 是基于它的压电效应 xff1a 在晶片的两个极上加一电场 xff0c 会使晶体产生机械变形 xff1b 在石英晶片上加上交变电压 xff0c 晶体就会产生机械振
  • C语言的memcpy和memmove

    浅谈memcpy和memmove POSIX和C标准明确表示 xff0c 使用重叠区域的mem cpy 会产生未定义的行为 memcpy和memmove的区别是 xff1a 当内存发生局部重叠时memmove函数能够保证拷贝结果的正确性 x
  • Integer和int区别

    1 Integer是int的包装类 xff0c int则是java的一种基本数据类型 2 Integer变量必须实例化才能使用 xff0c int变量不需要实例化 3 Integer的默认值是null xff0c 而int的默认值是0 4
  • STM32内存结构介绍,FreeRTOS内存分配技巧,Stack_Size和Heap_Size大小设置

    STM32内存结构介绍和FreeRTOS内存分配技巧 这是我第一次使用FreeRTOS构建STM32的项目 xff0c 踩了好些坑 xff0c 又发现了我缺乏对于操作系统的内存及其空间的分配的知识 xff0c 故写下文档记录学习成果 文章最
  • 需要看的技术书籍

    语言类 xff1a 深度探索C 43 43 对象模型 xff0c 对应的英文版是 Inside C 43 43 43 Object Model 程序编译 链接 加载类 xff1a 链接器和加载器 xff0c 对应的英文版是 Linker a
  • Crazyflie2.0飞行器参考网站

    1 xff0c Crazyflie2 0的code中提到x io官网 xff0c 对sensor的驱动和数据融合都在这里 xff0c 并且这上面有一些有趣的project xff0c 可以参考下 http www x io co uk op
  • 用sphinx写文档

    1 Sphinx简介 Sphinx是一个开源的文档工具 最开始被设计用于创建新的Python文档 xff0c 后来被广泛应用与Python项目 xff0c 现在对C xff0f C 43 43 的支持也已经相当不错 并且正在逐步增加对更多其
  • 一些常用的刷题网站

    PythonTip PythonTip 挑战Python http www pythontip com coding code oj HackerRank 还不错 xff0c 但是没有代码提示 xff0c 没有代码提示是小事 xff0c 可
  • 麻将胡牌逻辑 java

    最近写了一个麻将的胡牌逻辑 xff0c 这个麻将是没有万字牌 和 东西南北风牌 xff0c 以前也写过麻将胡牌逻辑 xff0c 都没有记录 xff0c 这次记录一下 xff0c 方便以后查阅 胡牌 64 param isZiMo 是否自摸
  • ucos 学习书籍

    ucos学习书籍整理记录 xff1a 入门看一本 xff0c 加上实例不用一周就上手了 嵌入式实时操作系统uc os 2 是邵贝贝翻译的 理解与提升 xff0c 应用提高 xff1a 嵌入式实时操作系统uc os 2原理及应用 任哲 嵌入式
  • SEO作外链9个没有套路完全免费收录的分类目录网站

    分类目录是指通过人工的方式收集网站资源 xff0c 并把这些拥有一定价值的网站资源通过人工的方式对他们的主题进行整理组织之后 xff0c 存放到相应的目录下面 xff0c 从而形成的网站分类目录的体系 搜索引擎非常重视高质量分类目录这样的外
  • 12个(发外链)完全免费、免费收录没有套路的分类目录网站

    广大网民肯定疑惑什么是分类目录网站呢 xff1f 分类目录网站是指 xff1a 把所有网站人工或系统类别进行分开 xff0c 分开到各个相应的目录下 分类目录也可以这样的理解为是指通过人工的方式收集各行业网站资源 xff0c 并把这些拥有一
  • linux系统进程间通信方式(二):消息队列

    简介 本文章继续介绍linux进程间通信的方式 xff1a 消息队列 消息队列也是system V的IPC对象 xff0c 它也是存在于内核中 xff0c 有自己的ID xff1b 并且通过一个唯一的key来绑定它 linux提供了一些ap
  • linux学习shell脚本或命令时“ >/dev/null 2>&1 “相关知识说明

    在学习Linux的过程中 常会看到一些终端命令或者程序中有 34 gt dev null 2 gt amp 1 34 出现 由于已经遇到了好几次了 为了理解清楚 不妨花点时间百度或者google一下相关的知识 0 表示键盘输入 stdin
  • linux--journalctl 日志查看方法

    1 概述 日志管理工具journalctl是centos7上专有的日志管理工具 xff0c 该工具是从message这个文件里读取信息 Systemd统一管理所有Unit的启动日志 带来的好处就是 xff0c 可以只用journalctl一
  • 使用putty软件通过SSH方式登录华为设备时出现“Signature from server‘s host key is invalid”错误的解决方法

    问题现象 使用putty软件 xff08 0 71及之后的版本 xff09 通过SSH方式登录时可能会出现 Signature from server s host key is invalid 错误提示 xff1a 解决方法 方法1 xf
  • diy 企业级路由器(route os )

    Mikrotik Router Os 来自拉托维亚 xff0c 一个不起眼的欧洲小国家 xff0c 但是它的功能却是很强大 今天我就用口碑比较好的 ROS2 9 6 版进行讲解了 主要功能 xff1a IP 路由 支持无线热区 PPPoE
  • 双系统Ubuntu 18.04 + ROS Melodic + openvins +VINS-mono + Realsense L515 环境配置

    Ubuntu 18 04 准备工作 电脑图标右键 管理 磁盘管理 xff0c 选择空闲空间的D或E盘右键 压缩卷 压缩102400 xff08 100G xff09 下载ubuntu 18 04 6 desktop amd64 iso ht
  • C++语法复习笔记-9.C++STl、Boost库、多线程编程(进行中)

    文章目录 1 STL1 概览2 容器2 1 序列式容器vector list deque初始化遍历 for each函数 2 2 适配器stack queue priority queue初始化访问方式 2 3 关联型容器map set插入