1. 程式人生 > >C++STL學習經典

C++STL學習經典

STL有三大核心部分:容器(Container)、演算法(Algorithms)、迭代器(Iterator),容器介面卡(container adaptor),函式物件(functor),除此之外還有STL其他標準組件。通俗的講:

容器:裝東西的東西,裝水的杯子,裝鹹水的大海,裝人的教室……STL裡的容器是可容納一些資料的模板類。

演算法:就是往杯子裡倒水,往大海里排汙,從教室裡攆人……STL裡的演算法,就是處理容器裡面資料的方法、操作。

迭代器:往杯子裡倒水的水壺,排汙的管道,攆人的那個物業管理人員……STL裡的迭代器:遍歷容器中資料的物件。對儲存於容器中的資料進行處理時,迭代器能從一個成員移向另一個成員。他能按預先定義的順序在某些容器中的成員間移動。對普通的一維陣列、向量、雙端佇列和列表來說,迭代器是一種指標。

下面讓我們來看看專家是怎麼說的:

容器(container):容器是資料在記憶體中組織的方法,例如,陣列、堆疊、佇列、連結串列或二叉樹(不過這些都不是STL標準容器)。STL中的容器是一種儲存TTemplate)型別值的有限集合的資料結構,容器的內部實現一般是類。這些值可以是物件本身,如果資料型別T代表的是Class的話。

演算法(algorithm):演算法是應用在容器上以各種方法處理其內容的行為或功能。例如,有對容器內容排序、複製、檢索和合並的演算法。在STL中,演算法是由模板函式表現的。這些函式不是容器類的成員函式。相反,它們是獨立的函式。令人吃驚的特點之一就是其演算法如此通用。不僅可以將其用於STL

容器,而且可以用於普通的C++陣列或任何其他應用程式指定的容器。

迭代器(iterator):一旦選定一種容器型別和資料行為(演算法),那麼剩下唯一要他做的就是用迭代器使其相互作用。可以把達代器看作一個指向容器中元素的普通指標。可以如遞增一個指標那樣遞增迭代器,使其依次指向容器中每一個後繼的元素。迭代器是STL的一個關鍵部分,因為它將演算法和容器連在一起。

下面我將依次介紹STL的這三個主要元件。

1.      容器

STL中的容器有佇列容器和關聯容器,容器介面卡(congtainer adaptersstack,queuepriority queue),位集(bit_set),串包(string_package)

等等。  在本文中,我將介紹list,vectordeque等佇列容器,和setmultisets,mapmultimaps等關聯容器,一共7種基本容器類。  佇列容器(順序容器):佇列容器按照線性排列來儲存T型別值的集合,佇列的每個成員都有自己的特有的位置。順序容器有向量型別、雙端佇列型別、列表型別三種。

u    基本容器——向量

向量(vector容器類):#include <vector>vector是一種動態陣列,是基本陣列的類模板。其內部定義了很多基本操作。既然這是一個類,那麼它就會有自己的建構函式。vector 類中定義了4中種建構函式:

·  預設建構函式,構造一個初始長度為0的空向量,如:vector<int> v1;

·  帶有單個整形引數的建構函式,此引數描述了向量的初始大小。這個建構函式還有一個可選的引數,這是一個型別為T的例項,描述了各個向量種各成員的初始值;如:vector<int> v2(n,0); 如果預先定義了:n,他的成員值都被初始化為0

·  複製建構函式,構造一個新的向量,作為已存在的向量的完全複製,如:vector<int> v3(v2);

