天天看点

《编程珠玑》代码之路2:骚!数组不初始化直接访问不出错还很秀!!!

作为一只程序员,肯定经常申请空间对吧,申请完的空间我们首先要初始化,然后再进行操作。

好了问题来了,初始化时需要时间的,尤其是申请的空间大了,那初始化将非常耗时。

那我能不能不全部初始化?用哪个初始化哪个呢?

我们知道不初始化的话,内存里面存的东西都是随机的,用哪个初始化哪个,你怎么知道哪个是初始化的哪个是随机的?

还真有这种骚操作!!!多骚呢?就这么骚。。。

《编程珠玑》代码之路2:骚!数组不初始化直接访问不出错还很秀!!!

正常情况下,我们申请个数组,然后拿出里面的所有有内容的数据:

#include <iostream>
#include <cstdlib>

using namespace std;

int main() {
	int num[100000];

	for (int i = 0; i < 100000; ++i) {
		num[i] = -1;
	}

	for (int i = 0; i < 100; ++i) {
		cout << num[i] << endl;
	}
	//输出不为-1的
	system("pause");
	return 0;
}
           

都得先初始化成一个没意义的数,比如-1,然后在输出的时候输出有意义的值。这样的话,首先得来个循环。

下面这种姿势,可以把这个循环省掉:

#include <iostream>
#include <cstdlib>

using namespace std;

int top = 0;
int from[100000], to[100000];

int main() {

	int num[100000];

    //要访问的位置
	int pos[10] = {1, 4, 64, 13, 20, 30, 86, 23, 90, 43};
    
    //访问这些位置
	for (int i = 0; i < 10; ++i) {
		from[pos[i]] = top;
		to[top] = pos[i];
		num[pos[i]] = 0;
		top++;
	}

    //输出初始化过位置:
	for (int i = 0; i < 100; ++i) {
		if (from[i] < top && from[i] >= 0 && to[from[i]] == i) {
			cout << "初始化" << i << endl;
		}
		else {
			cout  << i << endl;
		}
	}

	system("pause");
	return 0;
}
           

我们看到了两个额外的辅助数组from数组和to数组以及一个变量top,正是这两个数组和一个变量的骚操作组合省掉了这个通常认为必须有的初始化循环,节省了一个循环的时间。

《编程珠玑》代码之路2:骚!数组不初始化直接访问不出错还很秀!!!

top是目前初始化了多少个数。

to数组,to[i]的值保存的是,data数组里目标值的下标。

from数组,from[i]值保存的是data[i]中的下标,data[i]这个值的下标可以通过to[from[i]]来得到。

下面的代码用来直接访问数组

for (int i = 0; i < 10; ++i) {
	from[pos[i]] = top;
	to[top] = pos[i];
	num[pos[i]] = 0;
	top++;
}
           

下面的代码用来区分有内容的和没初始化的空间

for (int i = 0; i < 100; ++i) {
	if (from[i] < top && from[i] >= 0 && to[from[i]] == i) {
		cout << "初始化" << i << endl;
	}
	else {
        cout  << i << endl;
	}
}
           

from[i] < top && from[i] >= 0 && to[from[i]] == i:这个条件保证了即使所有空间都不初始化,也能够不出错。

《编程珠玑》代码之路2:骚!数组不初始化直接访问不出错还很秀!!!