天天看點

C++ 順序容器通路元素

C++ 順序容器之通路元素

一、順序容器類型回顧:
vector 可變大小數組。支援快速随機通路。在尾部之外的位置插入或删除元素可能很慢。
deque 雙端隊列。支援快速随機通路。在頭尾位置插入/删除速度很快。
list 雙向連結清單。隻支援雙向順序通路。在list中任何位置進行插入/删除操作速度都很快。
forward_list 單向連結清單。隻支援單向順序通路。在連結清單任何位置進行插入/删除操作速度都很快。
array 固定大小數組。支援快速随機通路。不能添加或删除元素。
string 與vector相似的容器,但專門用于儲存字元。随機通路快。在尾部插入/删除速度快。

二、通路元素:        如果容器中沒有元素,通路操作的結果是未定義的,是以通路之前一定要”檢查容器是否有元素“!

       包括array在内的每個容器都有一個front成員函數,而除forward_list之外的所有容器都有一個back成員函數。這兩個操作分别傳回首元素和尾元素的引用。

// 在解引用一個疊代器或調用front或back之前檢查是否有元素
	if (!c.empty())
	{
		// val 和 val2 是c中第一個元素值的拷貝
		auto val = *c.begin(), val2 = c.front();

		// val3 和 vla4 是c中最後一個元素的拷貝
		auto last = c.end();
		auto val3 = *(--last); // 不能遞減forward_list疊代器
		auto val4 = c.back();  // forward_list 不支援
	}
           

此程式用兩種不同方式來擷取c 中首元素和尾元素的引用。直接的方法是調用front和back。而間接的方法是通過解引用begin傳回的疊代器來獲得首元素的引用,以及通過遞減然後解引用end傳回的疊代器來獲得尾元素的引用。         該程式有兩點值得注意:疊代器end指向的是容器尾元素之後的(不存在的)元素。為了擷取尾元素,必須首先遞減疊代器。 另一個重要之處是,在調用front和back(或解引用begin和end傳回的疊代器)之前,要確定 c 非空。如果容器為空,if 中操作的行為将是未定義的。

三、通路成員函數傳回的是引用:          在容器中通路元素的成員函數(即,front、back、下标和at)傳回的都是引用。

四、下标操作和安全的随機通路:         at 總是會做邊界檢查,下标運算符(operator[] )不做邊界檢查。         提供快速随機通路的容器(string、vector、deque和array)也都提供下标運算符。下标運算符接受一個下标參數,傳回容器中該位置的元素的引用。給定下标必須”在範圍内“(即,大于等于0,且小于容器的大小)。保證下标有效是程式員的責任,下标運算符并不檢查下标是否在合法範圍内。使用越界的下标是一種嚴重的程式設計錯誤,而且編譯器并不檢查這種錯誤。         如果我們希望確定下标是合法的,可以使用at 成員函數。at 成員函數類似下标運算符,但如果下标越界,at 會抛出一個out_of_range異常:

vector<string> svec; // 空vecotr
	cout << svec[0];     // 運作時錯誤:svec中沒有元素
	cout << svec.at(0);  // 抛出一個out_of_range 異常
           

繼續閱讀