有關STL應用論文

來源:才華庫 2.46W

STL是Standard Template Library的簡稱,中文名標準模板庫,惠普實驗室開發的一系列軟體的統稱。下面是關於有關STL應用論文的內容,歡迎閱讀!

有關STL應用論文

STL提供六大元件,彼此可以組合套用

1、容器(containers):各種資料結構,如vertor,list,deque,set,map.從實現的角度來看,STL容器是一種class template

2、演算法(algorithms):各種演算法如sort,search,copy,earse。STL演算法是一種 function template。

3、迭代器(iterators):扮演容器與演算法之間的膠合劑,是所謂的“泛型指標”。所有STL容器都有自己的專屬的迭代器。

4、仿函式(functors):行為類似函式,可以作為演算法的某些策略。從實現的角度來看,仿函式是一種過載了operator()的class或class template。

5、配接器(adapters):一種用來修飾容器或仿函式或迭代器藉口的東西。例如queue和stack

6、配置器(allocators):負責空間的配置與管理。配置器是一個實現了動態空間分配、空間管理、空間釋放的class template。

STL是建立在泛化之上的。陣列泛化為容器,引數化了所包含的物件的型別。函式泛化為演算法,引數化了所用的迭代器的型別。指標泛化為迭代器,引數化了所指向的物件的型別。

vector、string、deque和list被稱為標準序列容器,

set、multiset、map和multimap是標準關聯容器。

非標準序列容器slist和rope。slist是一個單向連結串列,rope本質上是一個重型字串。

非標準關聯容器hash_set、hash_multiset、hash_map和hash_multimap。

標準非STL容器,包括陣列、bitset、valarray、stack、queue和priority_queue。

迭代器被分成五個種類:

輸入迭代器是每個迭代位置只能被讀一次的只讀迭代器。

輸出迭代器是每個迭代位置只能被寫一次的只寫迭代器。

輸入和輸出迭代器被塑造為讀和寫輸入和輸出流(例如,檔案)。

前向迭代器有輸入和輸出迭代器的能力,但是它們可以反覆讀或寫一個位置。

雙向迭代器就像前向迭代器,除了它們的後退可以像前進一樣容易。標準關聯容器都提供雙向迭代器。list也有。

連續記憶體容器(也叫做基於陣列的容器)在一個或多個(動態分配)的記憶體塊中儲存它們的元素。如果一個新元素被查入或者已存元素被刪除,其他在同一個記憶體塊的元素就必須向上或者向下移動來為新元素提供空間或者填充原來被刪除的元素所佔的空間。這種移動影響了效率和異常安全。標準的連續記憶體容器是vector、string和deque。非標準的rope也是連續記憶體容器。

基於節點的容器在每個記憶體塊(動態分配)中只儲存一個元素。容器元素的插入或刪除隻影響指向節點的指標,而不是節點自己的內容。所以當有東西插入或刪除時,元素值不需要移動。表現為連結串列的容器——比如list和slist——是基於節點的,所有的標準關聯容器也是(它們的典型實現是平衡樹)。非標準的雜湊容器使用不同的基於節點的實現。

1、vector

vector和陣列類似,它擁有一段連續的記憶體空間,並且起始地址不變,因此它能非常好的支援隨機存取(即使用[]操作符訪問其中的元素),但由於它的記憶體空間是連續的,所以在中間進行插入和刪除會造成記憶體塊的拷貝(複雜度是O(n)),另外,當該陣列後的記憶體空間不夠時,需要重新申請一塊足夠大的記憶體並進行記憶體的拷貝。這些都大大影響了vector的效率。

vector不是一種資料型別,而只是一個類模板,可用來定義任意多種資料型別。vector型別的每一種都指定了其儲存元素的型別。因此,vector和vector都是資料型別。

vector物件的定義和初始化

vectorv1;

vector儲存型別為T的物件。預設建構函式v1為空。

vectorv2(v1);

v2是v1的一個副本。

vectorv3(n,i);

v3包含n個值為i的元素。

vectorivec4(10, -1); // 10 elements, each initialized to -1

