C++&STL
文章平均质量分 78
C和指针,重点还是C++的相关语法及STL容器原理剖析
keneyr
一个兴趣广泛/想成为大佬 且 未遂的二道小贩子
展开
-
前缀++和后缀++相关源码探索
最近研究RB-tree源代码,发现自增和自减的返回类型还不一样://前缀self& operator++(){increment(); return *this;}//后缀self operator++(int){ self tmp = *this; increment(); return tmp;}self& operator--(){decrement(); return *this;}self operator--(int){ self t原创 2021-07-13 12:08:37 · 1071 阅读 · 0 评论 -
C++异常处理
苦C++异常处理久已,希望自己的C++工程代码可以有完善的异常处理机制,但是经常急速裸奔开发,一点都不elegant。所以借鉴一下各路大神的笔记,来加深印象。引言异常,让一个函数可以在发现自己无法处理的错误时抛出一个异常,希望它的调用者可以直接或者间接处理这个问题。而传统错误处理技术,检查到一个局部无法处理的问题时:1.终止程序(例如atol,atoi,输入NULL,会产生段错误,导致程序异常退出,如果没有core文件,找问题的人一定会发疯)2.返回一个表示错误的值(很多系统函数都是这样,例如ma原创 2021-06-08 21:43:21 · 1166 阅读 · 0 评论 -
dynamic_bitset
C++标准为处理二进制数值提供了两个工具:vector<bool>和bitset. vector<bool>是对元素类型为bool的vector特化,它内部并不真正存储bool值而是以bit来压缩保存,使用代理技术来操作bit,造成的后果就是它很像容器,大多数情况下的行为与标准容器一样,但它不是容器,不满足容器的定义。bitset与vector<bool> 类似,同样存储二进制,但它的的大小固定,而且比vector<bool>支持更多的位运算。两者的优.转载 2021-05-24 15:59:35 · 1249 阅读 · 0 评论 -
C++多线程编程中的Master-Worker设计模式
Master-Worker模式概念Master负责任务的接收和分配,Worker负责具体的子任务执行。每个Worker执行完任务之后把结果返回给Master,最后由Master汇总结果。代码(小声bb,这个c++代码我暂时还没搞完全利索,还有点错,还稍许不知所措,这里放出来是为了快速理解Master-Worker模式,过几天再修缮这篇博客中的代码)下面用Master-Worker实现计算1-100的平方和,思路如下:定义一个Task类用于存储每个任务的数据。Master生产固定个数的Wor原创 2021-02-09 15:35:24 · 1143 阅读 · 0 评论 -
C++多线程编程基础
本博转载于知乎:https://zhuanlan.zhihu.com/p/194198073没想到我第一篇博客是哲学家就餐问题,涉及到多进程编程~ 事隔多年,我又开始折腾多线程编程。只是我真的奇怪,当时我是怎么做到的,写出了多进程的代码?那时的我真棒...1 什么是C++多线程并发?线程:线程是操作系统能够进行CPU调度的最小单位,它被包含在进程之中,一个进程可包含单个或者多个线程。可以用多个线程去完成一个任务,也可以用多个进程去完成一个任务,它们的本质都相当于多个人去合伙完成一件事。.转载 2021-02-08 15:26:23 · 405 阅读 · 0 评论 -
C++ RAII机制
最近一直在碰到这个RAII机制,但是似乎没搞清楚这啥意思。现在大概明白了,C++的RAII机制就是类似于C#或者Java的GC机制,垃圾回收。合理的回收系统资源,避免程序员大量的写重复的delete代码来手动回收。转载于:https://blog.csdn.net/quinta_2018_01_09/article/details/93638251什么是RAII?RAII是Resource Acquisition Is Initialization(wiki上面翻译成 “资源获取就是初始化”)的转载 2021-02-07 17:37:05 · 283 阅读 · 0 评论 -
C++的左值和右值及C++11新特性:移动构造
本文转载于:https://blog.csdn.net/xuwqiang1994/article/details/79924310http://c.biancheng.net/view/7847.html确实有点恶心加难,可以多读几遍,多多思考~左值和右值:翻译至https://eli.thegreenplace.net/2011/12/15/understanding-lvalues-and-rvalues-in-c-and-c/C/C++编程中不是经常出现术语(左值)和rvalue转载 2021-02-06 10:45:12 · 411 阅读 · 0 评论 -
理解C++中的this指针
突然感觉this指针在C++中太常见了,但是从来没有很仔细的去思考过这个东西,(也可能是思考过但是忘了,没错,脑子就是这么不好用),所以来记录一下。参考博客:https://www.cnblogs.com/duwenxing/p/7410687.html一、什么是this指针思考:C++是如何给一个类对象分配内存的?看如下代码:#include <iostream>using namespace std;class Student{public: void原创 2020-12-28 11:50:49 · 809 阅读 · 1 评论 -
初探C++智能指针
见过太多用智能指针的代码了,并且自我感觉自己指针的基础还可以,模板类这块也在反复横跳,左右试探。。。所以来肝智能指针了。主要参考书籍还是C++ Primer第16章和第18章。智能指针三剑客:auto_ptr、unique_ptr、shared_ptr、weak_ptr。第一个是c++98提供的,后两个是c++11提供的,推荐用后三个。智能指针的作用简单粗暴点来讲就是封装指针成类,让系统帮你管理内存,自我感觉类似C#的GC机制。这篇博客假设读者已经有基本的指针、模板类知识储备。话不多说直接上代码,通原创 2020-12-26 11:49:16 · 154 阅读 · 0 评论 -
C++泛型编程之函数模板&类模板
在C++的门口绕来绕去,今天终于决定要搞起泛型编程了,毕竟也是C++的重要特性了。本篇博客参考来自:https://www.cnblogs.com/lifexy/p/8761325.htmlhttps://www.cnblogs.com/lifexy/p/8781525.htmlC++泛型编程之函数模板前言当我们想写个Swap()交换函数时,通常这样写:void Swap(int& a, int& b){ int c = a; a = b;原创 2020-12-23 10:40:39 · 361 阅读 · 0 评论 -
从c++的拷贝构造函数再次理解指针和内存
首先来看这个学习教程:https://www.runoob.com/cplusplus/cpp-copy-constructor.html拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。拷贝构造函数通常用于: 通过使用另一个同类型的对象来初始化新创建的对象。 复制对象把它作为参数传递给函数。 复制对象,并从函数返回这个对象。 如果在类中没有定义拷贝构造函数,编译器会自行定义一个。如果类带有指针变量,并有动态内存分配,则它必原创 2020-12-18 22:00:40 · 478 阅读 · 1 评论 -
Windows下的random_device
最近在调bug的时候,调了好久,发现时这个随机数函数出问题。win10、mingw32-g++、vscode、cmakerandom_device()目的就是产生生成真随机数,rand()函数用的线性同余法生成随机数,但是这个随机数实际上是一个伪随机数。然而randm_device()只在Linux下有效,在Windows下无效。测试如下:#include <iostrea...原创 2020-04-18 12:05:33 · 4203 阅读 · 4 评论 -
case switch之坑
老是忘记,所以记下来。case后面可以跟字符,如:case ‘A’:因为‘A’是有asc码的但是不能跟字符串!!!!!!!!!!原创 2019-12-31 10:43:28 · 489 阅读 · 0 评论 -
C++ 虚函数表解析
原文:https://blog.csdn.net/haoel/article/details/1948051前言C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术...转载 2019-12-28 16:45:11 · 303 阅读 · 0 评论 -
c++遍历目录下的所有文件
本博实现遍历指定目录下的所有文件(夹),以及输出指定类型的文件代码如下:#include <iostream>#include <io.h>#include <string>using namespace std;//遍历该目录下的所有文件(夹)void dir(string path){ long hFile = 0; struc...原创 2019-08-15 19:20:58 · 1452 阅读 · 0 评论 -
内存溢出和内存泄漏的区别
这个很重要,是开发中经常会遇到的问题。现在总结如下:内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少...原创 2019-07-17 22:09:46 · 7440 阅读 · 0 评论 -
c++ new和malloc的区别
本文属转载,原文博客链接:http://blog.csdn.net/linux_ever/article/details/50533149new与malloc的10点区别1. 申请的内存所在位置new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请...转载 2019-07-20 09:37:05 · 929 阅读 · 0 评论 -
抽象类和接口的区别
抽象类不能创建实例,它只能作为父类被继承。抽象类是从多个具体类中抽象出来的父类,它具有更高层次的抽象。从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为其子类的模板,从而避免了子类的随意性。(1) 抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法(2) 抽象类不能被实例化(3) 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽...转载 2019-07-18 08:49:22 · 508 阅读 · 0 评论 -
结构和联合
一、基础知识1.结构声明struct tag {member-list} variable-list;struct {int a;char b;float c;}x;这个声明创建了一个名叫x的变量,它包含三个成员:一个整数,一个字符,一个浮点数。struct{int a;char b;float c;}y[20],*z;这个声明创建了y和z。y是一个数组,它包含了20个结构。z是一个原创 2016-01-03 21:34:23 · 683 阅读 · 0 评论 -
动态内存分配
当一个数组被声明时,它所需要的内存在编译时就被分配。但是也可以通过使用动态内存分配在运行时为它分配内存。 一、为什么要使用动态内存分配? 在声明数组的时候,必须用一个编译时常量指定数组长度,但实际上,数组的长度常常在运行时才知道,这是由于它所需要的内存空间取决于输入数据。所以,有时候,我们开辟的空间可能不够用,这个时候,往往使用动态内存分配。 二、malloc和free以及calloc和rea原创 2016-01-05 14:57:52 · 581 阅读 · 0 评论 -
函数基本知识
函数的定义这里不做赘述。 一、return语句 当执行流到达函数定义的末尾时,函数就将返回。也就是说,执行流返回到函数被调用的地方。你可以从函数体的任何位置返回return,不一定要在函数的末尾。 return expression 表达式expression是可以选择的。如果函数无需向调用程序返回一个值,它就被省略。这类函数在绝大多数其他语言中被称为过程(procedure)。这些函数执行原创 2016-01-28 17:23:45 · 654 阅读 · 0 评论 -
数组基础
一、一维数组 1.1数组名 b[4]的类型是整型,那么b的类型又是什么呢?合乎逻辑的答案是它表示整个数组,但事实并非如此。 数组名的值是一个指针常量,也就是数组第1个元素的地址。它的类型取决于数组元素的类型,如果数组元素是int型的,那么数组名的类型是“指向int的常量指针”。 注意指针常量和常量指针的区别。举个例子: int a[10]; int b[10]; int *c; 表达原创 2016-02-01 16:16:00 · 828 阅读 · 0 评论 -
cin.get(), cin.getline(), getline()简单区别
一、 正常情况下,cin遇到空格结束读取,写个小例子: 举例:int main(){ string a; cin>>a; cout<<a<<endl;}二、cin.get()该函数有三种格式:无参,一参数,二参数 即cin.get(), cin.get(char ch), cin.get(array_name, Arsize)读取字符的情况: 输入结束条件:Ente原创 2016-03-16 21:22:19 · 3079 阅读 · 0 评论 -
输入函数scanf,gets,getchar简单区别测试
其实这些函数的具体应用和区别应该早就清楚了—- = =··· 但是鄙人实在是很foolish+shiftless。。所以每次遇到这些大同小异的函数们都会屁颠儿屁颠儿的找度娘。。今天实在是忍不了了。于是乎举起了keyboard和cute mouse,来把它们小区分一下。。可能会有些杂乱。。因为实在是。。。今天的讲述偏重于这些函数对空格,回车,TAB等的不同的测试。一、scanf() 一些基本的解释原创 2016-03-07 19:22:44 · 13331 阅读 · 7 评论 -
c++中的template理解
有必要记一下这种一眼看上去就很高级的用法。还是编程不够多。都没用过这个。相信用过c++的人,即便没用过,也肯定都听说过模板类这个词。嗨不巧了,今天讲的就是模板类。模板是c++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。因此可以说,模板是一种对类型进行参数化的工具。template<class ...原创 2019-04-10 21:14:56 · 50641 阅读 · 11 评论 -
#ifndef, #define, #endif 作用
本文属转载,原文博客如下:https://www.cnblogs.com/challenger-vip/p/3386819.html#ifndef它是if not define 的简写,是宏定义的一种,实际上确切的说,这应该是预处理功能三种(宏定义、文件包含、条件编译)中的一种----条件编译。在c语言中,对同一个变量或者函数进行多次声明是不会报错的。所以如果h文件里只是进行了声明工作...转载 2019-04-09 20:38:55 · 1300 阅读 · 0 评论 -
c++中的析构函数
印象中c++的析构函数是会自动调用。但是今天运行程序的时候,却没有进入到我写的析构函数,让我不禁怀疑,最终到底析构了没有。还是暗自调用了系统的析构。所以来记载一下析构的知识。以下属转载,原文博客地址:https://www.cnblogs.com/puyangsky/p/5319470.html一、定义1. 作用:对象消亡时,自动被调用,用来释放对象占用的空间2. 特点: (1)...转载 2019-04-09 20:55:46 · 17044 阅读 · 3 评论 -
c++ delete
在一个函数中定义了一个指针,需不需要在函数的末尾把该指针delete掉呢?c++中什么时候用delete呢?今天,突然在想这个问题。其实简单的可以归总为一句话: 在c++中,有new的地方必须有delete在c++中,new和delete是用来分...原创 2019-04-16 20:46:49 · 11272 阅读 · 0 评论 -
C++类对象和类指针的区别
好奇这个,所以参考了一些帖子,写下心得。一篇转载率较高的帖子:C++ 类对象和 指针的区别大佬都不贴结果。。。。所以这里我给出代码和结果:#include<iostream>using namespace std;class Test{public: int a; Test(){ a = 1; }}; int main...转载 2019-04-17 20:57:28 · 24705 阅读 · 11 评论 -
c++类static成员变量初始化
今天看到一个写法,竟然不知道这种写法。。。我是不是脑子完犊子了。。。在test.h文件中:class A{public:static int a; //静态数据成员声明}在test.cpp文件中:int A::a = 1; //静态数据成员的定义和初始化类中的静态成员变量的初始化必须在类外实现!!...原创 2019-05-10 23:12:38 · 26910 阅读 · 3 评论 -
C/C++ assert()函数用法总结
本博属转载,原文:http://www.cnblogs.com/lvchaoshun/p/7816288.html 该博已经写的非常好了。1. 简介assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行。原型定义:#include <assert.h>void assert( int expression );...转载 2019-05-22 09:44:57 · 1356 阅读 · 0 评论 -
xxx已经在obj中定义
唉。记性是一年不如一年了,这种错误一看就是儿科错误,为什么还在犯呢。。。为不长记性孩子的未来感到担忧。。。。很明显是重复定义了,一般在c++的项目开发时,菜鸡很容易出现这种错误。来看看常见的情况是什么:1、头文件重复包含;2、变量重复定义头文件重复包含1.我们知道在编译c或c++程序时候,编译器首先要对程序进行预处理,预处理其中一项工作便是将你源程序中#include的头文...转载 2019-07-11 14:57:32 · 30089 阅读 · 6 评论 -
字符串基础
一、定义 字符串就是一串零个或多个字符,并且以一个位模式为全0的NULL字节结尾。NULL字节是字符串的终止符,但它本身并不是字符串的一部分,所以字符串的长度并不包括NULL字节。二、函数1.长度函数:size_t strlen(char const *string);//size_t:无符号整数注意: if(strlen(a) >= strlen(y))… if(strlen(a) - s原创 2016-01-18 18:28:22 · 553 阅读 · 0 评论