C/C++学习笔记

1.编辑:也就是编写C/C++程序。

2.预处理:相当于根据预处理指令组装新的C/C++程序。经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内容上有所不同。

3.编译:将预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后,产生相应的汇编代码文件。

4.链接:通过链接器将一个个目标文件(或许还会有库文件)链接在一起生成一个完整的可执行程序。 链接程序的主要工作就是将有关的目标文件彼此相连接,也就是将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够被操作系统装入执行的统一整体。在此过程中会发现被调用的函数未被定义。

 

auto 变量类型推演,

register 建议编译器将该变量放入cpu,

static 静态变量,

extern 声明变量,常用于多文件需要使用同一变量时

通常情况下,变量的值是存取于内存之中,若使用CPU的寄存器,将局部变量值直接放于寄存器中,其存取速度远远高于对内存的存取速度,因此,使用cpu的寄存器可提高执行速率,为了提高程序的运行速率可使用  register型  定义(整形或指针型)

 

C++ STL 的实现:

1.vector  底层数据结构为数组 ,支持快速随机访问

2.list    底层数据结构为双向链表,支持快速增删

3.deque   底层数据结构为一个中央控制器和多个缓冲区,详细见STL源码剖析P146,支持首尾(中间不能)快速增删,也支持随机访问

4.stack   底层一般用23实现,封闭头部即可,不用vector的原因应该是容量大小有限制,扩容耗时

5.queue   底层一般用23实现,封闭头部即可,不用vector的原因应该是容量大小有限制,扩容耗时

6.45是适配器,而不叫容器,因为是对容器的再封装

7.priority_queue 的底层数据结构一般为vector为底层容器,堆heap为处理规则来管理底层容器实现

8.set       底层数据结构为红黑树,有序,不重复

9.multiset  底层数据结构为红黑树,有序,可重复 

10.map      底层数据结构为红黑树,有序,不重复

11.multimap 底层数据结构为红黑树,有序,可重复

12.hash_set 底层数据结构为hash表,无序,不重复

13.hash_multiset 底层数据结构为hash表,无序,可重复 

14.hash_map      底层数据结构为hash表,无序,不重复

15.hash_multimap 底层数据结构为hash表,无序,可重复 

vector表示一段连续的内存区域,随机访问效率很高,因为每次访问离起始处的位移都是固定的,但是在随意位置插入删除元素效率很低,因为它需要将后面的元素复制一遍。 list表示非连续的内存区域,并通过一对指向首尾元素的指针双向链接起来,从而允许向前和向后两个方向进行遍历。在list的任意位置插入和删除元素的效率都很高:指针必须被重新赋值,但不需要用拷贝元素来实现移动。他对随机访问支持不好,需要遍历中间的元素。每个元素有两个指针的额外空间开销。 deque(双端队列,发音为'deck')也表示一段连续的内存区域,但是他支持高效的在其首部插入和删除元素。 选择顺序容器类型的一些准则: 如果我们需要随机访问一个容器,则vector要比List好得多。 如果我们一直要存储元素的个数,则vector又是一个比list好的选择。 如果我们需要的不只是在容器两端插入和删除元素,则list显然比vector好。 除非我们需要在容其首部插入和删除元素,否则vector要比deque好。

 

指令周期,就是执行一条指令所需要的时间,一般由若干个机器周期组成,是从取指令、分析指令到执行完所需的全部时间。

  1. 指令周期,读取-执行周期(fetch-and-execute cycle)是指CPU要执行指令经过的步骤。
  2. 计算机所以能自动地工作,是因为CPU能从存放程序的内存里取出一条指令并执行这条指令;紧接着又是取指令,执行指令,如此周而复始,构成了一个封闭的循环。除非遇到停机指令,否则这个循环将一直继续下去。
  3. 指令周期 :CPU从内存取出一条指令并执行这条指令的时间总和。
  4. CPU周期 :又称机器周期,CPU访问一次内存所花的时间较长,因此用从内存读取一条指令字的最短时间来定义。
  5. 时钟周期: 通常称为节拍脉冲或T周期。一个CPU周期包含若干个时钟周期。

有向图和无向图的邻接矩阵

 无向图的邻接矩阵一定是对称的。因为如果一个点i到j有边,则aij=aji=1;所以都是对称的。但是有向图就不一定了,点i 到 j 有边,aij=1,但j到i不一定有边,则aji不一定等于1、 
有向图用邻接矩阵更加节省存储空间。因为无向图的邻接矩阵是对称的,所以也就是多用了一些存储空间。

常用排序法的时间复杂度

冒泡排序法的平均时间复杂度为O(n^2) 二分法的平均时间复杂度度是O(logn),好于顺序表查找的O(n). 快速排序法的最坏的情况下时间复杂度等于冒泡排序法,都为O(n^2)

bubble sort    气泡排序

heap sort       堆排序

merge sort    归并排序

quick sort      快速排序

shell sort       希尔排序

A冒泡 稳定复杂度高为O(n^n)

B堆排序 不稳定复杂度低O(lgn)

C归并排序  稳定复杂度低O(lgn)

D快排   不稳定复杂度低 O(lgn)

E希尔排序 不稳定复杂度依据步长

折半插入排序  时间复杂度为O(nlog2n)

 

C/C++学习笔记_第1张图片

fseek(fp,-20L,2)指的是文件末尾偏移20个字节。第二个参数指的是偏移方向和偏移量,-20L指的是后退20个字节;第三个参数指的是从哪里开始偏移;0=文件开头,1=起始位置,2=文件末尾。

 

  1. 在 HTML 中,某些字符是预留的;
  2. 在 HTML 中不能使用小于号(<)和大于号(>),这是因为浏览器会误认为它们是标签;
  3. 常见符号
  4. C/C++学习笔记_第2张图片

 

已知int占4个字节,bool占1个字节。

1

2

3

4

5

6

7

8

unsigned int

value = 1024;

bool condition =

*((bool *)(&value));

if (condition)

value += 1; condition = *((bool *)(&value));

if (condition)

value += 1; condition = *((bool *)(&value));

问value, condition 的值为____。

1024——100 00000000 :共10个0, bool condition =*((bool *)(&value)); 取了后面8位的0作为bool变量值,一直是0,没执行过value +=1;

 

 

 

你可能感兴趣的:(算法学习)