vectorsvec(10, "hi!"); // 10 strings, each initialized to "hi!"

vector的操作

y()

如果v為空,則返回true,否則返回false。

()

返回v中元素的個數。

_back(t)

在v的末尾增加一個值為t的元素。

v[n]

返回v中位置為n的元素。

v1=v2

把v1的元素替換為v2中元素的副本。

v1==v2

如果v1與v2相等,則返回true。

!=, <, <=,>, >=

保持這些操作符慣有的含義。

向vector新增元素:

複製程式碼 程式碼如下:

string word;

vectortext; // empty vector

while (cin >> word) {

_back(word); // append word to text

}

vector的下標操作:

for (vector::size_type ix = 0; ix != (); ++ix)

ivec[ix] = 0;

vector迭代器

每種容器都定義了一對命名為begin和end的函式,用於返回迭代器。如果容器中有元素的話,由begin返回的'迭代器指向第一個元素:

複製程式碼 程式碼如下:

vector::iterator iter = n();

由end操作返回的迭代器指向vector的“末端元素的下一個”。通常稱為超出末端迭代器(off-the-end iterator),表明它指向了一個不存在的元素。如果vector為空,begin返回的迭代器與end返回的迭代器相同。

複製程式碼 程式碼如下:

for (vector::iterator iter = n(); iter != (); ++iter)

*iter = 0; // set element to which iter refers to 0

const_iterator

前面的程式用vector::iterator改變vector中的元素值。每種容器型別還定義了一種名為const_iterator的型別,該型別只能訪問容器內元素,但不能改變其值。

複製程式碼 程式碼如下:

for (vector::const_iterator iter = n(); iter != (); ++ iter)

*iter = " "; // error: *iter is const

2、list

list是由資料結構中的雙向連結串列實現的,因此它的記憶體空間可以是不連續的。因此只能通過指標來進行資料的訪問,這個特點使得它的隨機存取變的非常沒有效率,需要遍歷中間的元素,搜尋複雜度O(n),因此它沒有提供[]操作符的過載。但由於連結串列的特點,它可以以很好的效率支援任意地方的刪除和插入。

list::iterator與vector::iterator的一些不同:

複製程式碼 程式碼如下:

#include

#include

#include

using namespace std;

int main( void )

{

vectorv;

listl;

for (int i=0; i<8; i++) //往v和l中分別新增元素

{

_back(i);

_back(i);

}

cout << "v[2] = " << v[2] << endl;

//cout << "l[2] = " << l[2] << endl; //編譯錯誤,list沒有過載[]

cout << (n() < ()) << endl;

//cout << (n() < ()) << endl; //編譯錯誤,list::iterator沒有過載<或>

cout << *(n() + 1) << endl;

vector::iterator itv = n();

list::iterator itl = n();

itv = itv + 2;

//itl = itl + 2; //編譯錯誤,list::iterator沒有過載+

itl++;itl++; //list::iterator中過載了++,只能使用++進行迭代訪問。

cout << *itv << endl;

cout << *itl << endl;

return 0;

}

由於vector擁有一段連續的記憶體空間,能非常好的支援隨機存取,因此vector::iterator支援“+”、“+=”、“<”等操作符。

而list的記憶體空間可以是不連續,它不支援隨機訪問,因此list::iterator則不支援“+”、“+=”、“<”等操作符運算,因此程式碼20、26行會有編譯錯誤。只能使用“++”進行迭代,例如程式碼27行,使用兩次itl++來移動itl。還有list也不支援[]運算子,因此程式碼18行出現編譯錯誤。

總之,如果需要高效的隨即存取,而不在乎插入和刪除的效率,使用vector;如果需要大量的插入和刪除,而不關心隨即存取,則應使用list。

vector擁有一段連續的記憶體空間,因此支援隨機存取,如果需要高效的隨即存取,而不在乎插入和刪除的效率,使用vector。

list擁有一段不連續的記憶體空間,因此支援隨機存取,如果需要大量的插入和刪除,而不關心隨即存取,則應使用list。當大部分插入和刪除發生在序列的頭或尾時可以選擇deque這種資料結構。

熱門標籤