1. 程式人生 > >STL學習系列之一——標準模板庫STL介紹

STL學習系列之一——標準模板庫STL介紹

庫是一系列程式元件的集合,他們可以在不同的程式中重複使用。C++語言按照傳統的習慣,提供了由各種各樣的函式組成的庫,用於完成諸如輸入/輸出、數學計算等功能。

1. STL介紹

標準模板庫STL是當今每個從事C++程式設計的人需要掌握的技術,所有很有必要總結下

本文將介紹STL並探討它的三個主要概念:容器、迭代器、演算法。

STL的最大特點就是:

資料結構和演算法的分離,非面向物件本質。訪問物件是通過象指標一樣的迭代器實現的;

容器是象連結串列,向量之類的資料結構,並按模板方式提供;

演算法是函式模板,用於操作容器中的資料。由於STL以模板為基礎,所以能用於任何資料型別和結構。

容器可以分為三種主要型別:

序列容器、關聯容器、容器介面卡。

每種STL容器都具有相關聯的成員函式,這些成員函式的一個子集在所有的STL容器中都定義了。

STL迭代器的屬性和指標類似,程式可以利用迭代器操作STL容器中的元素

STL演算法是用於執行常見資料操作的函式,這些操作包括搜尋、排序和比較元素,STL提供了大約70種演算法,其中大多數演算法都使用迭代器來訪問容器元素。

1.1   容器簡介

 容器可以分為三種:序列容器、關聯容器、容器介面卡。

序列容器:vector deque list

Vector:可從後端執行快速的插入和刪除,直接訪問任何元素

Deque:從前面或後面執行快速的插入和刪除,直接訪問任何元素

List:雙鏈表,能在任何地方執行快速的插入和刪除

關聯容器:set multiset map multimap

Set:執行快速搜尋,元素不允許重複

Multiset:執行快速搜尋,元素允許重複

Map:一對一對映,元素不允許重複,快速的基於鍵的搜尋

Multimap:一對多對映,元素允許重複,快速的基於鍵的搜尋

容器介面卡:stack queue priority_queue

Stack:後進先出

Queue:先進先出

priority_queue:優先順序最高的元素總是最先出隊

序列容器表示線性資料結構,例如向量和連結串列;

關聯容器是非線性容器,通常能夠快速找出儲存在容器中的元素。這類容器能夠儲存值的集合或鍵/值對;序列容器和關聯容器統稱為第一類容器。

STL將堆疊和佇列實現為容器介面卡,使程式以一種受約束的方式看待序列容器。

STL通常可通過模板實現泛型程式設計,以避免繼承和虛擬函式,獲得更好的執行時效能。

1.2   迭代器簡介

迭代器在許多方面和指標相同,用於指向第一類容器的元素。

迭代器提供對一個容器中的物件的訪問方法,並且定義了容器中物件的範圍。迭代器就如同一個指標。事實上,C++的指標也是一種迭代器。但是,迭代器不僅僅是指標,因此你不能認為他們一定具有地址值。例如,一個數組索引,也可以認為是一種迭代器。

迭代器有各種不同的建立方法。程式可能把迭代器作為一個變數建立。一個STL容器類可能為了使用一個特定型別的資料而建立一個迭代器。作為指標,必須能夠使用*操作符類獲取資料。你還可以使用其他數學操作符如++。典型的,++操作符用來遞增迭代器,以訪問容器中的下一個物件。如果迭代器到達了容器中的最後一個元素的後面,則迭代器變成past-the-end值。使用一個past-the-end值得指標來訪問物件是非法的,就好像使用NULL或為初始化的指標一樣。

廢話不多說,直接上demo

  1. //利用istream_iterator進行輸入,利用ostream_iterator進行輸出
  2. //下面程式演示了使用istream_iterator從標準輸入進行輸入,以及使用ostream_iterator輸出到標準輸出
  3. #include "stdafx.h"
  4. #include <iostream>
  5. usingnamespace std;  
  6. #include <iterator>
  7. int _tmain(int argc, _TCHAR* argv[])  
  8. {  
  9.  cout<<"輸入2個整數:"<<endl;  
  10.  //下行建立了一個istream_iterator,它能夠以一種型別安全的方式從標準輸入物件cin提取int值
  11.  std::istream_iterator<int> inputInt(cin);  
  12.  //下行對迭代器inputInt解除引用,並從cin中讀出一個整數,然後將它賦予number1
  13.  int number1=*inputInt;  
  14.  ++inputInt;                    //將迭代器inputInt定位到輸出流中的下一個值
  15.  int number2=*inputInt;         //從inputInt輸入下一個整數,並將它賦予number2
  16.  //下行建立了一個ostream_iterator,它能夠在標準輸出物件cout中出入int值
  17.  std::ostream_iterator<int> outputInt(cout);  
  18.  cout<<"和是:"<<endl;  
  19.  *outputInt=number1+number2; //將number1和number2的和賦予*outputInt
  20.  cout<<endl;  
  21.  system("pause");  
  22.  return 0;  
  23. }  

1.3   演算法簡介

STL演算法能用於各種容器。STL提供的許多演算法,大量用於操作容器,插入、刪除、搜尋、排序以及其他演算法,都適合於部分或者所有的STL容器。

STL的實現非常簡單。到目前為止,類的設計者都將演算法作為容器的成員函式,使演算法和容器相關聯。STL採用不同的方法,STL的演算法和容器是分離的,它只是間接地通過迭代器操作容器的元素。

STL演算法能夠用於STL容器以及基於指標的、C風格的陣列。

參考資料:c++程式設計師教程  電子工業出版社