
C++学习随笔
磨叽墨迹墨迹
这个作者很懒,什么都没留下…
展开
-
无符号数取反
做Leetcode剑指offer第16题数值的整数次方问题时,解答如下:class Solution {public: double myPow(double x, int n) { double res = 1; unsigned int m =(unsigned int)n; if(n < 0) { x = 1/x; m = -m; }原创 2021-05-27 12:38:53 · 3704 阅读 · 0 评论 -
#define、#undef、#ifdef、#ifndef、#if、#elif、#else、#endif、defined
#define 定义一个预处理宏#undef 取消宏的定义#if 编译预处理中的条件命令,相当于C语法中的if语句#ifdef 判断某个宏是否被定义,若已定义,执行随后的语句#ifndef 与#ifdef相反,判断某个宏是否未被定义#elif 若#if, #ifdef, #ifndef或前面的#elif条件不满足,则执行#elif之后的语句,...原创 2021-04-01 15:25:47 · 222 阅读 · 0 评论 -
Lamda表达式
ISO C++ 11引入了Lamda表达式。基本语法如下:[capture list] (parameter list) -> return type { function body }其中除了“[ ]”(其中捕获列表可以为空)和“复合语句”(相当于具名函数定义的函数体),其它都是可选的。它的类型是单一的具有成员operator()的非联合的类类型,称为闭包类型(closure type)。C++中,一个lambda表达式表示一个可调用的代码单元。我们可以将其理解为一个未命名的内联函数。原创 2021-04-01 10:57:17 · 178 阅读 · 0 评论 -
C语言中逻辑运算与位级运算
位级运算一般将十六进制的参数扩展成二进制表示然后进行位级运算再转换为十六进制。位运算符: &:按位与 |:按位取反 ~:按位取反 ^:按位异或逻辑运算逻辑运算只有两种结果:非零参数表示为true,参数0表示为false,他们返回1或0。逻辑运算符: &&:与 ||:或 !:取反...原创 2021-01-07 14:02:38 · 487 阅读 · 0 评论 -
快速幂算法原理+模板
原理参考:https://blog.youkuaiyun.com/qq_19782019/article/details/85621386C++模板://求m的k次方关于p的模int qmi(int m, int k, int p){ int res = 1 % p, t = m; while (k) { if (k&1) res = res * t % p; t = t * t % p; k >>= 1;原创 2020-11-04 17:40:03 · 195 阅读 · 0 评论 -
C++中的原生指针、泛型指针、智能指针
A. 原生指针 最普通的指针,定义类似:类型 *变量名(int *p); 与之对比的是使用上有类似指针的功能 实际并不是指针。比如:迭代器 [一个类重载 *和->操作符 那么可以像指针一样使用 但是这种并不是原生的]B. 泛型指针 第一种就是 void *指针 可以指向任意的数据结构 因此可以称为"泛型"。 第二种就是指具有指针特性的泛型数据结构 如:泛型迭代器和接下来要说的智能指针。C. 智能指针 C++中没有自动回...原创 2020-10-25 14:09:36 · 679 阅读 · 0 评论 -
C++中的单引号和双引号的区别
双引号表示字符串,双引号引起的字符串,代表的却是一个指向无名数组起始字符的指针。该数组会被双引号之间的字符以及一个额外的二进制为零的字符 ‘\0’ 初始化。字符串里,哪怕你只放了一个字母,事实上,系统会自动给它加一个\0。表示结束。也就是说,字符串比你看到的多占一个位置。单引号表示字符,单引号引起的一个字符实际上代表一个整数。...原创 2020-10-25 10:26:20 · 1084 阅读 · 0 评论 -
STL空间配置器(三)第二级配置器
https://blog.youkuaiyun.com/wenqian1991/article/details/19605727没看懂这边,留个记号,回头细看下。原创 2020-10-24 15:12:17 · 103 阅读 · 0 评论 -
STL空间配置器(二)第一级配置器
内存的配置与释放(定义在头文件 <stl_alloc.h> 中)。其设计思想为:向 system heap 要求空间; 考虑多线程 (multi-threads) 状态; 考虑内存不足时的应变措施; 考虑过多 “小型区块” 可能造成的内存碎片 (fragment) 问题。我们后面将通过分析源码来了解这设计思想是如何在设计中体现的。SGI 设计了双层级配置器,第一级配置器直接使用 malloc() 和 free(),第二级则视情况采用不同策略,并采用了复杂的内存池(memory poo转载 2020-10-24 11:24:38 · 116 阅读 · 0 评论 -
STL空间配置器(一)构造和析构
以下内容摘自侯捷《S》一般而言,我们所习惯的C++ 内存配置操作和释放操作是这样的class Foo { ... };Foo* pObj = new Foo;delete pObj;其中new 运算包含两阶段操作:1. 调用 ::operator new 配置内存,2. 调用构造函数 Foo() 构造对象。 delete 运算也包含两个阶段:1. 调用析构函数 ~Foo() 将对象析构, 2. 调用 ::operator delete 释放内存。STL 为了提高效率则把二者分开转载 2020-10-24 11:17:33 · 107 阅读 · 0 评论 -
C++的placement new
一.new new operator就是new操作符,不能被重载,假如A是一个类,那么A * a=new A;实际上执行如下3个过程。 (1)调用operator new分配内存,operator new (sizeof(A)) (2)调用构造函数生成类对象,A::A() (3)返回相应指针 事实上,分配内存这一操作就是由operator new(size_t)来完成的,如果类A重载了operator new,那么将调用A::operator new(size_t ),否则调用全局::o...转载 2020-10-23 17:03:37 · 624 阅读 · 0 评论 -
C++的trivial destructor
如果用户不定义析构函数,而是用系统自带的,则说明,析构函数基本没有什么用(但默认会被调用)我们称之为trivial destructor。反之,如果特定定义了析构函数,则说明需要在释放空间之前做一些事情,则这个析构函数称为non-trivial destructor。如果某个类中只有基本类型的话是没有必要调用析构函数的,delelte p的时候基本不会产生析构代码。 在C++的类中如果只有基本的数据类型,也就不需要写显式的析构函数,即用默认析构函数就够用了,但是如果类中有个指向其...原创 2020-10-23 16:37:09 · 207 阅读 · 0 评论