
C-C++
文章平均质量分 71
Achilles.Wang
勿在浮沙筑高台
展开
-
彻底搞懂C++中string::npos
C++手册里面给出的定义是这样的,string::npos就是一个公有的静态的常量类型的成员变量。使用前需要包含头文件。(-1);这里的size_type就是类型size_t,size_t是一个无符号整形,那么-1也就是其最大值。原创 2024-01-03 11:23:32 · 4694 阅读 · 1 评论 -
string_view
或者std::string转换为string_view,准确的来说,从const std::string -> std::string_view是std::string的basic_string实现的,因为生成string_view的时候并没有进行深拷贝,所以这些隐式转换并没有消耗O(n)个内存。在算法复杂度上当传入const std::string时,转换成string_view只耗时了O(1),因为string里面直接可以去除指针的地址和长度,但是const char。原创 2023-03-16 20:44:47 · 497 阅读 · 0 评论 -
经典bloom算法(**布隆过滤器**)-levelDB拆分
通常判断一个元素是否在一个集合中,一般是将元素和所有集合中的元素进行对比,当前元素和集合中元素某个元素完全一致的时候,就认为当前元素在该集合中,这时常借助树、散列表、链表以及数组等先存储对应的元素,然后在进行对比。当hash函数生成的散列值发生碰撞时,就有可能发生两个不同的值生成的散列值缺失相同的,还有就是经过多个元素映射的布隆过滤器,某个值的散列值经过k的映射刚好全部为1,但是这些1是多个元素一起映射的结果,而不是由单个元素映射在布隆过滤器上的。不能在布隆过滤器中删除元素。原创 2022-12-02 11:41:28 · 738 阅读 · 0 评论 -
C++常见知识点总结-关键字作用的解释
C++常用关键字知识点总结原创 2022-06-05 12:07:07 · 654 阅读 · 0 评论 -
那些值得学习的C++框架和常用库
标准库C++标准库,包括了STL容器,算法和函数等。C++ Standard Library:是一系列类和函数的集合,使用核心语言编写,也是C++ISO自身标准的一部分。Standard Template Library:标准模板库C POSIX library : POSIX系统的C标准库规范ISO C++ Standards Committee :C++标准委员会框架C++通用框架和库Apache C++ Standard Library:是一系列算法,容器,迭代器和其他基本组件的原创 2022-03-14 11:34:13 · 7688 阅读 · 1 评论 -
万字长文带你一文读完Effective C++
Effective C++视C++为一个语言联邦STL Template C++ C Object-oriented C++一开始C++只是C加上一些面向对象特性,但是随着这个语言的成熟他变得更加无拘无束,接受不同于C with classes的各种观念、特性和编程战略。异常对函数的结构化带来了不同的做法,templates将我们带来到新的设计思考方式,STL则定义了一个前所未见的伸展性做法。今天C++已经是个多重范型编程语言,一个同时支持过程形式、面向对象形式、函数形式、泛型形式、元编程形式原创 2021-08-10 20:15:40 · 1228 阅读 · 0 评论 -
Implicit Move Must Go
Implicit Move Must Go– 转载出处Document Number: N3153=10-0143Document Date: 2010-10-17Author: Dave Abrahams dave@boostpro.comWhat is Implicit Move?In N2855, the authors described a surprising effect that occurs when “legacy” C++03 types are combined in t原创 2021-07-22 09:06:34 · 519 阅读 · 0 评论 -
一文读懂什么是C++移动语义《一》
C++ 右值引用block://6984617523950616580?from=docs_block&id=ce31003ceb5efb1f7a7c0a5fbe6cb60191627a38右值的引入作为在C++11中引入的一个类型,容易引起误解的是,右值引用并没有说明引入是为了什么,是为了解决什么问题。右值引用可以解决以下问题实现移动语义完美转发左值和右值来自原先的C语言,左值可以出现在赋值左边或者右边,而右值只能出现在赋值的右边int a = 42;int b = 4原创 2021-07-15 23:07:56 · 318 阅读 · 2 评论 -
EffectiveC++编程的50个建议
视C++为一个语言联邦一开始C++只是C加上一些面向对象特性,但是随着这个语言的成熟他变得更加无拘无束,接受不同于C with classes的各种观念、特性和编程战略。异常对函数的结构化带来了不同的做法,templates将我们带来到新的设计思考方式,STL则定义了一个前所未见的伸展性做法。今天C++已经是个多重范型编程语言,一个同时支持过程形式、面向对象形式、函数形式、泛型形式、元编程形式的语言。这些能力和弹性使C++成为一个无可匹敌的工具,因此、将C++视为一个语言联邦。尽量以cosnt、enu原创 2021-06-14 22:54:29 · 338 阅读 · 2 评论 -
C++优化热点语句
优化热点语句提前计算固定值先观察下面的性能测试代码:static void find_blank(benchmark::State& state) { for (auto _: state) { char s[] = "This string has many space (0x20) chars. "; for (size_t i = 0; i < strlen(s); ++i) if (s[i] == ' ')原创 2021-05-31 23:26:56 · 491 阅读 · 1 评论 -
const函数和const对象
const函数和const对象const修饰函数时,表明该函数不能修改成员变量const修饰对象时,表明该对象不能引用成员中非const的成员函数#include <iostream>#include <mutex>using namespace std;/* * 1. const成员函数不能修改成员变量 * 2. const对象不能引用非const成员函数 * */class WatchData {public: WatchData() =原创 2021-05-23 21:42:39 · 346 阅读 · 0 评论 -
gtest-断言
断言ASSERT_*系列的断言当检查失败时,退出当前函数EXPECT_*系列的断言当检查失败时,继续向下执行布尔值的检查Fatal assertionNonfatal assertionVerifiesASSERT_TRUE(condition);EXPECT_TRUE(condition);condition is trueASSERT_FALSE(condition);EXPECT_FALSE(condition);condition is false原创 2021-05-19 23:04:04 · 952 阅读 · 0 评论 -
C++异常处理
github代码提交记录异常处理机制若是有异常则通过throw操作创建一个异常对象并抛掷将可能抛出异常的程序段嵌入到try块之中,控制通过正常的顺序执行到try语句,然后执行try块内的保护段如果在保护段执行期间没有引起异常,那么跟在try块后的catch子句就不执行,程序从try块后跟随者最后一个catch子句后面的语句继续执行下去。catch子句按其在try块后出现的顺序被检查,匹配的catch子句将捕获并处理异常如果匹配的处理器未找到,则执行函数teminate将自动调用,其缺省功能是调原创 2021-04-25 17:45:02 · 661 阅读 · 2 评论 -
设计一个函数能够取出字符串中指定的字符
看到这时我们很容易的想到直接使用memmove,在找到了指定的字符之后将后面的字符向前移动,使用了memmove这个函数内部也是将后面的字符挨个复制到指定的位置。如果遇上testssss要是向去除字符串中的t,就不可避免的得将estssss挨个向前移动一个位置之后,在将ssss挨个向前移动一个位置。如果你把这件事情想想成挑选苹果,将好的苹果放到自己的购物篮,要是使用上述说的方式那你就是一直将所有苹果拿走,然后挨个放到下个果篮,如果遇到坏的就这样来一次,一直到所有的苹果都是查看结束。可以想象正常我们肯定不原创 2021-03-14 18:04:41 · 429 阅读 · 0 评论 -
使用malloc初始化一个类和new初始化一个类的区别
new出来对象会调用对象的构造函数,但是malloc出来的对象是没有调用构造函数的,因此下面使用malloc初始化的对象私有变量是没有经过构造函数初始化的但是通过new出来的对象,对象已经经过构造函数的初始化。//// Created by andrew on 2021/3/8.//#include <iostream>#include <string>using namespace std;class MallocClass {private: str原创 2021-03-08 22:40:13 · 2274 阅读 · 0 评论 -
八大编程知名编程语言或系统的发展简史
知名编程语言或系统的发展简史一、B语言B语言之父:Ken Thompson(肯.汤普森)。B语言是贝尔实验室开发的一种通用的程序设计语言,它是于1969年前后Ken Thompson(肯.汤普森)在Dennis Ritchie丹尼斯.里奇(Dennis Ritchie)的支持下设计出来。该语言得名于汤姆森的妻子Bonnie,它是一门开发于60年代中期的语言,现在使用者已经很少了。二、C语言C语言之父:Dennis Ritchie(丹尼斯·里奇)。美国著名计算机专家、C语言发明人、UNIX之父。在1原创 2020-10-14 22:55:31 · 1962 阅读 · 0 评论 -
C++纯虚函数和抽象类
基本概念纯虚函数和抽象类纯虚函数是一个在基类中说明的虚函数,但是在基类中没有定义,要求任何派生类都定义自己的版本纯虚函数为个派生类提供一个公共界面(接口的封装和设计、软件模块功能的划分)纯虚函数定义形式: virtual 类型 函数名(参数表)=0;一个具有纯虚函数的基类称为抽象类抽象类的点:抽象类不能建立对象可以声明抽象类的指针抽象类不能作为函数的返回类型抽象类不能作为函数的参数可以声明抽象类的引用绝大多数面向对象语言都不支持多继承绝大多数面向对象语言都支持接口的概念原创 2020-09-26 23:32:03 · 168 阅读 · 0 评论 -
C++多态
C/C++是静态编译语言。在编译时,编译器自动根据指针的类型判断执行的是一个什么样的对象在编译此函数的时候,编译器可能不知道指针究竟指向了什么编译器没有理由报错于是,编译器认为安全的做法是编译到父类的print函数,因为父类和子类肯定都有相同的print函数如下:#include <iostream>using namespace std;class Parent{public: Parent(int a) { this->a = a; cout&l原创 2020-09-26 22:14:57 · 328 阅读 · 0 评论 -
C++中的虚继承
如果一个派生类从多个基类派生,而这些基类又有一个共同的基类,则在对该基类中声明的名字进行访问时,可能产生二义性如果一个派生类从多个基类派生,而这些基类又有一个共同的基类,则在对该基类中声明的名字进行访问时,可能产生二义性如果在多条继承路径上有一个公共的基类,那么在继承路径的某处汇合点,这个公共基类就会在派生类的对象中产生多个基类子对象#include <iostream>using namespace std;class B{private: /* data */原创 2020-09-26 00:17:48 · 254 阅读 · 0 评论 -
C++字符串处理操作符重载
&& || 不能进行运算符重载,因为运算符重载不能进行截断操作截断操作就是当 a || b,a为真的时候就不会再判断b了,但是运算符重载不能达到这效果。类定义// 类定义#include <iostream>using namespace std;//c中没有字符串 字符串类(c风格的字符串)//空串 ""class MyString{ friend ostream& operator<<(ostream &out, MyS原创 2020-09-23 00:16:10 · 440 阅读 · 0 评论 -
C++友元函数
类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类,在这种情况下,整个类及其所有成员都是友元。如果要声明函数为一个类的友元,需要在类定义中该函数原型前使用关键字 friend,如下所示:class Box{ double width;public: double length; f原创 2020-09-06 23:03:35 · 206 阅读 · 0 评论 -
copy构造函数使用深copy
=操作符的默认copy构造函数是浅copy,要是想使用深copy需要编写copy构造函数,编写深copy构造函数的形式如下,调用方式除了显示的调用,当首次定义对象,并使用=进行对象初始化的时候也会调用该copy构造函数 Array a2 = a1;Array::Array(const Array& obj){ this->m_length = obj.m_length; this->m_space = new int[this->m_length]; //分配内存空原创 2020-09-06 17:20:35 · 220 阅读 · 0 评论 -
C++成员函数中的const修饰符
在一些C++源码中经常见到const修饰的函数,这里的const与放的位置无关,也就是下面三种写法是等效的,只不过通常使用第一种写法,可以编写函数进行测试,这里的const虽然写在了函数的位置,其实是用来修饰隐藏的this指针,因为此时this指针是指向的是对象,也就是说this指向的对象不能被修改void OpVar(int a, int b) const //1void const OpVar(int a, int b) //2const void OpVar(int a, int原创 2020-09-06 10:46:25 · 325 阅读 · 0 评论 -
c++类的大小
C++类对象中的成员变量和成员函数是分开存储的成员变量:普通成员变量:存储于对象中,与 struct 变量有相同的内存布局和字节对齐方式静态成员变量:存储于全局数据区中成员函数:存储于代码段中。class C2{public: int i; int j; int k; static int m; //4 静态成员变量 不会放到对象里面public: int getK() const { return k; } //4 void setK(int val) { k = v原创 2020-09-05 19:22:57 · 242 阅读 · 0 评论 -
面向对象的C语言编程-DynamicLinkageGenericFunctions--C语言中的偷梁换柱
文章目录`DynamicLinkageGenericFunctions`Constructors and Destructors方法、信息、类和对象`new``delete``clone``differ``sizeOf``main`总结`TIPS`DynamicLinkageGenericFunctions代码仓库[代码仓库]:https://github.com/zzu-andrew/linux-sys/blob/6c19498a436902120eec7e08c18e4a74d04dafa2 b+原创 2020-06-12 00:00:28 · 332 阅读 · 1 评论 -
面向对象的C语言编程--如何取结构体指针中的指针
* (const struct Class **) p = class;#include <stdio.h>#include <stdlib.h>#include <assert.h>#include <string.h>#include <stdarg.h>void test(void);struct String { const void * class; /* must be first */ char * text;原创 2020-05-31 23:03:55 · 1636 阅读 · 1 评论 -
通过清华镜像网站下载eclipse
使用官网下载eclipse的速度实在让人受不了,可以使用清华镜像网站下载eclipse镜像网站原创 2020-05-17 17:15:23 · 14517 阅读 · 4 评论 -
GNU-as汇编
GNU as汇编在编译C语言程序时,GNU gcc编译器会首先输出一个作为中间结果的as汇编语言文件,然后gcc回调用as汇编器把这个临时汇编语言程序编译成目标文件。即实际上as汇编器最初是用于专门汇编gcc产生的中间汇编语言程序的,而非作为一个独立的汇编器使用(这也就是为什么你只调用gcc就能将你的c语言代码编译成可执行文件,因为在需要的时候gcc会调用汇编器的)。编译as汇编语言程序使用as汇编器编译一个as汇编语言程序的基本命令行格式如下:as [option] [-o objfile] [s原创 2020-05-17 16:54:10 · 1150 阅读 · 0 评论 -
小s结尾与大S结尾的汇编语言差异
汇编器预处理as汇编器会对汇编语言进行简单的预处理,该预处理功能会调整并删除多余的 空格字符和制表符;删除所有注释语句并且使用单个空格或者一些换行符替换它们;把字符常数转换为对应的数值。但是该预处理功能不会对宏定义进行处理,也没有处理包含文件的功能。如果需要这方面的功能,那么就可以让汇编语言程序使用大写的后缀.S让as使用gcc的CPP预处理功能。...原创 2020-05-10 18:54:08 · 432 阅读 · 0 评论 -
C语言必知必会-strtok赞歌
strtok的赞歌标记解析(Tokenizing)是最简单也是最常见的解析问题,也就是根据分隔符把一个字符串分割为几个部分。这个定义覆盖了所有这种类型的任务。根据空白分隔符(例如" \t\n\r"之一)分割单词。假设有个像"/usr/include:/usr/local/include:."这样的路径,在冒号处将其分开,形成单独的目录。根据一个简单的换行分隔符"\n"把一个字符串分割为不同的行。...原创 2020-04-19 00:17:34 · 452 阅读 · 0 评论 -
C语言设计新思维分享
没有任何套路,直接获取资源C语言已经有几十年的历史了,经过长时间的发展和普及,C语言的应用场景也有了很大的变化,一些的老的观念已经不在适用,在这里给大家推荐一本讲C语言特别好的书,《C语言设计新思维》,没有任何套路直接下发领取。书中展现了传统C语言教科书所不具备的最新的相关技术,如果你有一定的C语言基础并且迫切的想提高自己的C语言编程能力,那么推荐你看下。C语言设计新思维...原创 2020-04-18 21:57:02 · 364 阅读 · 0 评论 -
C语言库自带的二分查找函数bsearch函数的使用示例
bsearch使用二分查找,查找一个被排序过的数组依赖头文件#include <stdlib.h> void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, ...原创 2020-04-13 22:53:55 · 2550 阅读 · 0 评论 -
linux中以A开头的函数使用方式历程及详解
A开头的Linux C函数abort异常终止程序abort函数在调用的时候,会触发SIGABRT信号#include <stdlib.h>#include <signal.h>#include <stdio.h>#include <unistd.h>static void signalHandler(int sig);// 信号...原创 2020-04-12 16:54:36 · 583 阅读 · 0 评论 -
一招让你彻底掌握C语言中运用宏以及#与##的妙用
学习C语言,特别是阅读linux源码的时候,大家经常遇到很多的宏定义,有简单的,当然也有很复杂的。有事一个宏定义甚至有几十行之多,遇到这种宏定义的大家基本上是一脸懵逼,不知所措,其实想复杂的宏定义没有去深究的价值,简短的才有深究的价值。但是你不理解这些长的宏定义就无法接着理解接下来的代码,今天这里就叫大家一个我经常使用的方法,来理解些宏定义,将你需要理解的宏定义,新建一个.c文件,比如test...原创 2020-04-07 00:01:31 · 337 阅读 · 0 评论 -
C语言高级技巧-在Makefile中引用你的头文件
在Makefile中添加头文代码仓库:Makefile中添加头文件引用我们常这样写C程序:#inlcude <stdio.h>int main(int argc, char *argv[]){ printf("Hello WOrld\n"); return 0;}如果你的程序是工程性质的,或者所有的程序都使用同一个头文件,那你没有使用在Make...原创 2020-04-06 23:22:43 · 3791 阅读 · 2 评论 -
enum-使用宏管理你的枚举型数据
高级枚举型定义实现C源文件#include <sys/stat.h>#include <fcntl.h>#include <stdio.h>#include <string.h>#include <unistd.h>#include <stdlib.h>/*实现原理说明:首先在枚举型结构体中定义宏定义 #d...原创 2019-12-08 22:58:24 · 925 阅读 · 0 评论 -
STM32串口中断
RXNE(读数据寄存器非空),当该位被置 1 的时候,就是提示已经有数据被接收到了,并且可以读出来了。这时候我们要做的就是尽快去读取 USART_DR,通过读 USART_DR 可以将该位清零,也可以向该位写 0,直接清除。 TC (发送完成),当该位被置位的时候,表示 USART_DR 内的数据已经被发送完成了。如果设置了这个位的中断,则会产生中断。该位也有两种清零方式:1)读 USART_SR原创 2016-12-21 12:21:05 · 1703 阅读 · 0 评论 -
STM32串口学习总结(经典)
主函数代码如下:#include "led.h"#include "delay.h"#include "sys.h"#include "usart.h"#include "arduino.h"//ALIENTEK Mini STM32¿ª·¢°å·¶Àý´úÂë3//´®¿ÚʵÑé //¼¼ÊõÖ§³Ö£ºwww.openedv.com//¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼Ó原创 2016-12-22 19:56:01 · 1587 阅读 · 0 评论 -
stm32中断优先级分组
STM32中断优先级和开关总中断一,中断优先级:STM32(Cortex-M3)中的优先级概念STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。转载 2016-12-27 08:29:06 · 5677 阅读 · 1 评论 -
Ascii编码
原文网址:http://www.fmddlmyy.cn/text6.html 参考:https://www.python.org/dev/peps/pep-0263/ ASCII表格:http://www.ascii-code.com/谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词这是一篇程序员写给程序员的趣味读物。所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知转载 2017-01-04 14:58:13 · 511 阅读 · 0 评论