C++STL學習經典
STL有三大核心部分:容器(Container)、演算法(Algorithms)、迭代器(Iterator),容器介面卡(container adaptor),函式物件(functor),除此之外還有STL其他標準組件。通俗的講:
容器:裝東西的東西,裝水的杯子,裝鹹水的大海,裝人的教室……STL裡的容器是可容納一些資料的模板類。
演算法:就是往杯子裡倒水,往大海里排汙,從教室裡攆人……STL裡的演算法,就是處理容器裡面資料的方法、操作。
迭代器:往杯子裡倒水的水壺,排汙的管道,攆人的那個物業管理人員……STL裡的迭代器:遍歷容器中資料的物件。對儲存於容器中的資料進行處理時,迭代器能從一個成員移向另一個成員。他能按預先定義的順序在某些容器中的成員間移動。對普通的一維陣列、向量、雙端佇列和列表來說,迭代器是一種指標。
下面讓我們來看看專家是怎麼說的:
容器(container):容器是資料在記憶體中組織的方法,例如,陣列、堆疊、佇列、連結串列或二叉樹(不過這些都不是STL標準容器)。STL中的容器是一種儲存T(Template)型別值的有限集合的資料結構,容器的內部實現一般是類。這些值可以是物件本身,如果資料型別T代表的是Class的話。
演算法(algorithm):演算法是應用在容器上以各種方法處理其內容的行為或功能。例如,有對容器內容排序、複製、檢索和合並的演算法。在STL中,演算法是由模板函式表現的。這些函式不是容器類的成員函式。相反,它們是獨立的函式。令人吃驚的特點之一就是其演算法如此通用。不僅可以將其用於STL
迭代器(iterator):一旦選定一種容器型別和資料行為(演算法),那麼剩下唯一要他做的就是用迭代器使其相互作用。可以把達代器看作一個指向容器中元素的普通指標。可以如遞增一個指標那樣遞增迭代器,使其依次指向容器中每一個後繼的元素。迭代器是STL的一個關鍵部分,因為它將演算法和容器連在一起。
下面我將依次介紹STL的這三個主要元件。
1. 容器
STL中的容器有佇列容器和關聯容器,容器介面卡(congtainer adapters:stack,queue,priority queue),位集(bit_set),串包(string_package)
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.//列印vec1和vec2,const_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
STL有三大核心部分:容器(Container)、演算法(Algorithms)、迭代器(Iterator),容器介面卡(container adaptor),函式物件(functor),除此之 pop out 第一個 code 兩個 push stl queue 註意 本文修改自http://www.cnblogs.com/hdk1993/p/5809180.html
1、使用queue需要聲明頭文件#include <queue>
2、queu 我們 contain gin 創建 vector排序 參考 多種方式 一個 cpp vector對應的數據結構為數組,而且是動態數組,也就是說我們不必關心該數組事先定義的容量是多少,它的大小會動態增長。與數組類似的是,我們可以在末尾進行元素的添加和刪除,也可以進行元素值的隨
關聯容器map key + value 的值
關聯容器 = 有序容器(紅黑樹) + 無序容器(散列表) + hash_map
有序容器中: map的鍵值是不允許重複的 multimap的鍵值是允許重複的 set是一個集合,鍵值=實值,就是隻包含一個值,既是鍵值也是實值,不允許重複 mul
首先的程式碼是插入,刪除,遍歷
執行截圖如下:
原始碼如下:
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;
typedef pair 標籤(空格分隔): C++ STL
眾所周知,一般情況下,一個程式包括資料結構和相應的演算法,而資料結構作為儲存資料的組織形式,與記憶體空間有著密切的聯絡. 在C++ STL中,空間配置器便是用來實現記憶體空間(一般是記憶體,也可以是硬碟等空間)分配的工具,他與容器聯絡緊密,每一種容器的空間分配都是通過空
stack容器
簡介
stack是一種堆疊容器,是一種"先進後出"的容器。
stack是簡單地裝飾deque容器而成為另外的一種容器
標頭檔案#include<stack>
stack物件的預設構造
stack採用模板類實現, stack
List容器
List簡介
list是一個雙向連結串列容器,可高效地進行插入刪除元素。
list不可以隨機存取元素,所以不支援at.(pos)函式與[]操作符。It++(ok) it+5(err)
標頭檔案#include<list>
lis
雙端佇列(deque)
Deque簡介
deque是“double-ended queue”的縮寫,和vector一樣都是STL的容器,deque是雙端陣列,而vector是單端的。
deque在介面上和vector非常相似,在許多操作的地方可以直接替換。
deq
簡單介紹
集合(Set)是一種包含已排序物件的關聯容器,其中所包含的元素是唯一的,集合中的元素按一定的順序排列。元素插入過程是按排序規則插入,所以不能指定插入位置。
set採用紅黑樹變體的資料結構實現,紅黑樹屬於平衡二叉樹。在插入操作和刪除操作上比vector快。
s
目錄
1.size()的用法
map的property
map屬性
1.沒有容量;
2.得到元素的個數size()
這裡給出呼叫他size()的例子,原始碼如下:
/*****
一、標頭檔案
# include<stack>
二、定義
堆疊是一個線性表,插入和刪除只在表的一端進行。這一端稱為棧頂,另一端稱為棧底。堆疊的元素插入稱為入棧,元素的刪除則為出棧。
堆疊
關於map
在STL的標頭檔案中<map>中定義了模版類map和multimap,用有序二叉樹表儲存型別為 pair<const Key, T>的元素對序列。序列中的元素以const Key部分作為標識,map中所有元素的Key 值必須是唯一的,multimap則
STL pair
(1)pair 的定義
標頭檔案 <utility> STL的標頭檔案中描述了一個看上去非常簡單的模版類pair,用來表示一個二元組或元素對,並提供了按照字典序對元素對進行大小比較運算子模版函式。
定義一個pair物件表示一個平面座標點: 例:
stack 介紹
棧是一種容器介面卡,特別為後入先出而設計的一種(LIFO ),那種資料被插入,然後再容器末端取出
棧實現了容器介面卡,這是用了一個封裝了的類作為他的特定容器,提供了一組成員函式去訪問他的元素,元素從特定的容器,也就是堆疊的頭取出袁術。
這個基礎的容器可能是
(1)首先要引入標頭檔案 #include <queue> . 並使用名稱空間 using namespace std;(2)同stack一樣,queue也不能使用迭代器。因為queue只能在隊尾插入元素,在隊頭刪除元素。不能對裡面的元素進行遍歷。(3)建立q
/* * ******************************************** * list雙向連結串列容器的基礎說明: ******************************************** * * list雙向連結串列容器採用雙向
一、set和multiset基礎
set和multiset會根據特定的排序準則,自動將元素進行排序。不同的是後者允許元素重複而前者不允許。
需要包含標頭檔案:
#include <set>
set和multiset都是定義在std空間裡的類模板:
templ
注:C++ STL演算法部分主要直接來閱讀STL原始碼庫,原始碼來源於http://www.cplusplus.com/網站。
閱讀了下網站上對STL的演算法,才發現講解的已經夠清楚了,那麼久
LIST 是一個雙向連結串列。
因為本人的C++的程式設計時間有限,目前還沒怎麼用到list,在資料結構中,list是一個比較重要的。
首先複習一下什麼是雙向連結串列。雙向連結串列是一種每個節點都有兩個指標,分別直接的指向了直接前驅和直接後驅。這種方式對訪問一個節點的前後都 相關推薦
C++STL學習經典
C++ STL學習 queue
vector--C++ STL 學習
C++|STL學習筆記-對STL中關聯容器map的進一步認識
C++|STL學習筆記-map的基本操作(插入,刪除,遍歷,大到小輸出)【仿大佬寫法】
C++ STL學習之 空間配置器(allocator)
C++STL學習——stack與queue容器
C++STL學習——List容器
c++STL學習——deque
C++STL學習——Set集合
C++|STL學習筆記-map的屬性(大小以及是否存在)
c++ STL學習之stack堆疊總結
c++ STL 學習筆記(map )
c++ STL 學習筆記(pair 和 set)
C++ STL學習之stack。
C++ STL學習——queue
C++ STL學習筆記四 list雙向連結串列容器
【C++ STL學習之五】容器set和multiset
C++STL學習(11)STL演算法(2)
C++ STL學習之list