欢迎回到 C++ - 现代 C++(心得-壹)
原文链接欢迎回到 C++ - 现代 C++ | Microsoft Learn
这里先是讲了现代c++的优势,其相对于其他编程语言有快速、高效。 相对于其他语言,该语言更加灵活,跨平台(硬件平台)性也很强,可以直接访问硬件,虽然现在编程千千万但是访问硬件的语言这点可以干掉几乎90%的编程语言,其应用广泛。但是现在很多硬件的编程还是使用c语言,最近也有慢慢被c++替代的趋势。现代 C++ 代码更加简单、安全、美观,而且速度仍像以往一样快速。
接下来从几个方面来大体概括了一下现代C++的优势。
资源和智能指针
原始的c语言容易出现的内存泄露问题这里可以通过RAII(Resource Acquisition Is Initialization)的原则进行规避,这个规则要求资源(堆内存、文件句柄、套接字等)应由对象“拥有”。 该对象在其构造函数中创建或接收新分配的资源,并在其析构函数中将此资源删除。 RAII 原则可确保当所属对象超出范围时,所有资源都能正确返回到操作系统。
为了让我们更方便的遵循这个原则编程,c++标准库提供了三种智能指针类型:std::unique_ptr、std::shared_ptr 和 std::weak_ptr。
智能指针可以自己管理对象的资源,当对象被释放的时候对应的资源也会被释放,这些智能指针都是通过模板<Template>来实现的。我们只需要把我们需要的对象通过std::unique_ptr<int[]> data;
unique_ptr来指向对象,实例化的时候通过make_unique来实现,data = std::make_unique<int[]>(size)
这样实例化的对象我们就直接遵循了RAII原则。对象的管理交给智能指针,这个只能指针也是一个模板类,其内部的实现就是管理对象的生存周期以及资管的管理。比如unique_ptr 存储指向拥有的对象或数组的指针。 此对象/数组仅由 unique_ptr 拥有。 unique_ptr 被销毁后,此对象/数组也将被销毁。shared_ptr 类描述使用引用计数来管理资源的对象。 shared_ptr 对象有效保留一个指向其拥有的资源的指针或保留一个 null 指针。 资源可由多个 shared_ptr 对象拥有;当拥有特定资源的最后一个 shared_ptr 对象被销毁后,资源将释放。
std::string 和 std::string_view
这两个类为了消除字符串编程的过程中遇到的一些问题,在编程的过程中难免会引用字符串。
C语言中对于字符串的使用容易出现bug,尤其各种字符格式转换的过程,c++直接实现了自己的库
std::string 和 std::wstring,几乎可以消除与 C 样式字符串关联的所有错误。并且同时提供搜索、追加和在前面追加等操作。在 C++17 中,可以使用 std::string_view,以便提高性能。
这里可以理解到c++通过自己实现的标准库,帮我们造了一个轮子。c++把之前c语言编程中遇到的一些问题做成了标准库,避免那些问题的实现,我们通过新类直接引用即可。
std::vector 和其他标准库容器
从里面来看这是一个向量,向量在编程中也属于一种容器,其他还有map等,用来管理我们的一些数据类型,比如字符串或者整形浮点型等。容器就是装东西的,在编程语言中是用来装数据的,不同的数据类型都可以装到容器中,包括自己定义的类,我们自己定义的类也可以理解为一种数据类型,在程序的世界中一起资源皆是数据类型,都是数字最终都对应010101,针对这些容器c++都实现了自己的标准库,java等其他语言也对这些容器做了标准库,这些库在使用的过程中很多优势,尤其是其丰富的功能以及久经考验的算法。比如查找排序等,避免自己再次造轮子,除非你的算法由于当前的api,如果那样的话c++肯定会收录你的。
标准库算法
这里讲到了C++里面的一些标准库算法,包含我们常见的如搜索、排序、筛选和随机化等,这些分类在不断增长。 数学库的内容很广泛。 在 C++17 及更高版本中,提供了许多算法的并行版本。
以下是一些重要示例:
-
for_each,默认遍历算法(以及基于范围的for循环)。 -
transform,用于对容器元素进行非就地修改 -
find_if,默认搜索算法。 -
sort、lower_bound和其他默认的排序和搜索算法。
auto comp = [](const widget& w1, const widget& w2)
{ return w1.weight() < w2.weight(); }
sort( v.begin(), v.end(), comp );
auto i = lower_bound( v.begin(), v.end(), widget{0}, comp );
这个代码段里面用到了lambda表达式,一个简单的引用示例。
用 auto 替代显式类型名称
auto是一个非常智能的类型指定关键字,它可以自己推导出数据类型,避免我们定义的时候出现错误。可以代指任意类型,现在很多语言在定义的数据的时候都支持了任意类型,比如kotlin中使用var代指定义数据类型,不用指定具体的类型,可以在运行的时候进行决定。python直接连var这种指定都省略了。
基于范围的 for 循环
在java早就使用了这种编程方式,很多现代语言也采用了这种方式,传统的方式写起来真的很麻烦,限制很大如下:
std::vector<int> v {1,2,3};
// C-style
for(int i = 0; i < v.size(); ++i)
{
std::cout << v[i];
}
但是现代语言的写法直接如下:
// Modern C++:
for(auto& num : v)
{
std::cout << num;
}
直接给出需要遍历的对象,甚至类型都不必指定直接auto,然后我们可以轻易遍历引用其中的数据,省去很多无用的代码。
用 constexpr 表达式替代宏
constexpr也是现代c++的产物,原始定义编译时的常量采用#define宏定义的方式,但是这种方式容易出错而且无法调试,所以出现了constexpr,在预编译的时候就进行处理。
在现代 C++ 中,应优先使用 constexpr 变量定义编译时常量
其平替效果如下:
#define SIZE 10 // C-style
constexpr int size = 10; // modern C++
与 const 一样,它可以应用于变量:如果任何代码试图 modify(修改)该值,将引发编译器错误。 与 const 不同,constexpr 也可以应用于函数和类 constructor(构造函数)。 constexpr 指示值或返回值是 constant(常数),如果可能,将在编译时进行计算。
统一初始化
现代C++支持任意类型的括号初始化,当我们需要初始化数组矢量等容器时其优势明显,编译器可以自己推断每个元素的类型,比如下面的示例:
#include <vector>
struct S
{
std::string name;
float num;
S(std::string s, float f) : name(s), num(f) {}
};
int main()
{
// C-style initialization
std::vector<S> v;
S s1("Norah", 2.7);
S s2("Frank", 3.5);
S s3("Jeri", 85.9);
v.push_back(s1);
v.push_back(s2);
v.push_back(s3);
// Modern C++:
std::vector<S> v2 {s1, s2, s3};
// or...
std::vector<S> v3{ {"Norah", 2.7}, {"Frank", 3.5}, {"Jeri", 85.9} };
}
这个示例中,我们的类(C++中结构体和类class等效)S有一个自己的构造,
在v3实例中我们的vector通过<>指定了S类型,所以编译器可以自己推导类型实例,所以我们可以根据S的构造运用{}直接传参构成实例,这时候编译器自己帮我们推导出S类型的实例push到vector实例v3中。省去了v2的meige
相关文章:
欢迎回到 C++ - 现代 C++(心得-壹)
原文链接欢迎回到 C - 现代 C | Microsoft Learn 这里先是讲了现代c的优势,其相对于其他编程语言有快速、高效。 相对于其他语言,该语言更加灵活,跨平台(硬件平台)性也很强,可以直接访问硬件,虽…...
【Vue3+Ts项目】硅谷甄选 — 搭建后台管理系统模板
一、 项目初始化 一个项目要有统一的规范,需要使用eslintstylelintprettier来对我们的代码质量做检测和修复,需要使用husky来做commit拦截,需要使用commitlint来统一提交规范(即统一提交信息),需要使用pre…...
MATLAB 系统辨识 - 在线估计 - Online Estimation
系列文章目录 MATLAB 模型参考自适应控制 - Model Reference Adaptive Control MATLAB 自抗扰控制 - Active Disturbance Rejection Control 文章目录 系列文章目录前言一、在线参数估计二、使用步骤 前言 在线估计(Online estimation)算法是在物理系…...
【Java面试——基础题】
Java基础部分,包括语法基础,泛型,注解,异常,反射和其它(如SPI机制等)。 1.1 语法基础 面向对象特性? 封装 利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成…...
Haiku库和Jax库介绍
Haiku 是由DeepMind开发的一个深度学习库,它建立在JAX(Just Another XLA,为Accelerated Linear Algebra的缩写)之上。JAX 是一个由Google开发的数值计算库,专注于高性能数值计算和自动微分。 JAX 提供了强大的数值计算…...
2023-简单点-proxyPool源码(二)-setting.py
proxyPool setting.py setting.py # -*- coding: utf-8 -*- """ -------------------------------------------------File Name: setting.pyDescription : 配置文件Author : JHaodate: 2019/2/15 ---------------…...
中级工程师评审条件:如何成为一名合格的中级工程师
作为一名工程师,不仅需要具备扎实的技术基础和实践能力,还需要通过评审来证明自己的能力水平。在成为一名合格的中级工程师之前,你需要满足一系列评审条件。甘建二今天将详细介绍中级工程师评审的要求和标准,帮助你成为更优秀的工…...
StarRocks上新,“One Data、All Analytics”还有多远?
K.K在《未来十二大趋势》中认为,我们正处于一个数据流动的时代。商业乃数据之商业。归根结底,你在处理的都是数据。 的确,当数据成为新的核心生产要素之际,数据分析就犹如最重要的生产工具之一,决定着企业在数字化时代…...
Java8实战-总结50
Java8实战-总结50 CompletableFuture:组合式异步编程对多个异步任务进行流水线操作对 Future 和 CompletableFuture 的回顾 响应 CompletableFuture 的 completion 事件对最佳价格查询器应用的优化 CompletableFuture:组合式异步编程 对多个异步任务进行…...
kicad源代码研究:参照Candence实现工程管理
创建工程: 创建工程和打开工程触发事件: KICAD_MANAGER_ACTIONS::newProjectKICAD_MANAGER_ACTIONS::openProjectnewProject和OpenProject事件响应具体实现,在KICAD_MANAGER_CONTROL类中实现: Go( &KICAD_MANAGER_CONTROL::…...
Asp.net core WebApi 配置自定义swaggerUI和中文注释,Jwt Bearer配置
1.创建asp.net core webApi项目 默认会引入swagger的Nuget包 <PackageReference Include"Swashbuckle.AspNetCore" Version"6.2.3" />2.配置基本信息和中文注释(默认是没有中文注释的) 2.1创建一个新的controller using Micr…...
DNS 查询结果逐行解释
文章目录 FlagsADDITIONALANSWER SECTIONQuery timeSERVERWHENDNS PortAuthoritative answer权威DNS服务器Non-authoritative answer推荐阅读 DNS查询后,查询结果一般如下: mirrorUbuntu22:~$ dig www.baidu.com; <<>> DiG 9.18.12-0ubuntu0…...
ArcGIS制作广场游客聚集状态及密度图
文章目录 一、加载实验数据二、平均最近邻法介绍1. 平均最近邻工具2. 广场游客聚集状态3. 结果分析三、游客密度制图一、加载实验数据 二、平均最近邻法介绍 1. 平均最近邻工具 “平均最近邻”工具将返回五个值:“平均观测距离”、“预期平均距离”、“最近邻指数”、z 得分和…...
同旺科技 USB TO SPI / I2C --- 调试W5500_TCP Client接收数据
所需设备: 内附链接 1、USB转SPI_I2C适配器(专业版); 首先,连接W5500模块与同旺科技USB TO SPI / I2C适配器,如下图: 发送数据6个字节的数据:0x11,0x22,0x33,0x44,0x55,0x66 在专业版调试软件中编辑指令,…...
MQ - KAFKA 高级篇
kafak是一个分布式流处理平台,提供消息持久化,基于发布-订阅的方式的消息中间件,同时通过消费端配置相同的groupId支持点对点通信。 ##适用场景: 构造实时流数据管道,用于系统或应用之间可靠的消息传输.数据采集及处理,例如连接到一个数据库系统,捕捉表…...
如何快速查找最后(最右侧)隐藏列
实例需求:定位工作表中的最后(最右侧)隐藏列,处理其中的数据。 通常思路是从工作表最后列开始,倒序检查每个列,直到找到隐藏列或者检查完毕(无隐藏列)。 Sub LastColumn()Dim visR…...
精密制造ERP系统包含哪些模块?精密制造ERP软件是做什么的
不同种类的精密制造成品有区别化的制造工序、工艺流转、品质标准、生产成本、营销策略等,而多工厂、多仓库、多车间、多部门协同问题却是不少精密制造企业遇到的管理难题。 有些产品结构较为复杂,制造工序繁多,关联业务多,传统的…...
TypeScript 的高级技巧
1 — 高级类型(Advanced Types) 使用 TypeScript 的高级类型,如映射类型和条件类型,可以基于现有类型构建新类型。通过使用这些类型,您可以在强类型系统中更改和操作类型,从而使您的代码具有更大的灵活性和…...
TiDB 7.x 源码编译之 TiDB Server 篇,及新特性详解
本文将介绍如何编译 TiDB Server 源码。以及阐释 TiDB Server 7.x 的部分新特性。 TiDB v7.5.0 LTS 计划于 2023 年 11 月正式 Release,目前代码虽未冻结,但已经可以看到 Alpha 版本的 Code 了,本文代码将以 v7.5.0-alpha 为基准。 TiDB Se…...
Hadoop实验putty文件
🔥博客主页: A_SHOWY🎥系列专栏:力扣刷题总结录 数据结构 云计算 数字图像处理 很多朋友反馈做hadoop实验中的putty找不到Connection-SSH-Auth路径下找不到Private key for authentication私有密钥,无法将转…...
STM32语音识别智能家居仿真:Proteus虚拟串口实战指南(附完整指令表)
STM32语音识别智能家居仿真:Proteus虚拟串口实战指南(附完整指令表) 你是否曾对智能家居背后的技术感到好奇,想亲手搭建一个能听懂指令的“小管家”,却又被昂贵的硬件成本和复杂的电路焊接劝退?或者&#x…...
PyCharm闪退终极指南:从虚拟内存到多进程调优的完整解决方案
PyCharm闪退终极指南:从虚拟内存到多进程调优的完整解决方案 你是否也曾在深夜与代码鏖战时,被PyCharm突如其来的闪退打断思路?屏幕上瞬间消失的IDE窗口,伴随着系统卡顿甚至风扇狂啸,那种无力感足以让任何开发者抓狂。…...
VsCode高效编码:一键生成文件头部与函数注释的终极指南
1. 为什么你需要一个“注释生成器”? 我猜很多朋友刚开始写代码的时候,都和我一样,觉得注释这东西,可有可无。心里想着:“代码逻辑这么清晰,我自己看得懂不就行了?” 直到后来,我加入…...
雷电模拟器4抓包全攻略:从Charles配置到HTTPS解密(附证书避坑指南)
移动端应用深度调试:构建本地HTTPS流量分析环境实战指南 在移动应用开发与安全测试的日常工作中,能否清晰地洞察应用与服务器之间的每一次“对话”,往往决定了问题排查的效率与深度。无论是为了优化一个API的响应速度,还是逆向分析…...
快速绘制数据集终极指南:创意编程与Processing、p5.js集成教程
快速绘制数据集终极指南:创意编程与Processing、p5.js集成教程 【免费下载链接】quickdraw-dataset Documentation on how to access and use the Quick, Draw! Dataset. 项目地址: https://gitcode.com/gh_mirrors/qu/quickdraw-dataset Quick, Draw! Datas…...
容器镜像签名验证:多方信任与策略管理的终极指南
容器镜像签名验证:多方信任与策略管理的终极指南 【免费下载链接】skopeo Work with remote images registries - retrieving information, images, signing content 项目地址: https://gitcode.com/GitHub_Trending/sk/skopeo 在容器化应用的生命周期中&…...
IPED敏感信息脱敏工具:自动替换报告中的敏感数据
IPED敏感信息脱敏工具:自动替换报告中的敏感数据 【免费下载链接】IPED IPED Digital Forensic Tool. It is an open source software that can be used to process and analyze digital evidence, often seized at crime scenes by law enforcement or in a corpor…...
游戏玩家必备:用innoextract提取GOG.com安装包的完整教程
游戏玩家必备:用innoextract提取GOG.com安装包的完整教程 【免费下载链接】innoextract A tool to unpack installers created by Inno Setup 项目地址: https://gitcode.com/gh_mirrors/in/innoextract innoextract是一款强大的开源工具,专门用于…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
