成人免费看黄网站无遮挡,caowo999,se94se欧美综合色,a级精品九九九大片免费看,欧美首页,波多野结衣一二三级,日韩亚洲欧美综合

STL應用論文

時(shí)間:2021-06-13 14:49:22 論文 我要投稿

有關(guān)STL應用論文

  STL是Standard Template Library的簡(jiǎn)稱(chēng),中文名標準模板庫,惠普實(shí)驗室開(kāi)發(fā)的一系列軟件的統稱(chēng)。下面是關(guān)于有關(guān)STL應用論文的內容,歡迎閱讀!

有關(guān)STL應用論文

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

  1、容器(containers):各種數據結構,如vertor,list,deque,set,map.從實(shí)現的角度來(lái)看,STL容器是一種class template

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

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

  4、仿函數(functors):行為類(lèi)似函數,可以作為算法的某些策略。從實(shí)現的角度來(lái)看,仿函數是一種重載了operator()的class或class template。

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

  6、配置器(allocators):負責空間的配置與管理。配置器是一個(gè)實(shí)現了動(dòng)態(tài)空間分配、空間管理、空間釋放的class template。

  STL是建立在泛化之上的。數組泛化為容器,參數化了所包含的對象的類(lèi)型。函數泛化為算法,參數化了所用的迭代器的類(lèi)型。指針?lè )夯癁榈,參數化了所指向的對象的?lèi)型。

  vector、string、deque和list被稱(chēng)為標準序列容器,

  set、multiset、map和multimap是標準關(guān)聯(lián)容器。

  非標準序列容器slist和rope。slist是一個(gè)單向鏈表,rope本質(zhì)上是一個(gè)重型字符串。

  非標準關(guān)聯(lián)容器hash_set、hash_multiset、hash_map和hash_multimap。

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

  迭代器被分成五個(gè)種類(lèi):

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

  輸出迭代器是每個(gè)迭代位置只能被寫(xiě)一次的只寫(xiě)迭代器。

  輸入和輸出迭代器被塑造為讀和寫(xiě)輸入和輸出流(例如,文件)。

  前向迭代器有輸入和輸出迭代器的能力,但是它們可以反復讀或寫(xiě)一個(gè)位置。

  雙向迭代器就像前向迭代器,除了它們的后退可以像前進(jìn)一樣容易。標準關(guān)聯(lián)容器都提供雙向迭代器。list也有。

  連續內存容器(也叫做基于數組的容器)在一個(gè)或多個(gè)(動(dòng)態(tài)分配)的內存塊中保存它們的元素。如果一個(gè)新元素被查入或者已存元素被刪除,其他在同一個(gè)內存塊的元素就必須向上或者向下移動(dòng)來(lái)為新元素提供空間或者填充原來(lái)被刪除的元素所占的空間。這種移動(dòng)影響了效率和異常安全。標準的連續內存容器是vector、string和deque。非標準的rope也是連續內存容器。

  基于節點(diǎn)的容器在每個(gè)內存塊(動(dòng)態(tài)分配)中只保存一個(gè)元素。容器元素的插入或刪除只影響指向節點(diǎn)的指針,而不是節點(diǎn)自己的內容。所以當有東西插入或刪除時(shí),元素值不需要移動(dòng)。表現為鏈表的容器——比如list和slist——是基于節點(diǎn)的,所有的標準關(guān)聯(lián)容器也是(它們的典型實(shí)現是平衡樹(shù))。非標準的散列容器使用不同的基于節點(diǎn)的實(shí)現。

  1、vector

  vector和數組類(lèi)似,它擁有一段連續的內存空間,并且起始地址不變,因此它能非常好的支持隨機存。词褂肹]操作符訪(fǎng)問(wèn)其中的元素),但由于它的內存空間是連續的,所以在中間進(jìn)行插入和刪除會(huì )造成內存塊的拷貝(復雜度是O(n)),另外,當該數組后的內存空間不夠時(shí),需要重新申請一塊足夠大的內存并進(jìn)行內存的拷貝。這些都大大影響了vector的效率。

  vector不是一種數據類(lèi)型,而只是一個(gè)類(lèi)模板,可用來(lái)定義任意多種數據類(lèi)型。vector類(lèi)型的每一種都指定了其保存元素的類(lèi)型。因此,vector和vector都是數據類(lèi)型。

  vector對象的定義和初始化

  vectorv1;

  vector保存類(lèi)型為T(mén)的對象。默認構造函數v1為空。

  vectorv2(v1);

  v2是v1的一個(gè)副本。

  vectorv3(n,i);

  v3包含n個(gè)值為i的.元素。

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

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

  vector的操作

  v.empty()

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

  v.size()

  返回v中元素的個(gè)數。

  v.push_back(t)

  在v的末尾增加一個(gè)值為t的元素。

  v[n]

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

  v1=v2

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

  v1==v2

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

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

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

  向vector添加元素:

  復制代碼 代碼如下:

  string word;

  vectortext; // empty vector

  while (cin >> word) {

  text.push_back(word); // append word to text

  }

  vector的下標操作:

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

  ivec[ix] = 0;

  vector迭代器

  每種容器都定義了一對命名為begin和end的函數,用于返回迭代器。如果容器中有元素的話(huà),由begin返回的迭代器指向第一個(gè)元素:

  復制代碼 代碼如下:

  vector::iterator iter = ivec.begin();

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

  復制代碼 代碼如下:

  for (vector::iterator iter = ivec.begin(); iter != ivec.end(); ++iter)

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

  const_iterator

  前面的程序用vector::iterator改變vector中的元素值。每種容器類(lèi)型還定義了一種名為const_iterator的類(lèi)型,該類(lèi)型只能訪(fǎng)問(wèn)容器內元素,但不能改變其值。

  復制代碼 代碼如下:

  for (vector::const_iterator iter = text.begin(); iter != text.end(); ++ iter)

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

  2、list

  list是由數據結構中的雙向鏈表實(shí)現的,因此它的內存空間可以是不連續的。因此只能通過(guò)指針來(lái)進(jìn)行數據的訪(fǎng)問(wèn),這個(gè)特點(diǎn)使得它的隨機存取變的非常沒(méi)有效率,需要遍歷中間的元素,搜索復雜度O(n),因此它沒(méi)有提供[]操作符的重載。但由于鏈表的特點(diǎ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中分別添加元素

  {

  v.push_back(i);

  l.push_back(i);

  }

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

  //cout << "l[2] = " << l[2] << endl; //編譯錯誤,list沒(méi)有重載[]

  cout << (v.begin() < v.end()) << endl;

  //cout << (l.begin() < l.end()) << endl; //編譯錯誤,list::iterator沒(méi)有重載<或>

  cout << *(v.begin() + 1) << endl;

  vector::iterator itv = v.begin();

  list::iterator itl = l.begin();

  itv = itv + 2;

  //itl = itl + 2; //編譯錯誤,list::iterator沒(méi)有重載+

  itl++;itl++; //list::iterator中重載了++,只能使用++進(jìn)行迭代訪(fǎng)問(wèn)。

  cout << *itv << endl;

  cout << *itl << endl;

  return 0;

  }

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

  而list的內存空間可以是不連續,它不支持隨機訪(fǎng)問(wèn),因此list::iterator則不支持“+”、“+=”、“<”等操作符運算,因此代碼20、26行會(huì )有編譯錯誤。只能使用“++”進(jìn)行迭代,例如代碼27行,使用兩次itl++來(lái)移動(dòng)itl。還有list也不支持[]運算符,因此代碼18行出現編譯錯誤。

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

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

  list擁有一段不連續的內存空間,因此支持隨機存取,如果需要大量的插入和刪除,而不關(guān)心隨即存取,則應使用list。當大部分插入和刪除發(fā)生在序列的頭或尾時(shí)可以選擇deque這種數據結構。

【STL應用論文】相關(guān)文章:

網(wǎng)絡(luò )的應用論文02-25

EVA的含義與應用論文06-19

論文:色彩空間的應用07-02

PBL教學(xué)的應用論文06-19

信息檢索與應用論文04-11

應用林業(yè)科技論文06-25

ERP開(kāi)發(fā)的應用論文04-13

簡(jiǎn)單說(shuō)說(shuō)何為之STL的內存管理Allocator05-07

應用數學(xué)的畢業(yè)論文03-28