C++
文章平均质量分 74
C++语言
我叫RT
无它,唯手熟耳。
心之所向,莫向外求。
展开
-
C++ std::regex | 正则表达式
cppreference: https://zh.cppreference.com/w/cpp/regex结合以下网站食用更加:正则大全正则解析:Regulex:JavaScript Regular Expression Visualizer正则练习:regex101: build, test, and debug regex文章目录一、正则表达式的操作二、主要的几个类2.1 basic_regex 正则表达式对象示例:2.2 match_results 正则匹配结果集示例:2.3 sub_m原创 2022-04-04 04:06:02 · 7308 阅读 · 0 评论 -
C++模板编程之变长参数模板
模板:https://zh.cppreference.com/w/cpp/language/templates变量模板:https://zh.cppreference.com/w/cpp/language/variable_template类型别名,别名模版:https://zh.cppreference.com/w/cpp/language/type_aliastemplate<class T>struct Alloc { };template<class T>usin原创 2022-03-07 00:40:08 · 3543 阅读 · 1 评论 -
论C++如何优雅的输出数组元素。<( ̄ c ̄)y▂ξ 优雅,永不过时
今天的主题是,论如何优雅的输出数组的元素,顺便在此过程中了解。。。引子众所周知,在C++中想要输出数组内的元素,我们一般会沿用C的方式,即遍历数组输出。而在其他语言中,都可以直接输出数组,例如python 或是golang。但是…,C++语言以灵活著称,难道就没有方式更优雅的输出数组元素了吗?当然有,还不止一条。下面就让我们来探讨一下「C++如何优雅的输出数组元素」。基于范围的for循环在C++11的语法更新中提供了一个特殊版本的 for 循环——基于范围的 for 循环。(以下简称为“范原创 2022-01-15 20:18:45 · 5211 阅读 · 5 评论 -
C/C++常用头文件及函数汇总【转】
C/C++头文件一览C#include <assert.h> //设定插入点#include <ctype.h> //字符处理#include <errno.h> //定义错误码#include <float.h> //浮点数处理#include <iso646.h> //对应各种运算符的宏#include <limits.h> //定义各种数据类型最值的常量#inclu原创 2021-02-03 17:39:15 · 1374 阅读 · 0 评论 -
银行转账问题 | 线程安全
#include<iostream>#include<atomic>#include<thread>#include<mutex>#include<condition_variable>#include<unordered_set> #include<set>using namespace std;std::mutex mtx;std::condition_variable cv;class Count原创 2021-04-04 22:02:46 · 414 阅读 · 0 评论 -
this_thread::yield 让度线程
yidld意为“放弃”,在 this_thread 作用域下,用于暂停当前线程的调度将CPU让给其他线程。定义于头文件 <thread>,void yield() noexcept;使用 while(condition) this_thread::yield(); 语法可以实现基本的线程同步。如下示例:要求多个线程按顺序输出 1…size ,且 0 号线程输出 n 等于 0 时的值, 1 号线程输出 1, 2号线程输出 2 …。int n = 0;void fun(int x){原创 2021-08-29 21:00:20 · 965 阅读 · 0 评论 -
C++ | 死锁的产生 于 避免死锁的方法
可能被多个线程修改的数据,我们一般用互斥量(mutex)来保护。mutex在同一时间,只能被一个线程拿到(专业术语叫lock), 其他试图lock mutex的线程会被挂起,直到该mutex被释放后,才有可能拿到mutex并继续执行。死锁程序,示例#include <iostream>#include <atomic>#include <thread>#include <mutex>using namespace std;int a = 3原创 2021-04-04 20:38:25 · 817 阅读 · 0 评论 -
实现自旋锁
自旋锁,不进行阻塞,空耗CPU资源。在针对多核CPU、资源占用时间不长的情况下很高效。要求:锁住的资源足够小,计算时间足够短。优点:相对于互斥锁,不会使我们的线程陷入内核态,效率高缺点:如果资源每个线程对资源占用时间比较长,那么我们自旋操作将会大量的空耗CPU,效率低下。同时,对于单核CPU来说,自旋锁在自旋时进行大量空耗等待对方线程释放锁,然而单核CPU一次只能运行一个线程,因此,等待当前线程时间片到达切换之后,该自旋锁才会释放。#include <iostream>#inclu.原创 2021-04-04 17:21:33 · 314 阅读 · 0 评论 -
虚继承与空基类优化
参考文章 虚继承与空基类优化 。class TEST_X {}; // 1class TEST_Y : public virtual TEST_X { // 12 virtual void fun() {}; // 虚表4 //指虚基类的表指针4 char c; }; // 字节对齐 4 // 空基类优化为0class TEST_Z : public TEST_X { // 8 virtual void fun() {}; // 空基类优化为 0 ch原创 2021-04-04 15:23:45 · 108 阅读 · 0 评论 -
C++ | 多线程编程(四) 信号量
https://zh.cppreference.com/w/cpp/thread/counting_semaphore成员函数:release:增加内部计数器并除阻获取者相当于V操作acquire: 减少内部计数器或阻塞到直至能如此相当于p操作#include <iostream>#include <thread>#include <semaphore>using namespace std;/*三个线程,依次打印ABC*/std::.原创 2021-03-19 16:51:03 · 1413 阅读 · 0 评论 -
C++ | 多线程编程(三) 条件变量
条件变量:https://zh.cppreference.com/w/cpp/thread/condition_variablecondition_variable 类是同步原语,能用于阻塞一个线程,或同时阻塞多个线程,直至另一线程修改共享变量(条件)并通知 condition_variable 。条件变量一般与互斥锁一起使用。三个线程轮流打印0~100.目标:是三个线程分别依次打印1,2,3…100#include <iostream>#include <thread>原创 2021-03-19 16:09:58 · 511 阅读 · 0 评论 -
C++ | 多线程编程(二) 互斥器Mutex
文章目录1. 使用互斥器进行线程同步1.1 mutex互斥器1.2 std::lock_guard(保护)1. 使用互斥器进行线程同步#include <iostream>#include <thread>using namespace std;const int n = 5;void func(char ch){ for (int i = 0; i < n; i++) { cout << ch; } cout << en原创 2021-03-19 15:09:32 · 350 阅读 · 1 评论 -
C++ | 多线程编程(一)thread库的使用示例
#include <iostream>#include <thread>using namespace std;// 线程函数void func(int a, int b){ for (int i = 0; i < n; ++i) { cout << "thread 1 executing a = " << a << ", b = " << b << endl;// 毫秒 std::thi原创 2021-03-19 01:17:00 · 1584 阅读 · 1 评论 -
分析new 与 malloc的不同,以及如何使用free()、delete、delete[]释放资源。
free可以对new的空间进行释放吗?delete可以释放new出的数组空间吗?什么情况下可以使用free或delete释放,却不能使用delete[]释放?什么情况下可以free、delete、delete[] 三种方法都可以释放?原创 2021-02-15 19:54:33 · 702 阅读 · 2 评论 -
简单仿写共享性智能指针——《shared_ptr》
std::shared_ptr 是通过指针保持对象共享所有权的智能指针。多个 shared_ptr 对象可占有同一对象。具体参考 《std::shared_ptr》#include <iostream>#include <atomic>// 仿写shared_ptrnamespace TR { // 引用计数类 template<typename T> class RefCnt { private: T* mPtr; // 指向对象的指针 st原创 2021-01-31 23:26:29 · 129 阅读 · 0 评论 -
取代typeid打印变量类型:是否可能在标准变量中打印变量的类型C++?/ Is it possible to print a variable‘s type in standard C++?
在C++中有typeid、typeof等方法可以让我们获取类型信息,但获取到的结果是不存在引用和 cv 限定符的。比如下面一段代码:const int ia = 10;cout << "type: " << typeid(ia).name() << endl;// 输出:type: int这并不是我们想要的结果,我们想要的输出是 const int 。而究竟是否可能在标准变量中打印变量的类型呢?本文参考《Is it possible to print a va原创 2021-01-26 20:34:34 · 492 阅读 · 0 评论 -
成员函数返回类成员变量的引用,有存在修改成员变量的值的风险。
很多时候我们将函数返回值设置为引用类型,这样可以提高函数返回的效率,而如果我们在类成员方法中这样做了,很可能会出一些问题。参考如下代码:我们通过设置类成员方法 data() ,本意是想查看类私有变量的数值,为了提高效率我们增加了引用。class Object {private: int value;public: Object(int x = 10) :value(x) {}; int& data() { return value; }};int main(){ Object原创 2021-01-26 18:03:08 · 3907 阅读 · 0 评论 -
继承关系中虚函数及其默认值 | 动态联编。
首先,需要明确的时,函数参数的缺省值是在编译器就确定的,在编译期如果函数调用中的某个参数缺省,编译器就会使用函数的默认值作为参数调用。而C++中的动多态是运行时才会确定调用哪一个函数。 而如果发生动多态的函数具有默认值的话,它的调用又是怎样的呢?参考如下代码:基类Object中,虚函数print有缺省参数int a = 10; ,同样的在派生类Base中,虚函数print也有缺省参数int b = 100; 。当我在主函数main中,尝试通过动多态的方式调用print(),最后的输出结果又是怎样呢?原创 2021-01-25 20:41:26 · 446 阅读 · 0 评论 -
C++ | 继承关系与成员属性
1.继承限定符公有继承限定符:子类继承时,按照原本的成员属性继承。保护继承限定符:子类继承时,继承后的属性不高于保护属性。(public => protected)私有继承限定符:子类继承时,继承后的属性不高于私有属性。(public => private 、protected => private)2.访问限定符public:{属性:类外可访问,类内可访问。特点:子类继承时可以继承全部特性(受成员限定符限制)。public:\begin{cases}属性:类外{\color{原创 2021-01-17 13:08:32 · 1127 阅读 · 1 评论 -
C++ | 指向类成员变量的指针 ( .* 运算符 与 ->* 运算符)
文章目录指针访问类成员变量1. 指针访问类中普通变量2. 指针访问类中静态变量指针访问类成员方法1. 指针访问类中普通方法2. 指针访问类中静态方法我们都知道在 C/C++ 中指针的使用的方式非常灵活,在C语言中指针可以指向任意的变量或是函数,并通过指针解引用的方式对其访问。而在C++中我们引入了OOP的思想,并且产生了类这种结构,其中封装作为类的一大特性将变量和方法封装在类内部使得我们直接无法使用,而作为类实例化存在的对象成为了间接调用类内部属性和方法的载体(通过对象的this指针间接调用,需要注意原创 2020-11-10 22:31:49 · 6987 阅读 · 1 评论 -
C++ | 匿名函数(lambda表达式)
lambda表达式:[capture list] (params list) mutable exception-> return type { function body } 也叫匿名函数,以下统称为匿名函数。对于一个函数而言,由4部分组成:返回值类型 函数名(形参列表){ 函数体;}而针对匿名函数而言,因为没有名字,我们在定义时即使用,它由以下几部分组成:[捕获列表] (形参列表) ->返回值类型{ 函数体;}其中,形参列表与返回值类型中还存在可选参数,我们后面在讨原创 2020-10-03 17:58:59 · 8068 阅读 · 1 评论 -
C++ | 关键字new 与 delete ——动态申请空间
new 与 delete 运算符在C++中用于动态分配内存。而在C语言中C库函数malloc 与 free 也可以用作动态分配内存。malloc 与 free 使用实例:void *malloc(size_t size) /* malloc 与 free 使用 */ int* p = (int*)malloc(sizeof(int)); if (nullptr == p) { cerr << "malloc error" << endl; return -1;原创 2020-09-27 16:32:49 · 400 阅读 · 0 评论 -
C++ | 引用与指针
一、引用和指针的区别引用是变量的别名。int main(){ int a = 10; int* p = &a; int& b = a; *p = 20; cout << &a << " " << p << " " << &b << endl; cout << a << " " << *p << " " << b <&l原创 2020-09-26 14:40:59 · 1374 阅读 · 0 评论 -
C++ | 初识const关键字、常量与常变量
C++笔记:常指针之——指针常量与常量指针const int *p;int const *p; // const 与 int 不分先后,意义相同。此类指针我们称之为常量指针。顾名思义,指针指向的值是一个常量(语法上的,编译器认为该值不可通过指针修改)。记忆方法:const修饰的 (P),p解引用就是指针所指向之值,所以常量指针修饰的值为常量(不可做左值被修改)。示例代码:{int a = 10;const int p = &a;int q = p; // 此语句错误的,原创 2020-09-24 17:47:45 · 1789 阅读 · 0 评论 -
练习题:C++指针练习
文章目录练习分析题目二:A选项;B选项;C选项;D选项;E选项;方法总结:在C++中,const作用域指针时,可以看做是对指针权限的限制。这里我们先把指针的权限归为两种,分别为指向权限和修改权限。(ps:以上是为了理解方便,实际并没有如此规定) int a = 10, b = 20; int* p = &a; p = &b; // 改变指向的权限 ✔ *p = 30; // 修改内存的权限 ✔ const int* cp = &a; // 限制修改权限 //*原创 2020-09-24 13:59:24 · 8052 阅读 · 2 评论 -
C++ | 函数重载
函数重载C语言:不支持 (报错:error 函数已有主体)原因:函数符号的生成只依赖函数名。函数符号相同编译无法通过C++:支持 原因:函数符号的生成依赖 函数名+参数列表 。重载后的各函数符号不同。函数重载特点:函数名相同,参数列表不同,处于同一作用域。返回值不参与重载,重载函数调用类型要明确。实例一:函数重载 规则1:函数名相同,参数列表不同bool Compare(int a, int b){ cout << "Compare_Int_Int"<< e原创 2020-09-13 22:41:00 · 512 阅读 · 0 评论 -
C++ | 内联函数
内联函数在编译时进行展开,在调用点出产生一个函数体代码的拷贝。因此,对内联函数进行任何修改后,都需要对所有调用该函数的模块进行重新编译,否则它将会继续使用旧的函数。如果想把一个函数定义为内联函数,则需要在函数名前面放置关键字 inline,在调用函数之前需要对函数进行定义。如果已定义的函数多于一行,编译器会忽略 inline 限定符。内联函数的作用:引入内联函数的目的是为了解决程序中函数调用的效率问题,函数的调用会有函数栈帧的开辟和函数内资源的回收处理产生的开销。如果函数功能比较简单,如整数比较大小函原创 2020-09-13 00:59:40 · 677 阅读 · 1 评论 -
C++ | 函数参数默认值
函数参数默认值(缺省函数)必须从右向左依次赋值不可以重复赋值(同一个文件) //调用不明确函数参数在有默认值时,如果调用时没有传参,则默认push默认值。实例一:不带默认值#include <iostream>using namespace std;int fun(int a, int b, int c);int main(){ fun(10, 20, 30); //若有默认值,且调用时未传参,则push 默认值 /* push 30 // pu原创 2020-09-08 23:03:17 · 6518 阅读 · 0 评论 -
C++ | 程序编译连接原理
文章目录预编译(生成*.i文件)编译(生成*.s文件)汇编(生成*.o文件,也叫目标文件)链接(生成*.exe文件,也叫可执行文件)汇编——目标文件查看文件头查看符号表查看 .o 文件段表查看汇编代码链接——可执行文件查看文件头查看符号表查看汇编代码程序头部信息总结c/c++程序编译链接一共分四个过程:编译和链接:源文件 a.c预编译(生成*.i文件)命令 :gcc -E a.c 或 gc...原创 2020-03-20 17:29:42 · 580 阅读 · 0 评论 -
C++ | 虚拟地址空间
在 x86 32位系统下,进程的虚拟地址空间为 232 (4G)大小,其中在windows系统下4G地址空间中0x00000000-0x7FFFFFFF 是用户地址空间,0x80000000-0xFFFFFFFF 是内核空间。在Linux系统下,0xC00000000-0XFFFFFFFF为系统空间,为所有的系统进程所共享,0X00000000-0XBFFFFFFF为用户空间。本文主要研究在Lin...原创 2020-03-20 14:03:32 · 711 阅读 · 0 评论 -
C++ | 再探智能指针(shared_ptr 与 weak_ptr)
垃圾回收机制:程序运行过程中会申请大量的内存空间,而对于一些无用的内存空间,如果不及时清理的话,会导致内存使用完(内存溢出),导致程序崩溃。而对 C/C++ 语言来说,在栈上申请的空间由操作系统接管,系统会自动回收它,而在堆上申请的空间就需要我们程序人员自行进行分配了。垃圾回收机制,是系统防止程序发生内存泄漏的一种保护机制。作用呢就是将程序运行期间产生的垃圾(不再使用的数据),或对内存堆中已...原创 2020-02-26 20:19:47 · 412 阅读 · 0 评论 -
C++ | 智能指针初探
智能指针初探在 c/c++ 语言中有一种特殊的类型——指针类型。指针作为实体,是一个用来保存一个内存地址的计算机语言中的变量。它可以直接对内存地址中的数据进行操作,是一种非常灵活的变量。指针被誉为是c语言的灵魂,而作为c语言的继承者c++来说更是继承了指针灵活多用的特点并把它发扬光大。在这里我们不去重点讨论普通的指针,而是讨论其中更为特殊的指针——智能指针。智能指针到底智能在哪?又为什么叫智...原创 2020-02-25 23:43:43 · 393 阅读 · 0 评论 -
C++ | 虚函数表内存布局
虚表指针虚函数有个特点。存在虚函数的类会在类的数据成员中生成一个虚函数指针 vfptr,而vfptr 指向了一张表(简称,虚表)。正是由于虚函数的这个特性,C++的多态才有了发生的可能。其中虚函数表由三部分组成,分别是 RTTI(运行时类型信息)、偏移及虚函数的入口地址。而虚表与类及类生成的对象有存在着以下两种关系:类与虚表的关系:一个类只有一个虚表对象与类的关系:所有对象共享一个虚表...原创 2020-02-19 23:41:32 · 2322 阅读 · 0 评论 -
C++ | 动多态 | 虚函数表
多态机制C++语言有三大特性:封装、继承、多态。其中所谓的多态,即 “同一接口,不同形态”。接口在我们 C/C++ 语言中可以理解为函数名,不同形态可以理解为函数执行的功能不同。而多态又主要分为静多态和动多态。静多态: 在编译阶段确定函数的调用动多态: 运行阶段确定函数的调用宏多态: 在预编译阶段确定函数的调用而我们今天要讨论的就是动多态。动多态提到动多态就要提到虚函数,其中虚函...原创 2020-02-19 23:17:29 · 221 阅读 · 0 评论 -
C++ | 动多态的发生时机
探究动多态的发生时机有了虚函数和虚函数表为动多态提供支持,从而可以实现C++语言的动多态。那么,问题又来了。动多态的发生时机是什么?或者说,动多态发生有哪些条件与限制呢?下面让我们一起来探究动多态的秘密,揭示动多态的发生时机。详细步骤:1、虚函数与普通函数的调用2、利用汇编代码分析动多态3、初步探究动多态调用方式4、深入探究动多态发生时机5、总结1、虚函数与普通函数的...原创 2020-02-19 14:22:42 · 390 阅读 · 0 评论 -
C++ | 虚函数产生条件
虚函数产生的条件1、虚函数机制为动多态提供支持,而虚函数表中存放着虚函数表的地址。因此虚函数必须可以取地址2、虚函数的调用是依靠虚表指针解引用得到虚表,再从虚表中找到对应的虚函数。换言之,虚函数依赖对象调用在C++的类中主要存在以下几种函数:1. 构造函数构造函数不能依赖对象调用。对象产生的步骤主要有二:1、开辟内存空间,2、调用构造。这两部操作完成之后才会有对象生成。因此,不能成为虚...原创 2020-02-19 13:25:29 · 440 阅读 · 0 评论 -
C++ | 虚表的写入时机
虚表在C++的多态机制中,使用了 virtual 关键字声明的函数称之为虚函数,每个有虚函数的类或者虚继承的子类,编译器都会为它生成一个虚拟函数表(简称:虚表,以下用 vftable表示),表中的每一个元素都指向一个虚函数的地址。我们都知道在C++中对象生成有两个步骤:1、分配内存空间2、调用构造函数多态机制发生在运行阶段,也就是对象生成阶段。那么问题就来了,虚表(编译阶段生成)是什么时......原创 2020-02-17 15:10:07 · 2268 阅读 · 9 评论 -
C++ | 虚函数初探
虚函数虚函数 是在基类中使用关键字 virtual 声明的函数。在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。我们想要的是在程序中任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为动态链接,或后期绑定。1、普通的继承关系#include <iostream>class Base //定义基类{public: Base(int ...原创 2020-02-03 20:48:23 · 1978 阅读 · 2 评论 -
C++ | 栈的应用(逆波兰算法) | 计算器
#include <iostream>using std::cin;using std::cout;using std::endl;template<typename T>class Stack{public: Stack(int _size = 20) :size(_size), mtop(0) { data = new T[size](); ...原创 2019-11-30 20:48:51 · 1293 阅读 · 3 评论 -
C++类中隐藏的六个(八个)默认函数
Test类中隐藏的六个默认的函数class Test{public: //默认的构造函数 Test(); //析构函数 ~Test(); //拷贝构造函数 Test(const Test &t); //赋值函数 Test& operator=(const Test &x); //一般对象取地址函数 Test* operator&()...原创 2019-11-08 15:29:27 · 568 阅读 · 0 评论