欢迎回到 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私有密钥,无法将转…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...

Linux-进程间的通信
1、IPC: Inter Process Communication(进程间通信): 由于每个进程在操作系统中有独立的地址空间,它们不能像线程那样直接访问彼此的内存,所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...