c p stl

首先說明, stl 是一個很龐大的系統庫, 包含 容器, 算法, 迭代器 , 仿函數, 適配器

其實在上面的幾個部分, 我們最關心的應該是 容器, 和迭代器了吧
參考: https://www.nhooo.com/cpp/cpp-stl-tutorial.html

容器

組成部分
分為向量(vector),雙向隊列(deque),表(list),隊列(queue),堆棧(stack),集合(set),多重集合(multiset),映射(map),多重映射(multimap)

容器共同的函數
  • 大小相關:
    size(), 大小
    empty(), 是否空
    max_size() 最大容量

  • 迭代器相關
    begin(),end(), 從頭開始
    rbegin(),rend() 從尾開始

  • 比較操作
    ==,!=,<,>,>=

容器 算法 迭代器

vector

向量(Vector)和數組(array)之間的區別
array 不能動態修改大小,vector 可以在運行時動態擴展大小

創建格式

#include <vector>
vector<object_type> v1;

實例

#include<iostream>
#include<vector>
using namespace std;
int main()
{
    vector<string> v1;
    v1.push_back("nhooo");
    v1.push_back(".com");
    for(vector<string>::iterator itr=v1.begin();itr!=v1.end();++itr){
        cout<<*itr;
    }
    return 0; 
}

訪問的話,可以使用迭代器,索引或者 at 函數

  • 操作函數
    at(index) 返回索引處的元素, 越界報錯
vector<object_type>  v;
v.at(k) ;

back() 返回最后一個元素的引用

vector<string>  fruit{"mango","apple","banana"};
    cout<<fruit.back();
> "banana"
  • front() 返回第一個元素
vector<string>  language{"java","C","C++"};
cout<<language.front();
  • 交換兩個向量
v1.swap(v2);
  • 最后添加元素
v.push_back(k)
  • 刪除最后的元素
v.pop_back();
  • 判斷vector 是不是空的
bool v.empty()
  • 指定位置插入元素
insert(iterator,val);
insert(iterator,n,val);
insert(iterator,InputIterator first,InputIterator last);

iterator:迭代器定義位置,將在其中插入新元素。

val:val是指定要插入的值。

n:該值出現的次數。

(first,last):它定義了要插入的元素范圍。

實例:

vector<int> v{1,2,3,4,5};
    vector<int> v1{6,7,8,9,10};
    v.insert(v.end(),v1.begin(),v1.begin()+5);
for(int i=0;i<v.size();i++)
    cout<<v[i]<<" ";

> 1 2 3 4 5 6 7 8 9 10
  • 刪除指定元素
v.erase(pos);
v.erase(start_iterator,end_iterator);

pos:它定義要從向量(vector)中刪除的元素的位置。

(start_iterator,end_iterator):它定義要從向量(vector)中刪除的元素的范圍。

 vector<string> fruit{ "芒果", "蘋果", "草莓", "獼猴桃", "香蕉" };
fruit.erase(fruit.begin() + 1, fruit.begin() + 3);
> fruit : 芒果 獼猴桃 香蕉
  • 修改向量大小,截取或元素填充
v.resize(n,val);

n:這是新的向量(vector)大小。

val:如果n大于當前向量(vector)大小,則將value(val)插入添加的空間中。

如果 n 小于當前長度,則截取前  n 個元素

vector<string>  v1{"java","C","C++"};
v1.resize(5,".Net");
>v1:  java C C++ java C C++ .Net .Net
  • 清空元素
v.clear();
  • 獲取元素數量
int n=v.size();
  • 向量容量 >= size() 返回的數
int c=v.capacity();
  • 批量賦值元素
v.assign(first,last);
v.assign(n,val);
(first,last):它定義了范圍。將區間(first,last)的元素賦值到當前的vector容器中。

n:出現值的次數。

val:它定義要分配的值。

vector<int> v{1,2,3,4,5};
    vector<int> v1;
    v1.assign(v.begin()+1,v.end()-1);
v1:  2 3 4

