2020.7.6 知识记录:虚拟内存、STL算法、C++参数传递、C++内存分配、快排C++实现、迭代器、广度有限搜索和深度有限搜索

什么是虚拟内存

虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。

虚拟内存的关键知识点(个人理解)

1.拿出硬盘空间作为内存的延申
2.页表来对应逻辑地址和物理地址(物理上不必连续)

页面替换策略

1)最佳置换-OPT(Optimal Replacement Algorithm):将未来最久不使用的表替换出去,这个应该是理论最佳方式,但也只停留在理论上,因为无法预知未来。
2)最久未使用-LRU(Least Recently Used):原理是已经很久没用过的页,大概率在未来也不会再使用了。
3)先进先出-FIFO
4)改进型先进先出-二次机会:加了一个标志位,来看最近是否被使用过,如果被使用过就不能替换,而是修改其标志位为0,并将其移动到队列尾部。
5)环形先进先出:因为有先后就必然有队列,而改进后又不是严格按照先进先出的顺序,那么就会导致内存的移动。为了避免移动内存,可以使用环形队列。

MapReduce

查了一下,MapReduce是和多线程、分布式相关的,对应分治的思想。
Map-映射:对集合里的每个目标应用同一个操作。即,如果你想把表单里每个单元个乘以二,那么把这个函数单独地应用在每个单元格上的操作就属于mapping。
Reduce-归约:遍历集合中的元素来返回一个综合的结果。即,输出表单里一列数字的和这个任务属于reducing。

C++参数传递方式

值传递

传入的是变量,但是函数会把此变量的值赋值给另一个临时变量。把实参的值拷贝给形参,对于形参的修改不会影响到实参。

指针传递

本质上是值传递,但是特殊点就在于这个值是一个地址值,而我们可以通过访问地址的方式访问实际上想要访问的变量。

引用传递

传入的是变量,但是函数会把此变量的地址赋值给一个隐藏的临时变量,对于形参的操作都可以间接地通过地址的方式作用于形参。

指针和引用的区别

指针:变量,独立,可变,可空,替身,无类型检查;
引用:别名,依赖,不变,非空,本体,有类型检查;
二者都和地址有关。
指针本质上是一个变量,本身就会占用内存,只不过他的值一般都是一个地址。
引用是某个变量的别名,与原变量是同一个内存空间。

C++内存管理

堆(malloc)、栈(函数调用)、自由存储区(new)、静态存储区(static)、常量存储区(constkong)

空类、虚函数类、对齐和sizeof

空类:如果没有变量,不论有几个函数,sizeof都是1,因为编译时如果监测到为空类,会默认插进去一个char类型的变量。
虚函数类:如果没有变量,但是有一个虚函数,那么sizeof会变为4,因为虚函数类会隐式的包含一个虚函数表指针。
对齐:int-4 int64-8 char-1 会按照最大的分块
如果当前块的剩余量可以放下下一个变量,就放。如果放不下,就再开一个块。举例:
int32+char = 8
int32+char+char = 8
int32+char+int32 = 12

C++实现快排

快排的关键:选取基准值(一般就认为是开头元素),两侧游标轮流与基准值进行比较,将数组分为两部分,然后递归。

void quickSort(int array[],int left,int right) {
	int key = array[left];
	int i = left, j = right;


	while (i < j) {
		
		while (array[j] >= key) {
			j--;
		}

		array[i] = array[j];

		while (array[i] <= key) {
			i++;
		}

		array[j] = array[i];

		if (i >= j) {
			break;
		}

	}

	array[i] = key;
	quickSort(array, left, i-1);
	quickSort(array, i+1, right);
}

迭代器

迭代器是社么?

迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。迭代器可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。从这一点上看,迭代器和指针类似。

迭代器的作用?

用for循环不香吗?为什么非得使迭代器呢?
确实不香。。。。原因有以下
1.统一性:针对不同的容器(数据结构),都可以用同一种方式进行遍历,不必在意细节——究竟是哪种容器。
2.灵活性:for循环往往会整体遍历,而迭代器则可以进行指定,并通过++、–等操作很灵活的进行访问。

广度优先和深度优先搜索

深度实现思路:递归或栈
广度实现思路:队列

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值