stl標準模板庫
一。概述
c++內建的標準模板庫stl可以分為以下6大類:
1.容器
2.迭代器
3.空間分配器
4.介面卡
5.演算法
6.仿函式
1.容器:
概念:用來管理一組元素
分類:序列式容器(sequence containers)
每個元素都有固定位置--取決於插入時機和地點,和元素值無關。
vector、deque、list
關聯式容器(associated containers)
元素位置取決於特定的排序準則,和插入順序無關
string的構造方法:string s;string s1("helloworld");string s2(s1);string s3=s1;
string訪問字串的操作:string s; s.at("helloworld");用這個函式來訪問字串當越界時會丟擲異常,而把string當成字串陣列用陣列下表訪問時,及時越界也不會丟擲異常,容易訪問到界外記憶體引起段錯誤
s.c_str();用來獲取字串的首位址
s.copy()的幾種用法:
string s("helloword");
char buff[100];
s.copy(buff,5,5);//將字串s從第5個開始後面5個字元考給buff;第3個形參不寫的化預設到末尾
s.length();//求字串長度
s.empty();//是否為空,為空返回1
賦值string &assign(const char *s);//把字串s賦值給當前字串
string &assign(const char *s,int n);//把字串s的錢n個字元賦值給當前字串
string &assign(int n,char c);//將n個c賦值給當前字串
string &assign(const char *s,int start,int n);//把字串s從start開始的後n個字元賦值給當前字串
鏈結比較:
int compare(const string &s)const;
int compare(const char *s)const;
返回值,大於返回1;小於返回-1;等於返回0
查詢:int find(char c,int pos=0);//從pos位開始找c字元,返回值為c字元所在的位置
int find(const char *s,int pos =0);//從pos位開始找s字串,返回值為s字串所在的位置
int find(const string &s,int pos =0);//從pos位開始找s字串,返回值為s字串所在的位置
找不到返回-1;
替換:string &replace(int pos,int n,const char *s);
string &replace(int pos,int n,const string &s);//從pos位開始後面n個用字串s替換
插入:string &insert(int pos,const char *s);
string &insert(int pos,const char *s);//在pos位插入s字串
刪除:string &erase (int pos =0,int n=npos);//如果無參的化,預設從頭刪到尾
vector
vector是將元素置於乙個動態陣列中加以管理的容器,vector採用模板類實現,vector物件的預設構造形式
vectorvect;
vectorvecint; //乙個存放int的vector容器。
vectorvecfloat; //乙個存放float的vector容器。
vectorvecstring; //乙個存放string的vector容器。
... //尖括號內還可以設定指標型別或自定義型別。
class ca{};
vectorvecpca; //用於存放ca物件的指標的vector容器。
vectorvecca; //用於存放ca物件的vector容器。由於容器元素的存放是按值複製的方式進行的,所以此時ca必須提供ca的拷貝建構函式(手寫深拷貝函式),以保證ca物件間拷貝正常。
vector(beg,end); //建構函式將[beg, end)區間中的元素拷貝給本身。注意該區間是左閉右開的區間。(這裡的begin和end都是迭代器,也就是類似指標)
vector(n,elem); //建構函式將n個elem拷貝給本身。
vector(const vector &vec); //拷貝建構函式
int iarray = ;
vectorvecinta( iarray, iarray+5 );
vectorvecintb ( vecinta.begin() , vecinta.end() ); //用建構函式初始化容器vecintb
vectorvecintb ( vecinta.begin() , vecinta.begin()+3 );
vectorvecintc(3,9); //此**執行後,容器vecintb就存放3個元素,每個元素的值是9。
賦值vector.assign(beg,end); //將[beg, end)區間中的資料拷貝賦值給本身。注意該區間是左閉右開的區間。
vector.assign(n,elem); //將n個elem拷貝賦值給本身
ector& operator=(const vector &vec); //過載等號操作符
vector.swap(vec); // 將vec與本身的元素互換。
vectorvecinta, vecintb, vecintc, vecintd;
int iarray = ;
vecinta.assign(iarray,iarray+5);
vecintb.assign( vecinta.begin(), vecinta.end() ); //用其它容器的迭代器作引數。
vecintc.assign(3,9);//3個9賦值給
vectorvecintd;
vecintd = vecinta;//等號
vecinta.swap(vecintd);
大小:vector.size(); //返回容器中元素的個數
vector.empty(); //判斷容器是否為空
vector.resize(num); //重新指定容器的長度為num,若容器變長,則以預設值填充新位置。如果容器變短,則末尾超出容器長度的元素被刪除。
vector.resize(num, elem); //重新指定容器的長度為num,若容器變長,則以elem值填充新位置。如果容器變短,則末尾超出容器長度的元素被刪除。
資料訪問:
vec.at(idx); //返回索引idx所指的資料,如果idx越界,丟擲out_of_range異常。
vec[idx]; //返回索引idx所指的資料,越界時,執行直接報錯
迭代器:
迭代器就如同乙個指標。
迭代器提供對乙個容器中的物件的訪問方法,並且可以定義了容器中物件的範圍。
這裡大概介紹一下迭代器的類別。
輸入迭代器:也有叫法稱之為「唯讀迭代器」,它從容器中讀取元素,只能一次讀入乙個元素向前移動,只支援一遍演算法,同乙個輸入迭代器不能兩遍遍歷乙個序列。
輸出迭代器:也有叫法稱之為「只寫迭代器」,它往容器中寫入元素,只能一次寫入乙個元素向前移動,只支援一遍演算法,同乙個輸出迭代器不能兩遍遍歷乙個序列。
正向迭代器:組合輸入迭代器和輸出迭代器的功能,還可以多次解析乙個迭代器指定的位置,可以對乙個值進行多次讀/寫。
雙向迭代器:組合正向迭代器的功能,還可以通過--操作符向後移動位置。
隨機訪問迭代器:組合雙向迭代器的功能,還可以向前向後跳過任意個位置,可以直接訪問容器中任何位置的元素。
目前本系列教程所用到的容器,都支援雙向迭代器或隨機訪問迭代器,下面將會詳細介紹這兩個類別的迭代器。
插入:vector.insert(pos,elem); //在pos位置插入乙個elem元素的拷貝,返回新資料的位置。
vector.insert(pos,n,elem); //在pos位置插入n個elem資料,無返回值。
vector.insert(pos,beg,end); //在pos位置插入[beg,end)區間的資料,無返回值
刪除:vector.clear(); //移除容器的所有資料
vec.erase(beg,end); //刪除[beg,end)區間的資料,返回下乙個資料的位置。
vec.erase(pos); //刪除pos位置的資料,返回下乙個資料的位置。
佇列:deque是「double-ended queue」的縮寫,和vector一樣都是stl的容器,deque是雙端陣列,而vector是單端的。
deque在介面上和vector非常相似,在許多操作的地方可以直接替換。
deque可以隨機訪問元素(支援索引值直接訪問, 用操作符或at()方法,這個等下會詳講)。
deque頭部和尾部新增或移除元素都非常快速。但是在中部安插元素或移除元素比較費時。
需要包含標頭檔案#include
STL 標準模板庫)
此篇只是乙個目錄,將分成單篇去完成 stl 主要有三個部分組成 容器,迭代器,演算法。順序容器 向量 vector 雙端佇列 dequeue 表 list ps copy 方法 關聯容器 集合 set 多重集合 multiset 對映 map 多重對映 multimap 容器介面卡 棧 stack ...
Stl(標準模板庫)
stl 標準模板庫 stl的目的是標準化元件,這樣就不用重新開發,可以使用現成的元件。我們常用到的stl容器有vector list deque map multimap set和multiset。1.簡單概括 如果需要高效的隨機訪問,不在乎插入和刪除的效率,使用vector 類似陣列 2 如果需要...
STL標準模板庫
函式模板的定義與使用 函式家族 語法形式 型別引數 typename 例項化 二次編譯 包含模型。函式模板包含兩種引數,一種是模板引數,即在模板名之前,用一對尖括號括起來的引數 另一種是呼叫引數,在模板名之前,用一對圓括號括起來的引數 如果函式模板呼叫引數的型別相關於該模板時,即使不顯式指定模板引數...