C++11 新特性:新增算法
C++11 在标准库中引入了一系列新的算法,这些新增的算法使我们的代码写起来更简洁方便。
下面是 C++11 中新增加的一些重要算法的简要描述和使用方法:
1、非修改序列操作
std::all_of
:检查范围内的所有元素是否都满足指定的谓词。std::any_of
:检查范围内是否存在满足指定谓词的元素。std::none_of
:检查范围内是否没有元素满足指定的谓词。std::find_if_not
:在范围内查找不满足指定谓词的第一个元素,这个算法和已经存在的std::find_if
是相反的。
代码示例
以下的示例代码用来演示使用上面这些算法检查容器中元素的属性。
#include <iostream>
#include <vector>
#include <algorithm>int main() {// 初始化一个整数向量std::vector<int> numbers = {2, 4, 6, 8, 10, 12};// 检查所有元素是否都是偶数bool allEven = std::all_of(numbers.begin(), numbers.end(), [](int x) {return x % 2 == 0;});std::cout << "All elements are even: " << std::boolalpha << allEven << std::endl;// 检查是否存在大于10的元素bool anyGreaterThanTen = std::any_of(numbers.begin(), numbers.end(), [](int x) {return x > 10;});std::cout << "Any element greater than 10: " << anyGreaterThanTen << std::endl;// 检查是否没有元素小于0bool noneLessThanZero = std::none_of(numbers.begin(), numbers.end(), [](int x) {return x < 0;});std::cout << "No elements less than 0: " << noneLessThanZero << std::endl;// 查找第一个不是偶数的元素auto it = std::find_if_not(numbers.begin(), numbers.end(), [](int x) {return x % 2 == 0;});if (it != numbers.end()) {std::cout << "First element not even: " << *it << std::endl;} else {std::cout << "All elements are even" << std::endl;}return 0;
}
输出:
All elements are even: true
Any element greater than 10: true
No elements less than 0: true
All elements are even
2、修改序列操作
std::copy_if
:复制满足指定条件的元素到另一个容器。std::move
:将元素从一个容器移动到另一个容器(move),而非拷贝(copy)。std::move_backward
:类似std::move
,但是从范围的末尾开始操作,适合某些特定的容器操作。
代码示例
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> numbers = {1, 6, 3, 8, 5, 7, 2, 9};std::vector<int> copied;std::vector<int> moved(8); // 预分配空间以便使用std::move_backward// 1. 使用std::copy_if复制所有大于5的元素std::copy_if(numbers.begin(), numbers.end(), std::back_inserter(copied), [](int n) { return n > 5; });std::cout << "Copied elements: ";for (auto n : copied) std::cout << n << " ";std::cout << "\n";// 2. 使用std::move将numbers的元素移动到另一个向量std::vector<int> movedNumbers(std::make_move_iterator(numbers.begin()), std::make_move_iterator(numbers.end()));std::cout << "Moved elements: ";for (auto n : movedNumbers) std::cout << n << " ";std::cout << "\nOriginal vector (now empty elements): ";for (auto n : numbers) std::cout << n << " "; // 注意:numbers的元素现在处于未定义状态std::cout << "\n";// 3. 使用 std::move_backward,移动前 6 个元素std::move_backward(movedNumbers.begin(), std::next(movedNumbers.begin(), 6), moved.end());std::cout << "Elements after move_backward: ";for (auto n : moved) std::cout << n << " ";std::cout << "\n";return 0;
}
输出:
Copied elements: 6 8 7 9
Moved elements: 1 6 3 8 5 7 2 9
Original vector (now empty elements): 1 6 3 8 5 7 2 9
Elements after move_backward: 0 0 1 6 3 8 5 7
注意第 2 步操作,我们使用 make_move_iterator
创建两个 move_iterator,如果使用下面这个语句:
std::vector<int> copiedNumbers(numbers.begin(), numbers.end());
将不会使用移动方式,而是将数值拷贝到 copiedNumbers。
3、排序和相关操作
std::is_partitioned
:检查给定范围是否被分割成两个满足特定条件的子序列。std::partition_copy
:根据谓词将元素分割并复制到两个不同的容器。std::partition_point
:找到分割序列的分界点。
代码示例
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>int main() {std::vector<int> numbers = {1, 9, 3, 8, 5, 7, 2, 6};// 先对向量进行分区std::partition(numbers.begin(), numbers.end(), [](int n) { return n > 5; });std::cout << "Partitioned: ";for(auto n : numbers) std::cout << n << " ";std::cout << std::endl;// 检查是否已分区bool partitioned = std::is_partitioned(numbers.begin(), numbers.end(), [](int n) { return n > 5; });std::cout << "Is partitioned: " << std::boolalpha << partitioned << "\n";std::vector<int> less_than_6, greater_than_5;// 复制分区元素std::partition_copy(numbers.begin(), numbers.end(), std::back_inserter(greater_than_5), std::back_inserter(less_than_6),[](int n) { return n > 5; });std::cout << "Elements greater than 5: ";for (auto n : greater_than_5) std::cout << n << " ";std::cout << "\nElements not greater than 5: ";for (auto n : less_than_6) std::cout << n << " ";std::cout << "\n";// 查找分区点auto partitionPoint = std::partition_point(numbers.begin(), numbers.end(), [](int n) { return n > 5; });std::cout << "Partition point at: " << *partitionPoint << "\n";return 0;
}
输出:
Partitioned: 6 9 7 8 5 3 2 1
Is partitioned: true
Elements greater than 5: 6 9 7 8
Elements not greater than 5: 5 3 2 1
Partition point at: 5
4、数值操作
std::iota
:在给定范围内填充递增序列,从而生成有序序列。
代码示例
std::iota
定义在<numeric>
头文件中。
#include <iostream>
#include <vector>
#include <numeric> // 包含 std::iotaint main() {std::vector<int> numbers(10); // 创建一个大小为10的vector// 使用std::iota填充numbers,使其元素从0开始递增std::iota(numbers.begin(), numbers.end(), 0);// 输出填充后的vectorstd::cout << "The vector contains: ";for(int n : numbers) {std::cout << n << " ";}std::cout << std::endl;// 用std::iota生成另一个序列,此时起始值为10std::iota(numbers.begin(), numbers.end(), 10);// 输出新的序列std::cout << "After reassigning, the vector contains: ";for(int n : numbers) {std::cout << n << " ";}std::cout << std::endl;return 0;
}
输出:
The vector contains: 0 1 2 3 4 5 6 7 8 9
After reassigning, the vector contains: 10 11 12 13 14 15 16 17 18 19
5、堆操作
std::is_heap
:检查给定范围是否形成一个堆。std::is_heap_until
:找到给定范围中不满足堆性质的第一个位置。std::make_heap
、std::push_heap
、std::pop_heap
、std::sort_heap
:虽然这些函数在 C++11 之前就存在,但 C++11 对它们进行了优化和改进,提高了与新特性的兼容性。
#include <iostream>
#include <vector>
#include <algorithm>int main() {// 初始化一个未排序的整数向量std::vector<int> numbers = {4, 1, 3, 5, 2, 9, 7, 8, 6};// 使用std::make_heap将向量转换为最大堆std::make_heap(numbers.begin(), numbers.end());std::cout << "After make_heap, numbers: ";for(int n : numbers) {std::cout << n << " ";}std::cout << std::endl;// 检查是否为堆bool isHeap = std::is_heap(numbers.begin(), numbers.end());std::cout << "Is the vector a heap? " << std::boolalpha << isHeap << std::endl;// 向堆中添加新元素numbers.push_back(10);std::push_heap(numbers.begin(), numbers.end()); // 重新调整为堆std::cout << "After push_heap, numbers: ";for(int n : numbers) {std::cout << n << " ";}std::cout << std::endl;// 从堆中移除根元素std::pop_heap(numbers.begin(), numbers.end()); // 将最大元素移至末尾numbers.pop_back(); // 实际移除元素std::cout << "After pop_heap, numbers: ";for(int n : numbers) {std::cout << n << " ";}std::cout << std::endl;// 对堆进行排序std::sort_heap(numbers.begin(), numbers.end());std::cout << "After sort_heap, numbers: ";for(int n : numbers) {std::cout << n << " ";}std::cout << std::endl;// 使用std::is_heap_until找到不是堆的第一个位置auto heapEnd = std::is_heap_until(numbers.begin(), numbers.end());std::cout << "The range is a heap until element: ";std::cout << (heapEnd - numbers.begin()) << std::endl;return 0;
}
输出:
After make_heap, numbers: 9 8 7 6 2 3 4 5 1
Is the vector a heap? true
After push_heap, numbers: 10 9 7 6 8 3 4 5 1 2
After pop_heap, numbers: 9 8 7 6 2 3 4 5 1
After sort_heap, numbers: 1 2 3 4 5 6 7 8 9
The range is a heap until element: 1
6、最小/最大操作
std::minmax
:同时返回给定值中的最小值和最大值。std::minmax_element
:返回给定范围中的最小元素和最大元素的迭代器。
代码示例
#include <iostream>
#include <algorithm>
#include <vector>int main() {// 使用std::minmax对一组值进行操作auto result = std::minmax({1, 3, 5, 7, 9, 2, 4, 6, 8, 0});std::cout << "The min value is: " << result.first << std::endl;std::cout << "The max value is: " << result.second << std::endl;// 使用std::minmax_element对容器中的元素进行操作std::vector<int> numbers = {1, 3, 5, 7, 9, 2, 4, 6, 8, 0};auto minmaxPair = std::minmax_element(numbers.begin(), numbers.end());if (minmaxPair.first != numbers.end() && minmaxPair.second != numbers.end()) {std::cout << "The smallest element in the vector is: " << *minmaxPair.first << std::endl;std::cout << "The largest element in the vector is: " << *minmaxPair.second << std::endl;}return 0;
}
输出将显示:
The min value is: 0
The max value is: 9
The smallest element in the vector is: 0
The largest element in the vector is: 9
总结
这些新增的算法增强了 C++ 的标准库,为开发者提供了更多的工具来编写高效和简洁的代码。
通过利用这些算法,可以减少手写的代码量,同时也可以保证代码的性能和可读性。
相关文章:
C++11 新特性:新增算法
C11 在标准库中引入了一系列新的算法,这些新增的算法使我们的代码写起来更简洁方便。 下面是 C11 中新增加的一些重要算法的简要描述和使用方法: 1、非修改序列操作 std::all_of:检查范围内的所有元素是否都满足指定的谓词。std::any_of&a…...
c/c++普通for循环学习
学习一下 for 循环的几种不同方式,了解一下原理及差异 完整的测试代码参考 GitHub :for 循环测试代码 1 常用形态 对于 for 循环来说,最常用的形态如下 for (表达式1; 表达式2; 表达式3) {// code }流程图如下: 编写测试代码…...
操作系统组成部分
从1946年诞生第一台电子计算机。 冯诺依曼结构 冯诺依曼是:数字计算机的数制采用二进制;计算机应该按照程序顺序执行。 常见的操作系统有三种类型 单用户单任务操作系统:只支持一个用户和一个任务的执行,如DOS;单用…...
深入理解DES算法:原理、实现与应用
title: 深入理解DES算法:原理、实现与应用 date: 2024/4/14 21:30:21 updated: 2024/4/14 21:30:21 tags: DES加密对称加密分组密码密钥管理S盒P盒安全性分析替代算法 DES算法简介 历史 DES(Data Encryption Standard)算法是由IBM研发&…...
# 达梦sql查询 Sql 优化
达梦sql查询 Sql 优化 文章目录 达梦sql查询 Sql 优化注意点测试数据单表查询 Sort 语句优化优化过程 多表关联SORT 优化函数索引的使用 注意点 关于优化过程中工具的选用,推荐使用自带的DM Manage,其它工具在查看执行计划等时候不明确在执行计划中命中…...
Linux下SPI驱动:SPI设备驱动简介
一. 简介 Linux下的SPI 驱动框架和 I2C 很类似,都分为主机控制器驱动和设备驱动,主机控制器也就是 SOC的 SPI 控制器接口,SPI设备驱动也就是所操作的SPI设备的驱动。 本文来学习一下Linux下SPI设备驱动。 二. Linux下SPI驱动:SP…...
【简明图文教程】Node.js的下载、安装、环境配置及测试
文章目录 前言下载Node.js安装Node.js配置Node.js配置环境变量测试后言 前言 本教程适用于小白第一次从零开始进行Node.js的下载、安装、环境配置及测试。 如果你之前已经安装过了Node.js或删除掉了Node.js想重新安装,需要先参考以下博客进行处理后,再根…...
共模电感饱和与哪些参数有关?这些参数是如何影响共模电感的?
在做一个变频器项目,遇到一个问题,在30Hz重载超过一定1小时,CE测试结果超出限制,查找原因最终发现EMI filter内的共模电感加热,fail现象可以复现。最终增大Y电容把问题解决了。由此问题引申出一个问题,到底…...
儿童护眼台灯怎么选?五款必选的高口碑护眼台灯推荐
儿童台灯,想必大家都不会陌生了,是一种学生频繁使用的小灯具,一般指放在桌面用的有底座的电灯。随着近年来儿童青少年的视力急速下滑,很多家长都会选择给孩子选择一款合适的护眼台灯,以便孩子夜晚学习能有个好的照明环…...
前端小技巧之轮播图
文章目录 功能htmlcssjavaScript图片 设置了一点小难度,不理解的话,是不能套用的哦!!! (下方的圆圈与图片数量不统一,而且宽度是固定的) 下次写一些直接套用的,不整这些麻…...
手动实现简易版RPC(上)
手动实现简易版RPC(上) 前言 什么是RPC?它的原理是什么?它有什么特点?如果让你实现一个RPC框架,你会如何是实现?带着这些问题,开始今天的学习。 本文主要介绍RPC概述以及一些关于RPC的知识,为…...
大语言模型总结整理(不定期更新)
《【快捷部署】016_Ollama(CPU only版)》 介绍了如何一键快捷部署Ollama,今天就来看一下受欢迎的模型。 模型简介gemmaGemma是由谷歌及其DeepMind团队开发的一个新的开放模型。参数:2B(1.6GB)、7Bÿ…...
关于npm和yarn的使用(自己的问题记录)
目录 一 npm 和 yarn 的区别 二 npm 和 yarn 常用命令对比 1. 初始化项目 2. 安装所有依赖包 3. 安装某个依赖包 4.安装某个版本的依赖包 5. 更新依赖包 5. 移除依赖包 三 package.json中 devDependencies 和 dependencies 的区别。 四 npm安装包时,…...
Web端Excel的导入导出Demo
📚目录 📚简介:✨代码的构建:💭Web端接口Excel操作🚀下载接口🚀导入读取数据接口 🏡本地Excel文件操作⚡导出数据🌈导入读取数据 📚简介: 使用阿里巴巴开源组件Easy Exce…...
Java日期正则表达式(附Demo)
目录 前言1. 基本知识2. Demo 前言 对于正则匹配,在项目实战中运用比较广泛 原先写过一版Python相关的:ip和端口号的正则表达式 1. 基本知识 对于日期的正则相对比较简单 以下是一些常见的日期格式及其对应的正则表达式示例: 年-月-日&a…...
基于LabVIEW的CAN通信系统开发案例
基于LabVIEW的CAN通信系统开发案例 介绍了基于LabVIEW开发的CAN通信系统,该系统主要用于汽车行业的数据监控与分析。通过对CAN通信协议的有效应用,实现了车辆控制系统的高效信息交换与实时数据处理,从而提升了车辆性能的检测与优化能力。 项…...
SAP SD学习笔记07 - 紧急发注(急单),现金贩卖,贩卖传票Type/ 明细Category 及其Customize
上面讲SAP中主干流程的时候,还有后面讲一括处理的时候,都用的是 OR 标准受注。 SAP SD学习笔记01 - 简单走一遍SD的流程:受注,出荷,请求_怎么学好sd模块-CSDN博客 下面开始讲一些稀奇古怪的非标准流程。 当然&#x…...
(六)C++自制植物大战僵尸游戏关卡数据讲解
植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/xjvbb 游戏关卡数据文件定义了游戏中每一个关卡的数据,包括游戏类型、关卡通关奖励的金币数量、僵尸出现的波数、每一波出现僵尸数量、每一波僵尸出现的类型等。根据不同的游戏类型,定义了不同的通…...
Java基于微信小程序的校园外卖平台设计与实现,附源码
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
渗透工具及其知识库(个人笔记)
1.IP搜寻 查看kali网段: ip addr 、 ifconfig namp:nmap -sP xxx.xxx.xxx.0/24 netdiscover:netdiscover xxx.xxx.xxx.0/24 arp:arp-scan -l 2.端口扫描 粗略扫描:nmap <IP> 深度扫描: …...
MongoDB的使用
一、Spring Boot集成MongoDB 1 引用依赖包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency> 2 配置文件配置mongodb资料 # MongoDB连接信息 spring.…...
labview中FP.isFrontmost不生效?
主GUI界面中调用子GUI程序FP.isFrontmost不生效? 如果主GUI程序使用“floating”,子GUI程序使用default动作,则子GUI无法打开到最前。子GUI程序只能使用“模态”才能置顶。 主GUI程序: 子GUI程序: 改正的方法很简单,…...
Vela-OS: 记录一个class层,处理MSC协议的bug
一、关于USC-MSC类设备驱动层,处理SCSI指令的代码逻辑问题 1. 源文件 \nuttx\drivers\usbdev\usbmsc_scsi.c 2. 问题描述 对于INQUIRY指令,长度一般是6个字节,cdblen字段嵌入在CBW数据包中,如下: 命令阶段的CBW数据包: 55 53 42 43 60 2a c0 8b 24 00 00 00 0x80 0x…...
跨框架探索:React Redux 和 Vuex 对比分析快速掌握React Redux
React Redux 和 Vuex 都是前端状态管理库,分别用于 React 和 Vue.js 框架。 它们都提供了一套规范的状态管理机制,帮助开发者更好地组织和管理应用状态。下面是它们的一些异同点: 相同点: 中心化状态管理:两者都提…...
第十五届蓝桥杯省赛C/C++大学B组真题及赛后总结
目录 个人总结 C/C 组真题 握手问题 小球反弹 好数 R 格式 宝石组合 数字接龙 爬山 拔河 编辑 再总结及后续规划 个人总结 第一次参加蓝桥杯,大二,以前都在在学技术,没有系统的学过算法。所以,还是花了挺多时间去备…...
【Qt踩坑】ARM 编译Qt5.14.2源码-QtWebEngine
1.下载源码 下载网站:Index of /new_archive/qt/5.14/5.14.2/single 2.QWebEngine相关依赖 sudo apt-get install flex libicu-dev libxslt-dev sudo apt-get install libssl-dev libxcursor-dev libxcomposite-dev libxdamage-dev libxrandr-dev sudo apt-get …...
SQL语法 case when语句用法讲解
CASE WHEN解释 : SQL中的CASE WHEN语句是一种条件表达式,它允许你根据不同的情况返回不同的值。CASE WHEN通常用于SELECT语句中,用于创建新的列,该列的值取决于其他列的值。CASE WHEN可以用于任何可以使用表达式的地方。 大致概…...
Project Euler_Problem 193_Few Repeated Digits_欧拉筛+容斥公式
解题思路:暴力搜索 代码: void solve() {ll i, j,k,x,y,z,p,q,u,v,l,l1;N 999966663333, NN 1024;//N 1000;double a, b, c,d;M.NT.get_prime_Euler(1000000);l M.NT.pcnt;for (i 1; i < l; i) {u M.NT.prime[i];v M.NT.prime[i 1];x u * …...
排序算法-基数排序
基数排序是一种非比较排序算法,它将待排序的数字按照位数进行排序。基数排序的思想是先按照个位数进行排序,然后按照十位数进行排序,接着按照百位数进行排序,以此类推,直到最高位排序完成。 基数排序的步骤如下&#x…...
ChatGPT在线网页版
ChatGPT镜像 今天在知乎看到一个问题:“平民不参与内测的话没有账号还有机会使用ChatGPT吗?” 从去年GPT大火到现在,关于GPT的消息铺天盖地,真要有心想要去用,途径很多,别的不说,国内GPT的镜像…...
广州建网站兴田德润信任/百家号关键词排名
盒子模型(CPBM模型)|---- content 盒模型宽度和高度和我们平常所说的物体的宽度和高度理解是不一样的,css内定义的宽(width)和高(height),指的是填充以里的内容范围。 …...
幼儿园网站建设方案结语/千锋教育学费多少
一、背景最近发现原来的原型预览访问速度超级慢,这一切貌似是最近调整了下Axure原型中的几个元件,上传之后,原本访问超级快的文件,变的超级超级慢。 二、原因分析过程 1、首先直接从服务器角度找原因。自认为服务器可能是宽带不够…...
深圳哪些公司做网站/潍坊今日头条新闻最新
表达式中的transition参数的参数值有24中,以代号0-23来表示,分别代表24中显示类型,具体的参数值列表如下所示: 同时还可以参考一下以下的页面转换特效:网页变换效果(Trans)共分四大类࿱…...
织梦调用网站备案号/明星百度指数在线查询
1.常用且容易忘记的快捷键 iter 生成增强forxun 1.1.循环相关的快捷键 itar 生成array for代码块 itco 生成Collection迭代 iten 生成enumeration遍历 iter 生成增强forxun itit 生成iterator 迭代 itli 生成List的遍历 ittok 生成String token遍历 itve 生成Vector数组迭代 …...
鄱阳有做百度网站的/网络网站推广优化
人往高处走,水往低处流。转眼三月,草长莺飞,又到了“金三银四”跳槽的好时节。 大部分人跳槽的原因是有了更好的工作机会、想换个新环境或是诱人的薪资待遇,而且跳槽会传染,会直接影响着身边纠结要不要跳槽的人&#…...
给自己的网站做软件测试 步骤/优化服务内容
正题第四题:[SDOI2009]Elaxia的路线这道题好像很麻烦。。。首先我们可以知道,如果边(x,y,c)为x1到y1最短路路径上的一条边,那么它肯定满足d[x1][x]d[y][y1]cd[x][y] || d[x1][y]d[x][y1]cd[x][y]那么知道了这个东西,我…...