STL學習筆記

簡介

  STL(Standard Template Library),即標準模版庫,涵蓋了經常使用的數據結構和算法,並具備跨平臺的特色。STL是C++標準函數庫的一部分,以下圖所示:算法

  

  STL含有容器、算法和迭代器組件,其之間的合做以下圖所示:數組

  

  STL的底層機制都是以RB-tree(紅黑樹)完成的。一個紅黑樹是一棵二叉樹。數據結構

容器

標準序列式容器

字符串(string)

  std::string不能初始化爲NULL數據結構和算法

向量(vector) 

  向量(vector) 連續存儲的元素。函數

  vector和數組相似,擁有一段連續的內存空間,且起始地址不變,所以能很是好的支持隨機存儲ui

  爲了提升效率,vector在添加元素以前最好調用reserve()設置容量spa

(1)清空.net

std::vector<std::string> str;

std::vector<std::string>().swap(str);
str.clear();

(2)刪除符合條件的元素指針

vector<int> iVec;

vector<int>::iterator it;
for(it=iVec.begin();it!=iVec.end();)
{
    if(*it == 0)
    {
        it=iVec.erase(it);//刪除元素,返回值指向已刪除元素的下一個位置    
    }
    else
    {
        ++it;//指向下一個位置
    }
}

  注意:每次調用erase()函數後,被刪除以後的內容會自動往前移。code

(3)使用sort排序,須要頭文件#include<algorithm>

sort(vec.begin(),vec.end());//默認是按升序排列,即從小到大

能夠經過重寫排序比較函數按照降序比較,定義排序比較函數以下:

bool Comp(const int &a,const int &b)
{
    return a>b;
}

按以下方式調用便可實現降序排序:

sort(vec.begin(),vec.end(),Comp)

列表(list)

  列表(list) 由節點組成的雙向鏈表,每一個結點包含着一個元素。

  list是由數據結構中的雙向鏈表實現的,其內存空間能夠是不連續的只能經過指針來進行數據的訪問。因爲鏈表的特色,其能夠以很好的效率支持任意地方的刪除和插入

雙端隊列(deque)

  雙端隊列(deque) 連續存儲的指向不一樣元素的指針所組成的數組。

  deque是由一段一段定量的連續空間組成的,是動態數組類型。

容器適配器

棧(stack) 

  棧(stack) 後進先出的值的排列。

隊列(queue) 

  隊列(queue) 先進先出的值的排列。

優先隊列(priority_queue) 

  優先隊列(priority_queue) 元素的次序是由做用於所存儲的值對上的某種謂詞決定的的一種隊列。

標準關聯式容器

  關聯容器的內部結構是一個平衡二叉樹(balanced binary tree)。平衡二叉樹有以下幾種:

  • AVL-tree
  • RB-tree
  • AA-tree

集合(set) 

  集合(set) 由節點組成的紅黑樹,每一個節點都包含着一個元素,節點之間以某種做用於元素對的謂詞排列,沒有兩個不一樣的元素可以擁有相同的次序。

多重集合(multiset)

  多重集合(multiset) 容許存在兩個次序相等的元素的集合。

映射(map)

  映射(map) 由{鍵,值}對組成的集合,以某種做用於鍵對上的謂詞排列。map底層是紅黑樹RB-tree

(1)按鍵排序

爲了實現快速查找,map內部自己就是按序存儲的(好比紅黑樹)。在咱們插入<key, value>鍵值對時,就會按照key的大小順序進行存儲。默認排序是按照從小到大

//按鍵排序,默認排序是按照從小到大
std::map<int,std::string> mapScore;  
mapScore.insert(std::make_pair(99,"sun"));  
mapScore.insert(std::make_pair(79,"gao")); 
mapScore.insert(std::make_pair(86,"zhao"));  
mapScore.insert(std::make_pair(92,"yuan")); 

(2)按值排序

//按值排序
struct CmpByValue {  
    bool operator()(const std::pair<std::string,int> & lhs, const std::pair<std::string,int> & rhs)
    {return lhs.second > rhs.second;}  
};
std::map<std::string, int> mapScore;  
mapScore["LiMin"] = 90;  
mapScore["ZiLinMi"] = 79;  
mapScore["BoB"] = 92;  
mapScore.insert(std::make_pair("Bing",99));  
mapScore.insert(std::make_pair("Albert",86));  
//把map中元素轉存到vector中   
std::vector<std::pair<std::string, int>> vecMapScore(mapScore.begin(), mapScore.end());  
sort(vecMapScore.begin(), vecMapScore.end(), CmpByValue()); 

  參考連接:http://blog.csdn.net/iicy266/article/details/11906189?utm_source=tuicool&utm_medium=referral

多重映射(multimap)

  多重映射(multimap) 容許鍵對有相等的次序的映射。

非標準關聯式容器

  hashmap、hashset、hashtable,底層是哈希表。

迭代器

算法

相關文章
相關標籤/搜索