vector<char> v;
v.assign(5,'C');
>v:  CCCCC
  • 迭代器位置
iterator it=v.end()
iterator it=v.begin()

更多函數


image.png
image.png

list

List是連續的容器,而vector是非連續的容器
列表中遍歷速度很慢,因為列表元素是按順序訪問的,而vector支持隨機訪問

 list<int> l;
list<int>  new_list{1,2,3,4};
or
list<int> new_list = {1,2,3,4};
  • insert
iterator insert( iterator pos, const value_type value);
void insert( iterator pos, int n, const value_type value);
void insert( iterator pos, InputIterator first, InputIterator last);

更多方法:


image.png
  • 隊列
    queue
    和其他類型不同的是, queue 是先進先出的結構。
template<class T, class Container = deque<T> > class queue;
方法:

empty   
size 
front   取出第一個元素
back  取出最后一個元素
push 末尾新增元素
pop  刪除第一個元素


queue <int> fquiz;
    fquiz.push(10);
    fquiz.push(20);
    fquiz.push(30);

    cout << "隊列fquiz是 : ";
    showsg(fquiz);

    cout << "\nfquiz.size() : " << fquiz.size();
    cout << "\nfquiz.front() : " << fquiz.front();
    cout << "\nfquiz.back() : " << fquiz.back();

map

typedef pair<const Key, T> value_type;

  • 添加數據
mapPerson.insert(pair < int,string > (1,"Jim"));
mapStudent.insert(map<int, string>::value_type (1, "student_one"));  

mapPerson[1] = "xxxx"

不同的是 [] 這種添加數據, 會覆蓋相同的key, 二 insert 如果有相同的 key 存在,則不會新增成功

pair<map<int, string>::iterator, bool> Insert_Pair;
Insert_Pair = mapStudent.insert(map<int, string>::value_type (1, "student_one"));
if(Insert_Pair.second == true)  
        cout<<"Insert Successfully"<<endl;  
  • map 大小
Int nSize = mapStudent.size();

  • map 遍歷
for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)  
 
       cout<<iter->first<<' '<<iter->second<<endl;  

first 是 key   second 是 value
for(int nindex = 1; nindex <= nSize; nindex++)  
        cout<<mapStudent[nindex]<<endl;  
>>  注意 index 是從 1 開始
  • map 取值
map<int, string>::iterator iter;  
    iter = mapStudent.find(1);  
    if(iter != mapStudent.end())  ;
       cout<<"Find, the value is "<<iter->second<<endl;  
  • map 刪除元素
    erase() 參數可以是 一個 iterator, 也可以是兩個 iterator (這個范圍全部刪除) 或者是一個具體的key
map<int, string>::iterator iter;  
  
       iter = mapStudent.find(1);  
  
       mapStudent.erase(iter);    

int n = mapStudent.erase(1);//如果刪除了會返回1,否則返回0  
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,882評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,208評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,746評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,666評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,477評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,960評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,047評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,200評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,726評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,617評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,807評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,327評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,049評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,425評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,674評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,432評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,769評論 2 372

推薦閱讀更多精彩內容

  • 前言 Standard Template Library (STL)提供了四個部分,算法,容器,函數和迭代器。這里...
    wwwzy閱讀 511評論 0 1
  • 目錄 STL的六大部件介紹 容器分類 序列式容器介紹(vector、list、deque) 關聯式容器 資料 收獲...
    yabin小站閱讀 830評論 0 3
  • (2020.12.08 Tues)STL容器允許重復利用已有的實現構造自己特定類型下的數據結構,通過設置一些模板類...
    Mc杰夫閱讀 297評論 0 0
  • 原文地址: https://www.cnblogs.com/CnZyy/p/3317999.html 一、STL簡...
    Caiaolun閱讀 1,083評論 0 5
  • 更新日期:2019-09-11 概述 在使用容器之前,您應該至少了解 C++ 的基礎知識,以及數據結構的基礎知識(...
    行也成文閱讀 293評論 0 0