最大堆和最小堆是一种常见的数据结构,其主要用途是实现优先队列。堆的本质是完全二叉树,可以通过数组方式顺序存储;每当堆发生变换时,需要通过节点的上浮和下沉操作,来保证堆的节点之前的严格大小关系。
Effective C++笔记(一)
C++ map遍历删除元素
今天看到一个patch fix从std::map
中遍历删除元素导致crash问题,突然意识到自己对如何正确地从map
等C++容器中删除元素也没有很牢固清醒的认知。重新梳理了下这块的正确做法,记录在此,以备后忘。
再探C++对象构造
我们在构造C++对象时,经常会使用两种不同的声明语法;那这两种声明语法对于g++编译器来说到底有什么差异吗,其构造逻辑又会有什么不同吗?一直心存疑惑,做个实验一探究竟。
C++11右值引用与移动构造函数
C++11标准新特性
右值引用(Rvalue Reference)是C++11标准引入的特性,它实现了转移语义和精确传递,主要的作用有2个方面:
- 消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率;
- 能够更简洁明确地定义泛型函数;
左值引用和右值引用
首先区分什么是左值引用和右值引用,简单的定义:
- 左值引用:就是命名对象,非临时对象,可以在多条代码中使用的对象;我们通常的变量都是左值;
- 右值引用:就指非命名对象,临时对象,脱离当前代码语句就无法被引用;比如 函数的返回值;
从左值和右值的定义可以得到,左值引用的对象创建后在代码其他地方会被多次使用,其资源的生命周期较长。而右值引用的对象是临时的,通常用来初始化另一个对象;临时对象创建后很快就会被销毁,其创建-销毁造成了一次资源浪费。既然临时对象将永远不会在其他地方被使用,实际上使用临时对象的资源来初始化另一个对象并不需要一次Copy;更高效的做法将临时对象的资源转移(Move)到另一个命名对象,避免资源的Copy和浪费。
C++拷贝构造函数和赋值运算符
整理下C++的拷贝构造函数和赋值运算符的区别,以及在何种情况下调用拷贝构造,何种情况下调用赋值运算符;总结需要自己提供拷贝构造函数的情况。