
C/C++
Tyler_Zx
只有足够的努力,才能让一切看起来都毫不费力!
-
原创 C++ 智能指针详解
简介智能指针仅用于存储在堆中分配的内存的对象,智能指针做的工作比原始指针多得多。智能指针最重要的是特性是不必使用delete 和 delete[] 运算符释放内存,只要不再需要智能指针,它们就会自动释放。这样就可以避免多次释放、分配/释放不匹配、指针悬挂和内存泄露的可能性。智能指针特别适合用于管理动态创建的类对象,但智能指针不能完成原始指针的所有操作,智能指针不能递增或递减,也不能执行其他算术操作。智能指针由标准库memory 头文件中的模版定义,所以必须在源文件中包含这个头文件,才能使用智能指..2020-09-03 11:30:171246
0
-
转载 C++ 20新特性
目录ConceptsRangesModulesCoroutines(协程)Reflection总结前言本文主体内容源自公众号 CSDN(ID:CSDNnews),作者:祁宇本文将只评论大部分确定要加入和可能加入到 C++20 的重要特性,让读者对 C++ 的未来和演进趋势有一个基本的了解。这篇文章创作时间较早,所以一些内容和今年发布的 C++20 具体实现有些许不同。C++20 中可能增加哪些重要特性,下面这个图可以提供一个参考:下面是本文将评论的..2020-07-17 11:01:281931
0
-
原创 C++ 基础概念、语法和易错点整理
重载、隐藏和重写(覆盖)重载 Overload:函数名字相同,特征标(形参)不同。返回类型可以相同也可以不同,但只有返回值不同不能达到重载的目的,且会报错。函数必须在同一个域(类)中。隐藏 Hide:派生类中的函数会隐藏父类中所有的同名函数。重写 Override:子类对父类函数的重新编写,返回值和特征标(形参)都不能变,只能改变内部代码。被 override 的函数必须在父类中,且为 virtual。重载#include <iostream>using na..2020-07-14 16:37:582814
0
-
原创 C++ std::thread 和 std::jthread 使用详解 (含C++20新特性)
在C++ 11之前,官方并没有支持线程库。在Linux下完成多线程编程时,多数情况下是使用#include <pthread.h>的函数。C++ 11通过标准库引入了对thread类的支持,大大方便了完成多线程开发的工作。在C++20中,引入的jthread类是thread自动合并和取消的实现版本。接下来将先从线程函数和thread类开始介绍,分析它们的不同,然后再介绍jthread。std::thread定义于头文件<thread>classt...2020-06-16 11:35:543845
0
-
原创 C++ priority_queue 的使用和源码详解
目录简介priority_queue 的使用泛型算法make_heap()、push_heap()、pop_heap()make_heap()push_heap()pop_heap()简介priority_queue 是一个拥有权值观念的 queue,它允许加入新的元素、移除旧的元素、查看 priority_queue 中权值之最的元素等功能。priority_queue 只允许在底端加入元素,并从顶端取出元素,除此之外没有其它存取元素的途径。priority_queue2020-06-14 17:01:311951
0
-
原创 C++ string 使用详解(含C++20新特性)
目录元素访问迭代器容量操作查找std::erase,std::erase_if(std::basic_string)元素访问at 返回到位于指定位置pos的字符的引用constexprreference at(size_type pos);constexprconst_reference at(size_type pos)const;进行边界检查,非法访问时抛出std::out_of_range类型的异常。#i...2020-06-11 16:10:072534
2
-
原创 快用一用 lambda 表达式吧,让你的代码更简洁、更漂亮!
目录lambda 表达式定义 lambda 表达式捕获子句按值捕获按引用捕获捕获特定的变量捕获this指针使用lambda的优势lambda 表达式lambda 表达式提供了一种便捷、简洁的语法来快速定义回调函数或函数对象。而且,不只语法简洁,lambda 表达式还允许在使用回调的地方定义回调的逻辑。这通常比在某个类定义的函数调用运算符的某个地方定义这种逻辑要好得多。因此,使用 lambda 表达式一般能够得到极具表达力且可读性仍然很好的代码。lambda 表达式2020-06-09 00:09:384162
0
-
原创 C++易被忽略的知识点:移动语义 & 左值右值
lvalue 和 rvalue每个表达式都会得到 lvalue 或 rvalue。它们的区别是,lvalue是一个持久存在的值,其内存地址可被用来持续存储值;rvalue是一个暂时存储的结果。之所以称为 lvalue,是因为得到 lvalue 的表达式通常出现在赋值运算符的左边,而 rvalue 只能出现在赋值运算符的右边。表达式的结果不是 lvalue,就是 rvalue。包含一个变量名称的表达式总是 lvalue。注意:虽然名称中带有 value,但是 lvalue 和 rvalue 是表达式分2020-06-03 19:26:185597
0
-
原创 Linux gdb多进程、多线程调试
目录常用命令堆栈相关命令更为详细的断点调试gdb多进程调试gdb多线程调试前言gdb 是linux平台下进行程序调试的最常用的工具。简单的程序调试就是加断点,然后一步一步让程序运行,直到找到 bug 。一般的程序调试起来比较简单,但是在多进程或多线程情况下调试起来就比较麻烦。若 test.c 是你想要调试的程序,那么在编译时需要加 -g,即 gcc test.c -g -o test。完成编译后使用命令:gdb test。常用命令 命令 ...2020-05-21 17:00:452201
0
-
原创 C++ deque 底层原理及 queue、stack 容器的使用详解
目录元素访问迭代器容量修改操作std::erase,std::erase_if(std::deque)std::swap(std::deque)stackqueue简介双端队列 (double-ended queue,缩写为deque)是一个容量可以动态变化,并且可以在两端插入或删除的顺序容器。既然它是顺序容器,那么容器中的元素就是按照严格的线性顺序排序,可以使用类似数组的方法访问对应的元素。deque 实际分配的内存数超过容纳当前所有有效元素的数量,因为空闲的空..2020-05-15 17:30:243972
0
-
原创 C++ 动态二维数组(二维vector)
在完成一项任务时可能会需要用到动态二维数组,在C++中,可以使用二维vector创建二维数组。对二维数组的使用,其操作可分为增删查改。其中修改操作可以通过简单赋值操作完成,之后便不再赘述。创建二维数组:vector <int> vec(4,2); //将含有4个数据的一维动态数组初始为2vector<std::vector<int> > asd1(row, vector<int>(column, 0)); //初始化row*column二维动态数组2020-05-11 13:55:393782
0
-
原创 C++ 二维、三维 map 的使用
最近复习了一下map的使用,因为使用的都是一维的,所以使用常规操作就能满足需求。以前看到过有人在工作环境中使用多维度的map,当时没有尝试实现这种需求,今天想起来了就试了下。基本的思路就是嵌套map,类似于map<string, map<string, string>> 这种形式,然后再填入相应的数据便可以完成多维度map的使用。代码:#include <iostream>#include <map>#include <string>2020-05-09 16:36:032349
0
-
原创 C++ unordered_map 使用详解(含C++20新特性)
目录查找元素迭代器容量修改操作通接口哈希策略观察器std::swap(std::unordered_map)std::erase_if(std::unordered_map)简介本篇博客介绍C++常用的无序关联容器unordered_map。unordered_map是C++11正式加入的对hashmap的官方实现(之前标准C++没有hashmap的官...2020-05-06 12:19:524528
1
-
原创 C++ map 使用详解(含C++20新特性)
简介map是一个关联容器,它提供一对一(其中第一个称为关键字,每个关键字只能在map中出现一次,第二个称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的。访问元素at()用于访问指定元素...2020-05-03 22:23:405191
0
-
原创 C++ vector 使用详解
目录介绍两个关键词元素访问迭代器空间修改操作简介C++的vector本质上是一个动态数组,它的元素是连续存储的,这意味着不仅可以通过迭代器访问元素,还可以使用指向元素的常规指针来对其进行访问。还可以将指向vector元素的指针传递给任何需要指向数组元素的指针的函数。vector的存储是自动处理的,可以根据需要进行扩展和收缩。vector通常比静态数组占用更多的空间,...2020-05-02 23:20:4810023
0
-
原创 C++实现字符串分割函数split()
目录使用strtok()完成分割使用strsep()完成分割使用strtok_r()完成分割实现字符串分割前言最近遇到了一个字符串分割的问题,在C++的标准库里面没有字符分割函数split()。我想这个问题今后可能还会再遇见,所以使用C/C++中的字符串分割方法完成相应的功能。需求:对一个字符串进行分割,然后将分割后的数据存起来,想用的时候像用数组那样拿就行了。所以在完...2020-04-30 22:31:477005
0
-
原创 腾讯2020暑期实习4.26在线笔试编程题
前言腾讯2020暑期实习笔试在4.26号进行,总共有5道编程题,其中两道是数据结构中的队列和栈的考察。这里我只截了4道题的图,第一道题的队列会用就行了,按照要求处理输入和输出。这里我也给出一些题的代码,虽然不是最优的,但是能解决问题。用栈实现队列 最接近点对问题 #include <iostream>#include <cmath>...2020-04-29 15:43:575454
0
-
原创 内存对齐详解
为什么要进行内存对其?(1)空间原因:没有进行内存对齐的结构体或类会浪费空间。(2)性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。(3)平台原因:不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。如果一个变量的内...2020-04-25 11:56:222062
0
-
原创 尾递归及快排尾递归优化
尾递归概念如果一个函数中所有递归形式的调用都出现在函数的末尾,我们称这个递归函数是尾递归的。当递归调用是整个函数体中最后执行的语句且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归。尾递归函数的特点是在回归过程中不用做任何操作,这个特性很重要,因为大多数现代的编译器会利用这种特点自动生成优化的代码。原理当编译器检测到一个函数调用是尾递归的时候,它就覆盖当前的活动记录而不是在...2020-04-13 15:17:192992
2
-
原创 I/O多路复用:select、poll和epoll详解
I/O多路复用I/O复用使得程序能同时监听多个文件描述符,这对提高程序的性能至关重要。通常,网络程序在下列情况下需要使用I/O复用技术:客户端程序要同事处理多个socket。比如将讨论的非阻塞connect技术。客户端程序要同时处理用户输入和网络连接。TCP服务器要同时处理监听socket和连接socket。这是I/O复用使用最多的场合。I/O复用虽然能同时监听多个文件描述...2020-04-10 22:47:298511
1
-
原创 Tinyhttpd源码分析——超轻量级的HTTP服务器
前言Tinyhttpd是一个不到500行的超轻量级的Http Server,通过阅读这里面的源码,可以帮助大家理解服务器程序的本质。这个项目比较适合刚学习Linux服务器开发或刚学网络编程的人,因为整个项目所涉及到的知识并不多。这里面的知识点不多,但是有几个小知识若是要细究的话,还是可以发现很多问题的。下载地址:http://sourceforge.net/projects/tiny...2019-12-30 21:17:052331
0
-
原创 cJSON源码及解析流程详解
前言cJSON简介cJSON.hcJSON结构cJSON结点的创建cJSON解析parse_objec( )parse_array( )parse_number( )parse_string( )cJSON打印print_object( )print_array( )print_number( )print_string( )&pri...2019-11-29 11:17:076866
2
-
原创 C++多态、静态成员函数、虚函数问题详解
目录笔试题静态成员函数的使用规则1.通过类名调用静态成员函数和非静态成员函数2.通过类的对象调用静态成员函数和非静态成员函数3.在类的静态成员函数中使用类的非静态成员4.在类的非静态成员函数中使用类的静态成员5.使用类的静态成员变量虚函数的工作原理有关虚函数注意事项前言最近秋招,学长们都在答题,我也稍微关注了一点动向。先不说编程题,就前面的选择题有时候就...2019-09-06 16:20:092260
0
-
原创 C/C++ 字符串(string)转换
C语言字符串转int、long、long long:int atoi(constchar*str);long atol(constchar*str);longlongatoll(constchar*str);#include <iostream>#include <cstdlib>int main(){...2019-06-21 16:35:471347
0
-
原创 C/C++运算符
前言前几天在看《STL源码剖析》时看到一段这样的代码return ( (bytes) + __ALIGN - 1) & ~ (ALIGN -1)); //将bytes上调至8的倍数。虽然有注解,但当时对着这段代码真的是半天没有反应过来。直觉告诉我应该看看C/C++的运算符了(刚开始学C/C++的时候看完书上常用的运算符就没看别的了,现在来补课了。出来混果然是要还的)。这里主要复习位运算...2019-04-09 18:35:06620
0
-
原创 C++ 深复制与浅复制 & RVO问题
前言最近在看《C++ Primer Plus》的类和动态内存分配,于是自己也敲了相应的代码,但是得到的结果却和书上的不太一样。于是想整理一下相关的内容。内容主要是深浅复制、复制构造函数以及赋值运算符的问题。先从一段简单的代码开始:#include <iostream>#include <string.h>using namespace std;clas...2019-03-14 15:37:172275
0
-
原创 C/C++数组指针和指针数组
数组指针和指针数组的区别指针数组:首先它是一个数组,每一个元素都是一个指针。数组指针:首先它是一个指针,它指向一个数组。它是"指向数组的指针"的简称。运算符的优先级关系:() > [] > * 数组指针(也称行指针)例如:int (*p)[n];根据优先级,先看( )内,p是一个指针,后面的[ ]又说明了p是一个指向数组的指针,由于前面的int,所以p是一个指向 i...2019-01-31 20:59:163280
0
-
原创 C/C++函数指针
函数指针与数据项相似,函数也有地址。函数的地址是存储其机器语言代码的内存的开始地址。我们可以编写将另一个函数的地址作为参数的函数。这样第一个函数将能够找到第二个函数,并运行它。与直接调用一个函数相比,这种方法比较笨拙,但它允许在不同的时间传递不同函数的地址,这意味着可以在不同的时间使用不同的函数。 (1)获取函数的地址获取函数的地址很简单:只要使用函数名即可(后面不跟参数)。也就是...2019-01-30 22:24:525205
0
-
原创 C/C++ 指针和数组
指针和数组基本等价的原因在于指针算术和C/C++内部处理数组的方式。#include <iostream>using namespace std;int main(){ double wages[3] = {100.0, 200.0, 300.0}; short stacks[3] = {3, 2, 1}; double *pw = wages;...2019-01-29 20:41:392205
0
-
原创 C++ getline() 和 get()
字符串输入问题#include <iostream>using namespace std;int main(){ const int Asize = 20; char name[Asize]; char dessert[Asize]; cout << "Enter your name:" <<endl; ...2019-01-28 20:07:389176
1
-
原创 STL泛型编程之迭代器
前言学习《C++ Primer Plus》中泛型编程的一些概念,感觉需要对这部分的知识理解的深一点(都是书上的内容,只不过经常搞不清,所以就抄了个笔记)。STL提供了一组表示容器、迭代器、函数对象和算法的模板。容器是一个与数组类似的单元,可以存储若干个值。STL容器是同质的,即存储的值的类型相同;算法是完成特定任务的“处方”;迭代器能够用来遍历容器的对象,与能够遍历数组的指针类似,是广义指针;...2018-12-28 15:54:112405
0
-
原创 虚函数与纯虚函数
虚函数在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数,格式为:virtual 函数返回类型 函数名(参数表);实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离。...2018-11-19 16:43:222583
0
-
原创 C++ sort()函数的使用
C++ Sort()函数sort()函数是C++排序方法之一,它的实现方式是基于快排的,所以时间复杂度为O(nlogn),执行效率较高。sort()函数的头文件:#include<algorithm>sort()函数的参数:(1)参数一是要排序的数组的起始地址。(2)参数二是结束的地址(最后一位要排序的地址)(3)参数三是排序的方法,可以是从大到小也可是从小到...2018-11-06 11:03:251949
0
-
原创 C/C++线程基本函数
最近在CSDN上闲逛,不知道看些什么,刷着刷着就看到了建议性锁和强制性锁,看了简单的概念后又刷到了重入锁和自旋锁。发现自己对线程里的锁了解的还不够深(以前只知道互斥锁、条件锁和读写锁),所以现在想先整理下与线程相关的函数,然后再学习重入锁和自旋锁。创建线程和结束线程(1)线程创建函数intpthread_create(pthread_t *thread, const pthrea...2018-10-06 13:08:146881
0
-
原创 内存四区 & malloc/free与new/delete的区别
前言之前写了一篇关于《快速排序的4种优化》的博文,当时在验证各种情况的时候忽略内存分配的问题,导致所得到的结果分析的不全面。因为在刚开始写程序的时候将数组声明在main()里面,这样数组占用的栈空间,影响了递归的深度,也影响了程序处理的数据量(即使不用尾递归,处理的数据量也能超过4万)。在了解内存分配问题之前,先复习一下进程的概念。进程(Process)是计算机中的程序关于某数据集合上的一次运...2018-10-01 22:29:191613
0
-
原创 在手机上运行Linux终端并连接服务器
原来一直想用手机或平板编程玩,但一直找不到软件。最近发现了一个很实用的软件Termux(百度就能下载了,过程十分简单,安装后不需要配置文件),使用它就能在手机终端进行编程(C/C++或Python)、练习Linux下的命令以及连接服务器。(无线鼠标、无线键盘再加一个Type-c转接口就能像使用电脑一样编程)安装了Termux后,可以先下载一些常用的工具,例如vim、gcc和g++等。直接敲vi...2018-09-21 17:20:1815584
6
-
原创 C++学习笔记:(十)异常
目录10.异常处理10.1异常处理概述10.2抛出异常10.3异常捕获10.4构造函数、析构函数与异常处理10.5异常匹配10.6标准异常及层次结构层次结构。10.异常处理C++具有强大的扩展能力,同时也大大增加了产生错误的可能性。在编程时,不能忽略异常处理。处理异常的方法多种多样。错误处理代码分布在整个系统代码中,在任何可能出错的地方都进行异常处理,阅读代码时...2018-09-08 21:44:122785
0
-
原创 C++学习笔记:(九)输入/输出流
目录9.输入/输出流9.1C++流类库简介9.2输入/输出流9.3自定义类型的输入/输出9.4文件输入/输出9.输入/输出流数据的输入、输出是最重要的操作,C++的输入、输出有iostream库提供支持。它利用多继承和虚拟继承实现了面向对象类层次结构。C++的输入、输出机制为内置数据类型的输入、输出提供了支持,同时也支持文件的输入、输出。 在此基础上,设计者可以通过扩展...2018-09-04 18:38:593160
1
-
原创 C/C++中输入带空格的字符串 & string 转 char*
在C和C++中,用普通的方法输入带空格的字符串时,得不到后续的数据。想要在字符串中包含空格可以使用以下方法:(1)使用正则表达式scanf("%[^\n]]",str); //接收带空格的字符串scanf("%[a-z A-Z 0-9]",str) //表示只匹配输入是大小写字母和数字。(2)在C中使用gets();或fgets();在Linux下使用get...2018-09-04 17:50:302477
0
-
原创 C++学习笔记:(八)模板
目录8模板8.1模板的概念8.2函数模板和模板函数8.3类模板与模板类8.4程序实例8模板8.1模板的概念函数重载可以实现具有相同功能的函数的函数名相同,使程序更加易于理解。系统可以根据不同的参数类型来区分函数。这样虽然很方便,但是书写函数的个数并没有减少,重载函数的代码量几乎完全相同。那么如何解决这个问题?C++提供了模板。模板是C++的一个重要特征。模板是类...2018-08-25 20:42:402987
0