C++新特性37篇
文章平均质量分 82
本系列介绍C++的新特性,总计37篇,需要有一定的基础,大家加油哦!
十月旧城
winter is coming
展开
-
C++新特性37_条件变量的C++封装(_Cnd_wait的使用;条件变量在C++中的封装类及使用;其代码使用与上篇基本一致;后期如果使用就采用此处封装的方法)
接上篇:C++新特性36_条件变量的使用,前面介绍了条件变量的引入和使用,本篇介绍C++中是如何封装的及如何使用?1.条件变量在C++中的封装及使用condition_variable 是c++11对条件变量的封装,配合std::unique_lockstd::mutex进行wait操作。condition_variable_any,搭配任意带有lock、unlock语义的mutex使用,效率比condition_variable 低。使用封装的代码:#include <iostream原创 2022-03-10 16:11:47 · 957 阅读 · 0 评论 -
C++新特性36_条件变量的使用(介绍C++11中条件变量的用法;条件变量必须搭配互斥体和条件使用;条件、条件变量、互斥体三胞胎需要同时使用)
接上篇:C++新特性35_条件变量的引入(传统采用while(1)的轮询方式解决线程按顺序执行和共享变量问题十分低效,使用条件变量可以实现高效的事件模型(类似于Qt中信号槽机制))引入了条件变量,用于线程间数据交互或者线程间存在先后顺序的情况,本篇将介绍如何使用条件变量。条件变量在C1. 条件变量的用法下为利用C++11中条件变量的代码:#include <iostream>#include <string>#include <mutex>#include &原创 2022-03-10 15:40:57 · 1458 阅读 · 2 评论 -
C++新特性35_条件变量的引入(实现线程间数据传递、线程执行顺序;传统采用while(1)轮询方式解决线程按顺序执行和共享变量问题低效,用条件变量可以实现高效的事件模型(类似Qt信号槽和事件机制))
前几篇介绍了使用mutex互斥体实现线程同步,另外一个重要的事情就是线程之间实现通信。线程之间通信包含以下两种情形:线程之间可以通信 即线程A B间的数据可以相互传递 。A 与B线程之间是有先后的执行顺序的,一种情况是A线程在完成某个操作之后再运行B线程。上述两种情况,使用互斥体mutex就可能显得不是很合适了,因为mutex的目的是为了以一种更加安全的方式去访问共享的变量,但无法做到线程间的数据通信或者实现线程之间逻辑的关系。因此引入新的控制同步的条件变量C++11中是直接将Linux的机制封原创 2022-03-09 13:57:09 · 520 阅读 · 0 评论 -
C++新特性34_递归互斥量recursive_mutex与超时互斥量timed_mutex的使用(递归互斥量解决同一线程重复使用互斥量的需求;超时互斥量设置等待超时机制;解决互斥量阻塞问题)
接上篇C++新特性33_死锁产生的原因及避免(线程在等待一个永远都不能成功的条件成立,从而进入到陷入休眠,永远不能被唤醒的状态、通过调整锁的使用顺序解决死锁问题),本篇将会学习互斥体的相关知识。1. 互斥量在C++11中除了提供mutex之外还会提供其他三种加强版的mutex,C++11 中提供以下4种语义的互斥量(mutex):std::mutex: 独占的互斥量,不能递归使用std::recursive_mutex: 递归互斥量,不带超时功能std::timed_mutex: 带超时的独占互原创 2022-03-08 14:24:24 · 1269 阅读 · 0 评论 -
C++新特性33_死锁产生的原因及避免(线程在等待一个永远都不能成功的条件成立,从而进入到陷入休眠,永远不能被唤醒的状态;通过调整锁的使用顺序解决死锁问题)
上篇:C++新特性32_C++中mutex与lock_guard的使用(采用上篇类似方法封装至C++的标准库中)讲了在C++标准库中实现线程锁的方法,本篇主要介绍在使用多线程的过程中常遇到的死锁问题。1. 死锁及产生原因线程(程序)在等待一个永远都不能成功的条件成立,从而进入到陷入休眠,永远不能被唤醒的状态。举例1:两个线程互相等待原理:线程A获取锁1,只有锁2被线程B释放才可以获取锁2,线程B获取锁2,只有锁1被线程A释放才可以获取锁1,双方不断的在等待对方释放锁,但一直等不到对方释放。线程A:原创 2022-03-07 23:57:51 · 696 阅读 · 0 评论 -
C++新特性32_C++中mutex与lock_guard的使用(采用上篇类似方法封装至C++的标准库中,C++从语法上实现了跨平台)
接上篇C++新特性31_利用C++自己封装线程同步锁(利用类的构造析构实现加锁解锁的自动化、利用引用实现在一个类中对另一个类的唯一对象的调用方法、利用对象及局部变量的作用域减小颗粒度),C++11中STL采用和上篇一样的方式对上锁和解锁进行了封装,本篇看C++11中STL提供了怎样的锁机制?1. C++提供的std::mutex上锁机制类似于上篇我们自己利用C++将临界区方法进行封装,在C++标准库中也对相关的Windows API进行了封装即std::mutex。#include <tchar原创 2022-03-04 21:28:46 · 677 阅读 · 0 评论 -
C++新特性31_利用C++自己封装线程同步锁(利用类的构造析构实现加锁解锁的自动化、利用引用实现在一个类中对另一个类的唯一对象的调用方法、利用对象及局部变量作用域减小颗粒度、其他类对象成员函数调用)
上两篇C++新特性29_线程同步问题的解决思路(原子操作、WindowsAPI实现原子操作、针对特定操作的WindowsAPI、如何解决同步的一般问题、 实际场景介绍解决同步问题的思路、)及C++新特性30_windows api解决线程同步(临界区、手动加EnterCriticalSection(&),LeaveCriticalSection(&)、临界区大小即颗粒度、如何自动加锁)中介绍了Windows API解决同步问题的两种方法,一种是针对特定操作的API,另一种是使用临界区的形式实原创 2022-03-03 15:41:24 · 1098 阅读 · 0 评论 -
C++新特性30_windows api解决线程同步(临界区、手动加EnterCriticalSection(&),LeaveCriticalSection(&)、临界区大小即颗粒度、如何自动加锁)
接上篇:C++新特性29_线程同步问题的解决思路(原子操作、WindowsAPI实现原子操作、实际场景介绍解决同步问题的思路),上篇我们阐述了解决特定操作同步问题的方法,另外对于一般线程同步问题的思路就是加一把锁,那如何找到这把锁呢?一般而言操作系统会提供API,C++11中也提供了线程操作的方法,但是我们还是先要了解Windows系统中对线程的操作,因为C++11中的操作其实就是对Windows API的封装。本篇就介绍在Windows中解决一般普遍线程同步的方法-临界区。1. 临界区临界区是指一个原创 2022-03-03 10:16:53 · 707 阅读 · 0 评论 -
C++新特性29_线程同步问题的解决思路(原子操作、WindowsAPI实现原子操作、针对特定操作的WindowsAPI、如何解决同步的一般问题、 实际场景介绍解决同步问题的思路)
在上篇:C++新特性28_线程同步问题的产生原因 中讲到在多线程编程中经常会碰到并发问题,即多线程同时操作一个资源的时候,有可能会引来一些问题。本篇将会讲线程同步问题的解决思路,首先讲windows中的解决方法,Linux中也是类似的,最终将会介绍C++11中的解决方法。1. 原子操作我们从上篇的结果可知,在主线程和子线程同时对资源进行操作的时候,由于高级语言执行时将其转换为低级的汇编语言,而汇编语言不止一步,因此2个线程分别对资源操作时可能造成混乱。解决的方法之一即原子操作:它是指一个线程在访问资原创 2022-03-02 10:23:16 · 275 阅读 · 0 评论 -
C++新特性28_线程同步问题的产生原因(高级语言转为低级语言执行,时间片交替运行多线程中代码,代码切换过程中出现的问题)
线程同步问题的产生原因(高级语言转为低级语言执行,时间片交替运行多线程中代码,代码切换过程中出现的问题)原创 2021-12-22 22:34:09 · 684 阅读 · 0 评论 -
C++新特性27_线程thread的使用(重点看C++11对线程的封装使用、线程标准库、多线程的核心:回调函数创建新的线程并作为线程的起点、 windows下经典的线程的写法、C++11对线程的封装)
多线程的核心:回调函数:一旦创建一个线程 就会以这个线程的函数作为一个新的起点,这个时候我们程序就会有2个线程 主线程和子线程原创 2021-12-21 17:13:56 · 1187 阅读 · 0 评论 -
C++新特性25,26_强弱指针计数器增减分析及模拟强弱指针(主要还是原理介绍,初级只需要掌握使用即可;囫囵吞枣,具体的需要实际需要时结合视频理解)
接上篇:share_ptr与weak_ptr的源码分析本篇主要介绍强弱指针计数器增减分析并模拟强弱指针。1. 关于强弱指针计数器增减分析 //强指针构造,析构,=赋值,拷贝构造等情况下 计数器的变化 //弱指针构造,析构,=赋值,拷贝构造等情况下 计数器的变化 //弱指针提升为强指针时 计数器的变化 //强指针直接构造(拿原始指针构造)时: //1.初始化_Ty *_Ptr //2.创建_Ref_count对象 //3._Ref_count_base对象构造时,会分别为_Uses=1并且_原创 2021-12-15 20:35:28 · 1046 阅读 · 0 评论 -
C++新特性24_share_ptr与weak_ptr的源码分析(进入源码进行分析,讲的思路清晰但是理解不清楚,以后慢慢研究;“_类名/函数”代表内部的类及方法;)
承接上篇:C++新特性23_weak_ptr的提出及解决循环引用的思路,本篇主要从源码的角度去理解深层次的原理。1. “Ctrl+左键”进入源代码2. 智能指针类源代码shared_ptr 对外提供接口,并无成员变量 表示强指针 : public _Ptr_baseweak_ptr 对外提供接口,并无成员变量 表示弱指针 : public _Ptr_base3. 智能指针指针父类_Ptr_base类源代码_Ptr_base{两个成员变量: eleme原创 2021-12-12 23:16:32 · 751 阅读 · 0 评论 -
C++新特性23_weak_ptr的提出及解决循环引用的思路(本篇对强弱指针使用过程中引用计数的变化进行了介绍;多强弱指针用途进行介绍;与下篇衔接关系)
本篇作为weak_ptr提出的文章,首先看以下代码的运行结果。#include <memory>#include <tchar.h>int _tmain(int argc, _TCHAR* argv[]){ //定义智能指针sptr指向new int(3) std::shared_ptr<int> sptr(new int(3)); //sptr赋给sptr2,两个指针指向int(3) 引用计数变为2 std::shared_ptr<int&g原创 2021-12-10 23:06:46 · 941 阅读 · 0 评论 -
C++新特性22_智能指针循环引用问题原理解析(循环引用问题原理:互相仅仅将引用计数从2减为1,都在等待对方将自己的引用结束掉,使得引用计数为0;解决方法:让其中一个的引用计数,设为1)
1.循环引用导致的问题原理先看一段之前自己写的只能指针的程序:// TestC11.cpp : 定义控制台应用程序的入口点。//#include <iostream>#include <cstring>using namespace std;//智能指针:// 1. 用起来像指针// 2. 会自己对资源进行释放class CStudent{public: CStudent() {} void test() { cout << "C原创 2021-12-05 20:27:52 · 1538 阅读 · 0 评论 -
C++新特性21_shared_ptr与weak_ptr(大量使用,仅看此篇即可;使用方法;注意事项:不能用同一指针去初始化两个shared_ptr;循环引用问题;weak_pt用于解决循环引用问题)
shared_ptr是带引用计数的智能指针。1. shared_ptr构造其初始化多了一种写法:std::make_sharedvoid foo_construct(){ int* p = new int(3);//创建int指针 std::shared_ptr<int> sptr(p); std::shared_ptr<int> sptr2(new int(4)); //更建议的初始化方法 std::shared_ptr<int> sptr3 = sp原创 2021-12-04 22:05:29 · 1451 阅读 · 0 评论 -
C++新特性20_unique_ptr的使用(大部分与auto_ptr相似,由于move()的使用可以用于数组;整体仍不好用)
前面我们讲解了auto_ptr的使用及为什么会被C++11标准抛弃,接下来,我们来学习unique_ptr的使用:unique_ptr提供了以下操作:看起来似乎与auto_ptr相似,但是其实有区别。1. 构造函数虽然这里的构造函数比较多,但是可以发现,实际上是没有类似auto_ptr的那种拷贝构造:void foo_constuct(){ //这样构造是可以的 std::unique_ptr<int> p(new int(3)); //空构造 std::unique_p原创 2021-12-02 21:09:27 · 262 阅读 · 0 评论 -
C++新特性19_auto_ptr的使用及废除原因(已废除;两大缺陷:两个auto_ptr 对象不能拥有同一个内部指针所有权;两个auto_ptr对象发生赋值操作时,右者对象会丧失该所有权;接口函数)
class template: std::auto_ptrtemplate <class X> class auto_ptr;从官网的文档上就可以看出,这个auto_ptr指针不推荐使用(deprecated),原因这里也有说明:auto_ptr指针在c++11标准中就被废除了,可以使用unique_ptr来替代,功能上是相同的,unique_ptr相比较auto_ptr而言,提升了安全性(没有浅拷贝),增加了特性(delete析构)和对数组的支持。这个类模板提供了有限度的垃圾回收机原创 2021-12-01 22:19:23 · 2286 阅读 · 0 评论 -
C++新特性18_智能指针的简易实现及添加模板(结合引用计数和写时拷贝对智能指针进行优化;考虑到智能指针的通用性,使用类模板,并进行测试)
1.智能指针的实现及添加模板我们在前面自己做一个智能指针,让其帮助我们管理资源。但是这并不通用,因此,我们可以为其添加上模板的技术,这样让其更加通用。#include <iostream>#include <vector>#include <algorithm>#include <functional>using namespace std;//智能指针//1.用起来像指针//2.会自己对资源进行释放class CStudent{p原创 2021-11-22 10:03:10 · 480 阅读 · 0 评论 -
C++新特性17_智能指针的原理(智能指针引子;指出什么是智能指针;为使利用类构造析构管理资源释放更像指针,对运算符进行重载,但会因重复析构造成崩溃,提出禁止和拷贝移动方法,均有缺陷;推荐新指针方法)
1. 什么是只能指针?(1)用起来像指针(2) 会自己对资源进行释放2. 手动进行资源的释放形式在没有智能指针之前,我们都是采用手动释放的方法。#include <iostream>#include <vector>#include <algorithm>#include <functional>using namespace std;//智能指针//1.用起来像指针//2.会自己对资源进行释放class CStudent{原创 2021-11-19 10:43:19 · 1901 阅读 · 0 评论 -
C++新特性16_写时拷贝(解决浅拷贝在某一个类对象中的资源进行修改,所有引用该资源的对象全部会被修改的问题;解决办法:在所有改变值的地方,重新分配内存,改变的是拷贝的值,而不影响原有对象中共享资源)
问题:如果共享资源中的值发生了变化,那么其他使用该共享资源的值如何保持不变?下图中将"li si"改为"li si2"后,两个对象指向的内容都同时发生改变。原创 2021-11-18 17:37:19 · 301 阅读 · 0 评论 -
C++新特性15_引用计数(引用计数是为了解决使用浅拷贝可能造成的资源重复释放问题,通过引入引用计数:增加一个变量,记录资源使用的次数,控制资源的释放)
要正确的理解智能指针,首先必须理解引用计数技术。1. 深拷贝、浅拷贝的概念深拷贝优缺点:优点:每一个的对象(哪怕是通过拷贝构造函数实例化的对象)的指针都有指向的内存空间,而不是共享,所以在对象析构的时候就不存在重复释放或内存泄露的问题了。缺点:内存开销大浅拷贝优缺点:优点:通过拷贝构造函数实例化的对象的指针数据变量指向的共享的内存空间,因此内存开销较小。缺点:对象析构的时候就可能会重复释放或造成内存泄露。 鉴于深拷贝和浅拷贝的优缺点,可采用引用计数技术,既减小了内存开销,又避免了堆的重原创 2021-11-18 11:35:54 · 1200 阅读 · 0 评论 -
C++新特性14_智能指针与RAII(传统C++中依靠人工进行资源的分配与释放;C++11提供RAII管理方式实现资源的自动释放;提供模板shared_ptr、unique_ptr、weak_ptr)
1. C++中内存分配过程及问题C++设计过程中,我们会采用new的方式进行资源分配。利用new在堆上分配内存对应大小的内存,定义及运行结果如下:int* p = new int;此处涉及调试堆,fd作为开始结束的标志,"cd cd cd cd"代表开辟的内存,四个字节。p指向的地址分配了内容之后:然而一旦分配就需要手动管理堆得释放。C++中最令人头疼的问题是强迫程序员对申请的资源(文件,内存等)进行管理,一不小心就会出现泄露(忘记对申请的资源进行释放)的问题。//使用了垃圾回收技术,原创 2021-11-18 10:35:25 · 756 阅读 · 0 评论 -
C++新特性13_函数对象包装器function与bind机制(对象包装器:为函数提供一种封装,存放在对象或变量中;bind机制:用于绑定函数参数,参数不想按顺序传递,类似默认参数,但可以打破顺序)
1. 函数对象包装器function为了函数提供了一种容器(封装),存放在对象或者变量中。通俗一些的理解就是把函数当做对象来处理。(1)支持4种函数的封装 //1.普通函数 //2.匿名函数 //3.类成员函数 //4.仿函数(重载了()运算符的函数)普通函数的封装#include <iostream>#include <vector>#include <algorithm>#include <functional>using nam原创 2021-11-17 16:35:33 · 741 阅读 · 0 评论 -
C++新特性12_ Lambda 表达式/匿名函数捕获列表[]及应用(捕获列表可以起到传递外部数据的作用;传递方式:值捕获、引用捕获、隐式捕获;容器for_each遍历中嵌入匿名函数)
捕获列表所谓捕获列表,其实可以理解为参数的一种类型,lambda 表达式内部函数体在默认情况下是不能够使用函数体外部的变量的,这时候捕获列表可以起到传递外部数据的作用。 根据传递的行为,捕获列表也分为以下几种:1. 值捕获与参数传值类似,值捕获的前期是变量可以拷贝,不同之处则在于,被捕获的变量在 lambda 表达式被创建时拷贝,而非调用时才拷贝:#include <iostream>using namespace std;int main() { int t = 10;原创 2021-11-17 11:30:55 · 2930 阅读 · 0 评论 -
C++新特性11_匿名函数中的mutable(当需要匿名函数从外部捕获参数并在函数内部进行修改时,这个时候就可以使用mutable关键字;捕获的参数在匿名函数内部都是有一份独一无二的拷贝值)
mutable使用情形:个人理解当你需要匿名函数从外部捕获参数并进行修改时,这个时候就可以使用mutable关键字。之前我们在类中的常成员函数中的变量是不可以修改的,但是一旦定义为mutable就可以修改。1.未增加mutable不可以修改参数int main() { int t = 10; auto f = [t]() { return ++t; };}2. 增加mutable之后代表t是可以修改的#include <iostream>using namespa原创 2021-11-17 10:12:53 · 1826 阅读 · 0 评论 -
C++新特性10_lambda表达式/匿名函数(Lambda 表达式就是为了用于复用率很低的函数;函数编程:结果取决于内部参数;adder=λn.(λx.(+ x n));利用auto推测返回值类型)
个人总结:Lambda 表达式就是为了用于复用率很低的函数。Lambda 表达式是 C++ 11 中最重要的新特性之一,而 Lambda 表达式,实际上就是提供了一个类似匿名函数的特性,而匿名函数则是在需要一个函数,但是又不想费力去命名一个函数的情况下去使用的(复用率很小的函数)。这样的场景其实有很多很多,所以匿名函数几乎是现代编程语言的标配。1.Lambda 表达式基础(1)Lambda 表达式的基本语法如下:[捕获列表](参数列表) mutable(可选) 异常属性 -> 返回类型 {原创 2021-11-16 16:12:25 · 170 阅读 · 0 评论 -
C++新特性09_强制转换reinterpret_cast(等价于C中的显式强转;增加了代码的可读性;用于进行各种不同类型的转换;编译期处理,执行的是逐字节复制的操作,运行期不进行检查;一般不使用)
reinterpret_cast等价于C中的显式强转1. 显式强转 int n = 1; //显式强转 int* p = (int*)n;2. reinterpret_cast(1)用于进行各种不同类型的转换不同类型指针之间;不同类型引用之间;指针和能容纳指针的整数类型之间的转换(2)编译期处理,执行的是逐字节复制的操作(3)类似于显式强转,后果自负3.学习视频地址:强制转换reinterpret_cast4.学习笔记:强制转换reinterpret_cast笔记#includ原创 2021-11-16 15:23:42 · 2296 阅读 · 2 评论 -
C++新特性08_强制转换dynamic_cast(具有虚函数基类的父转子的时候会存在越界问题,因此必须使用dynamic_cast在运行时检测转换是否安全、其本质是采用RTTI:运行时类型检测技术)
dynamic_cast用于具有虚函数的基类与派生类之间的指针或引用的转换。使用的情况:(1)基类必须具备虚函数原因:dynamic_cast是运行时类型检查,需要运行时类型信息(RTTI),而这个信息是存储与类的虚函数表关系紧密,只有一个类定义了虚函数,才会有虚函数表。(2)运行时检查,转型不成功则返回一个空指针(3)非必要不要使用DYNAMIC_CAST,有额外的函数开销1.父类转子类情况下的越界问题:#include <iostream>#include <stri原创 2021-11-16 14:50:28 · 3032 阅读 · 0 评论 -
C++新特性07_强制转换static_cast(隐式转换:基本等价于隐式转换的一种类型转换运算符,可使用于需要明确隐式转换的地方;大端序、小端序;适用于低风险转换及子类转父类)
1. 隐式转换在C语言中,存在不通过强制转换就可以将类型进行转换的隐式转换。例子:int main() { int n = 5; float f = 10.0f; //本质上发生了隐式转换,将int类型的5转换为float类型 f = n; return 0;}运行结果:计算机数据存储方式:计算机数据存储有两种字节优先顺序:高位字节优先(称为大端模式)和低位字节优先(称为小端模式)。大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的原创 2021-11-16 13:41:17 · 6320 阅读 · 0 评论 -
C++新特性06_强制转换运算符_const_cast(强制转换运算符:需要类型转换的时候使用,用于用编译器实现检测;const_cast:仅用于进行去除const 属性的转换;内存中?代表不可访问)
强制类型转换是有一定风险的,有的转换并不一定安全,如把整型数值转换成指针,把基类指针转换成派生类指针,把一种函数指针转换成另一种函数指针,把常量指针转换成非常量指针等。1.C语言中强转的方法: int n = 1; //将n的地址赋给指针p //int* p = &n; //c语言中进行强制转换,将n作为一个地址赋给p //p是带有类型的地址 int* p = (int*)n;当对地址为1的p进行访问的时候,会报如下错误:int main(){ int n = 1原创 2021-11-15 21:36:49 · 5263 阅读 · 0 评论 -
C++新特性05_ 面向对象_虚函数新关键字override、final、default、delete(函数为虚函数且父类有此虚函数才可编译;防止类被继续继承及终止虚函数继续覆盖;保留默认;禁止使用)
1. 显式虚函数重载在传统 C++ 中,经常容易发生意外重载虚函数的事情。例如:class Base {public: virtual void foo() {};};class SubClass : Base {public: void foo() {};};SubClass::foo 可能并不是程序员尝试重载虚函数,只是恰好加入了一个具有相同名字的函数。另一个可能的情形是,当基类的虚函数被删除后,子类拥有旧的函数就不再重载该虚拟函数并摇身一变成为了一个普通的类方法,这将造成灾难性原创 2021-11-15 11:32:41 · 1605 阅读 · 0 评论 -
C++新特性04_面向对象_委托构造和继承构造(委托构造:构造函数可以在同一个类中一个构造函数调用另一个构造函数;继承构造:利用关键字 using,子类直接调用父类的构造进行构造 )
1.委托构造:在一个析构函数中调用同一个类的另一个析构函数并执行。#include <iostream>class Base {public: int value1; int value2; float value3; //无参默认构造 Base() { value1 = 1; } //int参数构造 //在执行int参数构造函数时执行无参默认构造的写法 //只能执行或者说":"之后只能写一种构造函数 Base(int value) : Base()原创 2021-11-14 10:15:27 · 486 阅读 · 0 评论 -
C++新特性03_迭代器iterator及类型推导auto(迭代器:用于容器中数据遍历;动态数组(vector)和链表(list)遍历;堆上下限标志位;类型推导auto:编译时自动推导数据类型)
迭代器:用于stl中数据的遍历操作stl中存在一些常见的已经封装好(开箱即食)数据结构相关的模板类,例如vector(动态数组),list(链表), stack(栈),queue(队列),map(hash表/红黑树)等。这些类通常都有一些最基本的操作,例如:增加,删除,修改,遍历等等。C++为了方便统一,采用了设计模式中的迭代器模式,也就是统一的提供了一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。我们一般对这些数据结构的遍历都可以无脑使用迭代器,而不关心内部存储的差异。1.普通原创 2021-11-14 11:30:26 · 2605 阅读 · 0 评论 -
C++新特性02_ nullptr与constexptr(NULL本质是0;nullptr空指针,本质还是0,但具有了指针类型;constexpr(常量表达式);局部变量空间在编译器就决定)
本篇主要讲C++的新特性nullptr与constexptr。1.nullptr(1)NULL带来的问题在之前我们定义指针的初始化时,使用的是NULL,但是由于其为预定义的,本质上还是0,因此会造成重载出错的问题。下面就是重载出错的一个案例:使用NULL进行指针初始化重载至错误函数(2)NULL的本质预编译时已经定义为0,其实就是0。(3)nullptr的使用:本质还是0,但是具有指针类型。等价于:foo((char*)NULL);由于重载时有两个函数都满足条件,存在二义原创 2021-11-13 11:18:27 · 1439 阅读 · 0 评论 -
C++新特性01_ c++11 & 14 & 17(C++新特性、学习网站推荐、本栏目介绍的目录)
前面介绍了C++基础知识,目前的C++的新语法风格与旧的可能会完全不同,给我们机会更方便的写代码,本部分将会对新的内容进行介绍。这是原作者喜欢,比较好的查看C++语法的网站(11,14是普遍使用的),本书介绍的也不是特别细致,本栏目会以该目录为原型结合实际进行详细讲解。原创 2021-11-13 11:26:17 · 332 阅读 · 0 评论