![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 64
JustWei_
这个作者很懒,什么都没留下…
展开
-
面试题 17.10. 主要元素
title: 面试题 17.10. 主要元素date: 2021-07-10 17:38:57tags: [leetcode]面试题 17.10. 主要元素数组中占比超过一半的元素称之为主要元素。给你一个整数数组,找出其中的主要元素。若没有,返回 -1 。请设计时间复杂度为 O(N) 、空间复杂度为 O(1) 的解决方案。示例 1:输入:[1,2,5,9,5,9,5,5,5]输出:5示例 2:输入:[3,2]输出:-1示例 3:输入:[2,2,1,1,1,2,2]输出:2.原创 2021-07-10 17:42:29 · 72 阅读 · 0 评论 -
mmap 与 shm 的区别
title: mmap 与 shm 的区别date: 2021-07-10 16:21:47tags: [C++, liunx]mmap 与 shm 的区别mmap(memory mapping,内存映射)实现原理建立虚拟空间一段区域和磁盘上的文件的映射。当访问虚拟空间中该区域时,通过 MMU,得到该区域对应的物理地址,OS 发现该区域没有数据,故产生缺页中断。OS 从磁盘中读取相应页的数据直接 copy 到物理内存中。对于传统的 read 系统调用来说,他们需要将磁盘中的文件先 cop.转载 2021-07-10 16:53:21 · 178 阅读 · 0 评论 -
shm
title: shmdate: 2021-07-04 22:13:34tags: [C++, linux]shmshm 基础概念内核开辟一片内存区域,然后多个用户进程可以将这片区域映射到它们自己的地址空间中进行读写。shm 内存映射原理共享内存大概由四个操作组成:申请查询内存程序连接映射内存程序断开映射内存管理共享内存shmget 函数用来申请查询内存#include <sys/ipc.h>#include <sys/shm.h>int shm.原创 2021-07-10 16:20:09 · 143 阅读 · 0 评论 -
mmap
title: mmapdate: 2021-07-03 00:52:17tags: [Linux, C++]mmapmmap 基础概念mmap 是一种磁盘文件映射的方法。即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用 read,write 等系统调用函数。相反,内核空间对这段区域的修改也直接反.原创 2021-07-04 22:04:26 · 269 阅读 · 0 评论 -
CMake 模板
title: CMake 模板date: 2021-06-29 18:40:15tags: [C++, CMake]CMake 模板此模板针对于小型的 C/C++ 项目使用。我们开发的 C/C++ 项目一般的文件树结构为:.|-- main.cpp`-- src |-- hello.cpp `-- hello.h添加完CMakeLists.txt后,长这样:.|-- CMakeLists.txt|-- main.cpp`-- src |-- CM.原创 2021-06-30 15:42:31 · 201 阅读 · 0 评论 -
CMake 教程
title: CMake 教程date: 2021-06-28 19:11:35tags: [C++, CMake]CMake 教程本文翻译自CMake 教程。练习素材下载地址或官方github。概述CMake Tutorial提供了一个分步的指南(一步步的完善一个CMake工程),涵盖了常见的CMake能够解决的编译系统的问题。在一个示例工程中查看各个主题如何协同工作对学习CMake的使用非常有帮助。指南中使用的源码在CMake源码树的Help/guide/tutorial目录下,每个步.翻译 2021-06-29 16:47:22 · 310 阅读 · 1 评论 -
宏
title: 宏date: 2021-06-21 14:52:01tags: [C++]宏宏中包含特殊符号分为几种:#,##,\字符串化操作符(#)在一个宏中的参数前面使用一个#,预处理器会把这个参数转换为一个字符数组,换言之就是:#是字符串化的意思,出现在宏定义中的#是把跟在后面的参数转换成一个字符串。注意:其只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。例如:#define exp(s) printf("test s is:%s\n",s)#define exp.转载 2021-06-22 01:18:26 · 88 阅读 · 0 评论 -
引用与指针
title: 引用与指针date: 2021-06-21 12:08:23tags: [C++]引用与指针引用指针必须初始化可以不初始化不能为空可以为空不能更换目标可以更换目标引用必须初始化,而指针可以不初始化。int &r; //不合法,没有初始化引用int *p; //合法,但p为野指针,使用需要小心引用不能为空,而指针可以为空。由于引用不能为空,所以我们在使用引用的时候不需要测试其合法性,而在使用指针的时候需.转载 2021-06-21 14:51:04 · 164 阅读 · 0 评论 -
decltype
title: decltypedate: 2021-06-21 11:53:14tags: [C++]decltype基本使用decltype的语法是:decltype (expression)这里的括号是必不可少的,decltype 的作用是查询表达式的类型,因此,上面语句的效果是,返回 expression 表达式的类型。注意,decltype 仅仅查询表达式的类型,并不会对表达式进行求值。推导出表达式类型int i = 4;decltype(i) a; //推导结果为int。.转载 2021-06-21 12:07:40 · 80 阅读 · 0 评论 -
enum
title: enumdate: 2021-06-21 11:25:27tags: [C++]enum传统行为枚举有如下问题:作用域不受限,,会容易引起命名冲突。例如下面无法编译通过的:#include <iostream>using namespace std;enum Color {RED,BLUE};enum Feeling {EXCITED,BLUE};int main() { return 0;}会隐式转换为 int。用来表征枚举变.转载 2021-06-21 11:52:24 · 127 阅读 · 0 评论 -
:: 范围解析运算符
title: ‘:: 范围解析运算符’date: 2021-06-21 11:19:45tags::: 范围解析运算符全局作用域符(::name):用于类型名称(类、类成员、成员函数、变量等)前,表示作用域为全局命名空间。类作用域符(class::name):用于表示指定类型的作用域范围是具体某个类的。命名空间作用域符(namespace::name):用于表示指定类型的作用域范围是具体某个命名空间的。...转载 2021-06-21 11:24:37 · 100 阅读 · 0 评论 -
union
title: uniondate: 2021-06-20 20:21:24tags: [C++]union联合(union)是一种节省空间的特殊的类,一个 union 可以有多个数据成员,但是在任意时刻只有一个数据成员可以有值。当某个成员被赋值后其他成员变为未定义状态。union 有如下特点:默认访问控制符为 public。可以含有构造函数、析构函数,不能含有虚函数。不能含有引用类型的成员。不能继承自其他类,不能作为基类。匿名 union 在定义所在作用域可直接访问 union 成.转载 2021-06-21 01:42:00 · 95 阅读 · 0 评论 -
using
title: usingdate: 2021-06-20 23:16:28tags: [C++]using基本使用局部与全局 using,具体操作与使用见下面案例:#include <iostream>#define isNs1 1//#define isGlobal 2using namespace std;void func(){ cout << "::func" << endl;}namespace ns1 { voi.转载 2021-06-21 01:40:40 · 89 阅读 · 0 评论 -
friend
title: frienddate: 2021-06-20 22:38:21tags:friend概述友元提供了一种普通函数或者类成员函数访问另一个类中的私有或保护成员的机制。友元函数:普通函数可以访问某个类中的 private 和 protected 成员。友元类:A 类中的成员函数可以访问 B 类中的 private 和 protected 成员。优点:提高了程序的运行效率。缺点:破坏了类的封装性和数据的透明性。总结:破坏封装性。友元关系不可传递。友元关系的单向性。.转载 2021-06-21 01:41:03 · 80 阅读 · 0 评论 -
explicit
title: explicitdate: 2021-06-20 21:03:36tags: [C++]explicitexplicit 修饰构造函数时,可以防止隐式转换和复制初始化。explicit 修饰转换函数时,可以防止隐式转换,但按语境转换除外。cppreference指定构造函数或转换函数 (C++11起)为显式,即它不能用于隐式转换和复制初始化.explicit 指定符可以与常量表达式一同使用。当且仅当该常量表达式求值为 true 才为显式。(C++20起)Effec.转载 2021-06-21 01:41:28 · 205 阅读 · 0 评论 -
C实现C++面向对象的特性
title: C实现C++面向对象的特性date: 2021-06-20 20:26:37tags: [C++]C实现C++面向对象的特性C++ 实现案例C++ 中的多态:在 C++ 中会维护一张虚函数表,根据赋值兼容规则,我们知道父类的指针或者引用是可以指向子类对象的。如果一个父类的指针或者引用调用父类的虚函数则该父类的指针会在自己的虚函数表中查找自己的函数地址,如果该父类对象的指针或者引用指向的是子类的对象,而且该子类已经重写了父类的虚函数,则该指针会调用子类的已经重写的虚函数。#in.转载 2021-06-21 01:41:36 · 264 阅读 · 0 评论 -
struct与class区别
title: struct与class区别date: 2021-06-20 20:04:16tags: [C++]struct 与 class 区别struct 更适合看成是一个数据结构的实现体,class 更适合看成是一个对象的实现体。最本质的一个区别就是默认的访问控制,默认的继承访问权限,struct 是 public 的,class 是 private 的。struct 作为数据结构的实现体,它默认的数据访问控制是 public 的,而 class 作为对象的实现体,它默认.转载 2021-06-21 01:42:08 · 78 阅读 · 0 评论 -
struct
title: structdate: 2021-06-20 19:39:59tags:structC 中 structC 的结构体不能继承(没有这一概念)。在 C 中定义结构体变量,如果使用了下面定义必须加 struct。在 C 结构体声明中不能使用 C++ 访问修饰符,如:public、protected、private 而在 C++ 中可以使用。在 C 中 struct 只单纯的用作数据的复合类型,也就是说,在结构体声明中只能将数据成员放在里面,而不能将函数放在里面。若结构体的名.转载 2021-06-20 20:03:25 · 104 阅读 · 0 评论 -
extern
title: externdate: 2021-06-20 17:07:22tags: [C++]externC++ 与 C 编译区别在 C++ 中常在头文件见到 extern “C” 修饰函数,那有什么作用呢? 是用于C++链接在C语言模块中定义的函数。C++ 虽然兼容 C,但 C++ 文件中函数编译后生成的符号与 C 语言生成的不同。因为 C++ 支持函数重载,C++ 函数编译后生成的符号带有函数参数类型的信息,而 C 则没有。例如int add(int a, int b)函数经过 C.转载 2021-06-20 19:39:19 · 57 阅读 · 0 评论 -
Bit field
title: Bit fielddate: 2021-06-20 15:17:46tags: [C++]Bit fieldBit field 是什么?位域或位段(Bit field)为一种数据结构,可以把数据以位的形式紧凑的储存,并允许程序员对此结构的位进行操作。位域在内存中的布局是与机器有关的。取地址运算符(&)不能作用于位域,任何指针都无法指向类的位域。位域的类型必须是整型或枚举类型,带符号类型中的位域的行为将因具体实现而定。位域的好处可以很方便的访问一个整数值的部.转载 2021-06-20 17:06:09 · 157 阅读 · 0 评论 -
assert
title: assertdate: 2021-06-20 15:06:13tags: [C++]assert断言案例断言,是宏,而非函数。assert 宏的原型定义在 <assert.h>(C)、<cassert>(C++)中。assert 的作用是如果它的条件返回错误,则终止程序执行。可以通过定义 NDEBUG 来关闭 assert,但是需要在源代码的开头,#include <assert.h> 之前。void assert(int expres.转载 2021-06-20 15:16:41 · 97 阅读 · 0 评论 -
volatile
title: volatiledate: 2021-06-19 23:43:42tags: [C++]volatilevolatile被 volatile 修饰的变量,在对其进行读写操作时,会引发一些可观测的副作用。而这些可观测的副作用,是由程序之外的因素决定的。volatile应用并行设备的硬件寄存器。假设要对一个设备进行初始化,此设备的某一个寄存器为 0xff800000。unsigned int* output = (unsigned int*)0xff800000; //定义.转载 2021-06-20 15:05:24 · 88 阅读 · 0 评论 -
virtual
title: virtualdate: 2021-06-19 21:44:47tags:virtual虚函数与运行多态虚函数是动态绑定的,虚函数的调用取决于指向或者引用的对象的类型,而不是指针或者引用自身的类型。class Employee{public: virtual void raiseSalary() { cout << 0 << endl; } virtual void promote() { /.原创 2021-06-19 23:42:39 · 164 阅读 · 0 评论 -
vptr_vtable
title: vptr_vtabledate: 2021-06-19 19:37:12tags: [C++]vptr_vtable基础理论为了实现虚函数,C++ 使用一种称为虚拟表的特殊形式的动态绑定。该虚拟表是用于解决在动态绑定方式的函数调用函数的查找表。虚拟表有时会使用其他名称,例如 vtable,虚函数表,虚方法表或调度表。虚拟表实际上非常简单,虽然用文字描述有点复杂。首先,每个使用虚函数的类(或者从使用虚函数的类派生)都有自己的虚拟表。该表只是编译器在编译时设置的静态数组。虚拟表包含.原创 2021-06-19 23:10:32 · 159 阅读 · 0 评论 -
纯虚函数与抽象类
title: 纯虚函数与抽象类date: 2021-06-19 16:56:53tags: [C++]纯虚函数与抽象类纯虚函数与抽象类纯虚函数:用 virtual 声明且赋值 0 的没有函数体的函数。抽象类:包含纯虚函数的类。抽象类的使用抽象类只能作为基类来派生新类使用,不能创建抽象类的对象。抽象类的指针和引用可以指向由抽象类派生出来的类的对象。// 抽象类Class A {public: virtual void show() = 0; // 纯虚函数}; .原创 2021-06-19 19:34:38 · 203 阅读 · 0 评论 -
sizeof
title: sizeofdate: 2021-06-19 16:23:42tags: [C++]sizeof类大小计算空类的大小为 1 字节一个类中,虚函数本身、成员函数(包括静态与非静态)和静态数据成员都是不占用类对象的存储空间。对于包含虚函数的类,不管有多少个虚函数,只有一个虚指针 vptr 的大小。普通继承,派生类继承了所有基类的函数与成员,要按照字节对齐来计算大小虚函数继承,不管是单继承还是多继承,都是继承了基类的 vptr。(32 位操作系统 4 字节,64 位操作系统 .原创 2021-06-19 16:47:00 · 71 阅读 · 0 评论 -
inline
title: inlinedate: 2021-06-19 14:26:14tags: [C++]inline类中内联头文件中声明方法class A{public: //类中定义了的函数是隐式内联函数,声明要想成为内联函数,必须在实现处(定义处)加inline关键字。 void Foo(int x,int y) // 定义即隐式内联函数 { }; void f1(int x); // 声明后,要想成为内联函数,必须在定义处加inline关.转载 2021-06-19 15:04:49 · 60 阅读 · 0 评论 -
this
title: thisdate: 2021-06-19 13:59:43tags: [C++]thisthis 指针的用处一个对象的 this 指针并不是对象本身的一部分,不会影响 sizeof(对象) 的结果。this 作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。也就是说,即使你没有写上 this 指针,编译器在编译的时候也是加上 this 的,它作为非静态成员函数的隐含形参,对各成员的访问均通过 this .转载 2021-06-19 14:22:12 · 116 阅读 · 0 评论 -
static
title: staticdate: 2021-06-19 13:34:49tags: [C++]static静态变量: 函数中的变量,类中的变量。静态类的成员: 类对象和类中的函数。静态变量函数中的静态变量当变量声明为 static 时,空间将在程序的生命周期内分配。即使多次调用该变量,静态变量的空间也只分配一次,前一次调用中的变量值通过下一次函数调用传递。这对于在 C/C ++ 需要存储先前函数状态的任何其他应用程序非常有用。#include <iostream> #.转载 2021-06-19 13:55:22 · 615 阅读 · 0 评论 -
const
title: constdate: 2021-06-19 10:22:11tags: [C++]constconst 含义常类型是指使用类型修饰符 const 修饰的类型,常类型的变量、对象或指针的值是不能被更新的。const 作用可以定义常量const int a=100;类型检查const 定义的变量只有类型为整数或枚举,且以常量表达式初始化时才能作为常量表达式,其他情况下它只是一个 const 限定的变量,不要将与常量混淆。防止修改,起保护作用,增加程序健壮性.原创 2021-06-19 13:25:50 · 236 阅读 · 0 评论 -
C++ 防卫式声明
C++ 防卫式声明C++ 防卫式声明有两种方式:#ifndef XXX#define XXX#endif#pragma once第一种方式第一种方式依赖于宏命名不能冲突,这不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件不会被不小心同时包含。当然,缺点就是如果不同头文件的宏命名相同,就会导致头文件明明存在,编译器却硬说找不到声明的状况。第二种方式使用第一种方式,同一个文件不会被包含多次。注意这里所说的同一个文件是指物理上的一个文件,而不是指内容相同的两原创 2021-05-29 17:17:58 · 188 阅读 · 0 评论 -
C++ 拷贝构造函数、移动构造函数、拷贝赋值函数、移动赋值函数
C++ 拷贝构造函数、移动构造函数、拷贝赋值函数、移动赋值函数这是个类的代码,我用这个类来讲诉 C++ 拷贝构造函数、移动构造函数、拷贝赋值函数、移动赋值函数的使用。例子:Speaker.h:#pragma once#ifndef _SPEAKER_#define _SPEAKER_#include <string>#include <vector>using namespace std;//支持不同类型的成绩template<typename T>原创 2021-05-29 17:01:43 · 227 阅读 · 0 评论 -
C++ algorithm Binary search
C++ algorithm Binary search这一部分是有关于查找的。使用的前提是查找范围内的元素有序。这些函数的参数列表都相同,但是返回值有些许的不同。函数名函数功能lower_bound查找范围内第一个大于等于 val 的元素upper_bound查找范围内第一个大于 val 的元素equal_range返回包含范围 [first,last) 中元素等价于 val 的边界。即 [lower_bound, upper_bound)binary_se原创 2021-05-21 23:50:06 · 150 阅读 · 0 评论 -
C++ tuple
C++ tupletuple 是将不同类型的元素打包在一个对象中的对象,就像 pair 对象对元素对所做的那样。从概念上讲,tuple 类似于普通的旧数据结构(类似于 c 的结构体),但它没有指定数据成员,而是按 tuple 中的顺序访问元素。tuple 中特定元素的选择是在模板实例化时完成的,因此,必须在编译时使用 get 和 tie 等辅助函数来指定。tuple 与 pair (在头文件 <utility> 中定义)密切相关:元组可以由 pair 构造,pair 可以作为 tuple原创 2021-05-21 20:44:05 · 176 阅读 · 0 评论 -
C++ initializer_list
C++ initializer_list这是一个很神奇的东西。有了 initializer_list 可以简化很多操作。initializer_list 是一个 const T 类型的元素列表。initializer_list 是一个用大括号括起来的以逗号分隔的元素列表。vector<int> a{ 1,2,3,4,5 };但是请注意,这个模板类并没有隐式定义,想访问它必须 include 头文件 <initializer_list>,即使该类型是隐式使用的。#inc原创 2021-05-21 12:36:10 · 198 阅读 · 0 评论 -
C++ algorithm Sorting
C++ algorithm sorting这一部分是有关于排序的。函数名函数功能sort对范围内的元素进行排序(不稳定)stable_sort对范围内的元素进行排序(稳定)partial_sort排序部分范围内的元素partial_sort_copy复制并排序部分范围内的元素is_sorted检查范围是否已排序is_sorted_until查找范围内的第一个未排序元素nth_element对范围内的元素进行排序(特殊)sort原创 2021-05-21 00:15:01 · 200 阅读 · 0 评论 -
iterator 的一些特殊用法
iterator 的一些特殊用法本文章基于 VS2019 创作。std::iterator 这是一个基类模板,可用于从其派生迭代器类。它不是迭代器类,并且不提供迭代器应具有的任何功能。该基类仅提供了一些构件类型,这实际上是不存在于任何迭代器类型(迭代器类型没有具体的构件的要求)所需的,但由于它们限定所需默认成员,他们可能是有用的,iterator_traits 类模板自动生成适当的实例(并且这样的实例化是必需适用于所有的迭代器类型)。std::iterator 被定义为:template <原创 2021-05-20 17:05:07 · 303 阅读 · 0 评论 -
list 与 forward_list 中的一些特殊方法
list 与 forward_list 中的一些特殊方法list 与 forward_list 有一些其他序列容器没有的函数。list 中的 splice 约等于 splice_after,使用方式一模一样,只是拼接的位置位于第一参数之后。函数名函数作用splice将元素从 list 拼接到 listremove删除具有特定值的元素remove_if删除满足条件的元素unique删除重复值merge合并排序列表sort对容器中的元素进行排序原创 2021-05-19 14:24:51 · 98 阅读 · 0 评论 -
序列容器中的 erase 方法
序列容器中的 erase 方法本文章基于 VS2019 创作。erase 函数的作用:移除单个元素或元素范围。序列容器包括arrayvectordequelistforward_list其中 array 与 forward_list 没有 erase 函数,但 forward_list 有 erase_after 函数。vector、deque、list 中 erase 函数的使用方式都一样,下面以 list 为例,写出示例。list 示例第 1 种方法:iterator er原创 2021-05-19 13:03:17 · 340 阅读 · 0 评论 -
序列容器中的 assign 方法
序列容器中的 assign 方法本文章基于 VS2019 创作。assign 函数的作用:将内容重新分配给容器,替换其当前内容,并相应的修改容器的大小。序列容器包括arrayvectordequelistforward_list其中 array 没有 assign 函数。vector、deque、list 、forward_list 中 assign 函数的使用方式都一样,下面以 vector 为例,写出示例。示例第 1 种方法:void assign(_CRT_GUARDOV原创 2021-05-19 12:26:27 · 427 阅读 · 1 评论