1. 程式人生 > >《程式設計珠璣》程式碼之路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,正是這兩個陣列和一個變數的騷操作組合省掉了這個通常認為必須有的初始化迴圈,節省了一個迴圈的時間。

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:這個條件保證了即使所有空間都不初始化,也能夠不出錯。