·  帶兩個常量引數的建構函式,產生初始值為一個區間的向量。區間由一個半開區間[first,last) 來指定。如:vector<int> v4(first,last

下面一個例子用的是第四種構造方法,其它的方法讀者可以自己試試。

1.//程式:初始化演示

2.#include <cstring> 

3.#include <vector>

4.#include <iostream>

5.usingnamespace std;  

6.

7.int ar[10] = {  12, 45, 234, 64, 12, 35, 63, 23, 12, 55  };  

8.char* str = "Hello World";  

9.

10.int main()  

11.{  

12.    vector <int> vec1(ar, ar+10);   //first=ar,last=ar+10,不包括ar+10

13.    vector < char > vec2(str,str+strlen(str)); //first=str,last= str+strlen(str),

14.    cout<<"vec1:"<<endl;    

15.//列印vec1vec2const_iterator是迭代器,後面會講到

16.//當然,也可以用for (int i=0; i<vec1.size(); i++)cout << vec[i];輸出

17.//size()vector的一個成員函式

18.for(vector<int>::const_iterator p=vec1.begin();p!=vec1.end(); ++p)  

19.        cout<<*p;  

20.        cout<<'/n'<<"vec2:"<<endl;  

21.for(vector< char >::const_iterator p1=vec2.begin();p1!=vec2.end(); ++p1)  

22.        cout<<*p1;  

23.    cout<<'/n';  

24.return 0;  

25.}       

為了幫助理解向量的概念,這裡寫了一個小例子,其中用到了vector的成員函式:begin()end()push_back()assign()front()back()erase()empty()at()size()

1.#include <iostream>

2.#include <vector>

3.usingnamespace std;  

4.

5.typedef vector<int> INTVECTOR;//自定義型別INTVECTOR

6.//測試vector容器的功能

7.

8.int main()  

9.{  

10.//vec1

相關推薦

C++STL學習經典

STL有三大核心部分:容器(Container)、演算法(Algorithms)、迭代器(Iterator),容器介面卡(container adaptor),函式物件(functor),除此之

C++ STL學習 queue

pop out 第一個 code 兩個 push stl queue 註意 本文修改自http://www.cnblogs.com/hdk1993/p/5809180.html 1、使用queue需要聲明頭文件#include <queue> 2、queu

vector--C++ STL 學習

我們 contain gin 創建 vector排序 參考 多種方式 一個 cpp vector對應的數據結構為數組,而且是動態數組,也就是說我們不必關心該數組事先定義的容量是多少,它的大小會動態增長。與數組類似的是,我們可以在末尾進行元素的添加和刪除,也可以進行元素值的隨

C++|STL學習筆記-對STL中關聯容器map的進一步認識

關聯容器map key + value 的值 關聯容器 = 有序容器(紅黑樹) + 無序容器(散列表) + hash_map 有序容器中: map的鍵值是不允許重複的 multimap的鍵值是允許重複的 set是一個集合,鍵值=實值,就是隻包含一個值,既是鍵值也是實值,不允許重複 mul

C++|STL學習筆記-map的基本操作(插入,刪除,遍歷,大到小輸出)【仿大佬寫法】

首先的程式碼是插入,刪除,遍歷 執行截圖如下: 原始碼如下: #include <map> #include <iostream> #include <algorithm> using namespace std; typedef pair

C++ STL學習之 空間配置器(allocator)

標籤(空格分隔): C++ STL 眾所周知,一般情況下,一個程式包括資料結構和相應的演算法,而資料結構作為儲存資料的組織形式,與記憶體空間有著密切的聯絡. 在C++ STL中,空間配置器便是用來實現記憶體空間(一般是記憶體,也可以是硬碟等空間)分配的工具,他與容器聯絡緊密,每一種容器的空間分配都是通過空

C++STL學習——stack與queue容器

stack容器 簡介 stack是一種堆疊容器,是一種"先進後出"的容器。 stack是簡單地裝飾deque容器而成為另外的一種容器 標頭檔案#include<stack> stack物件的預設構造 stack採用模板類實現, stack

C++STL學習——List容器

List容器 List簡介 list是一個雙向連結串列容器,可高效地進行插入刪除元素。 list不可以隨機存取元素,所以不支援at.(pos)函式與[]操作符。It++(ok) it+5(err) 標頭檔案#include<list> lis

c++STL學習——deque

雙端佇列(deque) Deque簡介 deque是“double-ended queue”的縮寫,和vector一樣都是STL的容器,deque是雙端陣列,而vector是單端的。 deque在介面上和vector非常相似,在許多操作的地方可以直接替換。 deq

C++STL學習——Set集合

簡單介紹 集合(Set)是一種包含已排序物件的關聯容器,其中所包含的元素是唯一的,集合中的元素按一定的順序排列。元素插入過程是按排序規則插入,所以不能指定插入位置。 set採用紅黑樹變體的資料結構實現,紅黑樹屬於平衡二叉樹。在插入操作和刪除操作上比vector快。 s

C++|STL學習筆記-map的屬性(大小以及是否存在)

目錄 1.size()的用法 map的property map屬性 1.沒有容量; 2.得到元素的個數size() 這裡給出呼叫他size()的例子,原始碼如下: /*****

c++ STL學習之stack堆疊總結

一、標頭檔案 # include<stack> 二、定義 堆疊是一個線性表,插入和刪除只在表的一端進行。這一端稱為棧頂,另一端稱為棧底。堆疊的元素插入稱為入棧,元素的刪除則為出棧。 堆疊

c++ STL 學習筆記(map )

關於map 在STL的標頭檔案中<map>中定義了模版類map和multimap,用有序二叉樹表儲存型別為 pair<const Key, T>的元素對序列。序列中的元素以const Key部分作為標識,map中所有元素的Key 值必須是唯一的,multimap則

c++ STL 學習筆記(pair 和 set)

STL pair (1)pair 的定義 標頭檔案 <utility> STL的標頭檔案中描述了一個看上去非常簡單的模版類pair,用來表示一個二元組或元素對,並提供了按照字典序對元素對進行大小比較運算子模版函式。 定義一個pair物件表示一個平面座標點: 例:

C++ STL學習之stack。

stack 介紹 棧是一種容器介面卡,特別為後入先出而設計的一種(LIFO ),那種資料被插入,然後再容器末端取出 棧實現了容器介面卡,這是用了一個封裝了的類作為他的特定容器,提供了一組成員函式去訪問他的元素,元素從特定的容器,也就是堆疊的頭取出袁術。 這個基礎的容器可能是

C++ STL學習——queue

(1)首先要引入標頭檔案  #include <queue> . 並使用名稱空間  using namespace std;(2)同stack一樣,queue也不能使用迭代器。因為queue只能在隊尾插入元素,在隊頭刪除元素。不能對裡面的元素進行遍歷。(3)建立q

C++ STL學習筆記四 list雙向連結串列容器

/* * ******************************************** *   list雙向連結串列容器的基礎說明: ******************************************** * * list雙向連結串列容器採用雙向

C++ STL學習之五】容器set和multiset

一、set和multiset基礎 set和multiset會根據特定的排序準則,自動將元素進行排序。不同的是後者允許元素重複而前者不允許。 需要包含標頭檔案: #include <set> set和multiset都是定義在std空間裡的類模板: templ

C++STL學習(11)STL演算法(2)

注:C++ STL演算法部分主要直接來閱讀STL原始碼庫,原始碼來源於http://www.cplusplus.com/網站。     閱讀了下網站上對STL的演算法,才發現講解的已經夠清楚了,那麼久

C++ STL學習之list

LIST 是一個雙向連結串列。 因為本人的C++的程式設計時間有限,目前還沒怎麼用到list,在資料結構中,list是一個比較重要的。 首先複習一下什麼是雙向連結串列。雙向連結串列是一種每個節點都有兩個指標,分別直接的指向了直接前驅和直接後驅。這種方式對訪問一個節點的前後都