STL使用總結

2021-09-27 07:18:31 字數 4450 閱讀 1530

emm使用stl也有一段時間,但都是偶爾查查部落格一些零碎的用法,沒有系統的看過,沒有系統的學習過,看了晴神的演算法筆記決定寫一篇部落格總結一下,當然在以後的使用中遇見其他的用法也會記錄下來,迭代加遞迴學習吧,keep learning

標頭檔案:#includeusing namespace std;

宣告:vectorv1;typename可以是基本資料型別,結構體和其他stl容器,如果是stl容器,在c++11之前要在末尾的》中間加乙個空格,否則會識別成移位操作。

vector是可變長的陣列,也可宣告成二維的定長/變長陣列:vectorv1[100];這樣在一維上是定長的,在二維上是變長的;甚至還可以:vector> v1;這樣在兩個維度上都是變長的

push_back():在vector末尾新增乙個元素,時間o(1)

pop_back():彈出vector末尾元素,時間o(1)

front():返回vector的第乙個元素值,但不彈出,若vector為空會報段錯位

back():返回vector的最後乙個元素值,但不彈出,若vector為空會報段錯誤

size():獲取vector元素個數,時間o(1),返回的是無符號整數

clear():清空vector,時間o(n)

insert(迭代器it,元素值x):在迭代器指向的位置插入元素x,時間o(n)

erase(迭代器it):刪除it指向的值

erase(迭代器first,迭代器last):刪除[first,last)間的值

empty():vector判空,空返回true,不空返回false

rbegin():返回指向尾部的指標,rend():返回指向頭部的前乙個指標,依然用

for (auto it = vector1.rbegin(); it != vector1.rend(); it++)  // 遍歷陣列
1. 對於預設資料型別

2. 對於結構體型別

標頭檔案:#includeusing namespace std;

宣告:sets1;typename可以是基本資料型別和結構體和其他stl容器,若是stl容器,c++11之前要在末尾》中間加上空格;若是結構體,則必須在結構體內寫好比較函式,因為set給元素自動排序,否則會有編譯錯誤;map也一樣

sets1[100];意思跟上面vector一樣

set只能通過迭代器訪問:sets1::iterator it = s1.begin();或者auto it = s1.begin(),同樣都是it != s1.end(),取出元素用*it

insert(元素x):插入乙個元素,並自動排序,時間log(n)

find(value):查詢元素,返回值為value的迭代器,未找到返回s1.end(),時間log(n)

erase(迭代器it):刪除it指向的元素,可以結合find使用(erase(s1.find(100))),時間o(1)

erase(value):直接刪除值,這個在基本資料型別中常用,時間o(logn)

erase(first,last):刪除區間[first,last)

size():獲取set內元素個數

clear():清空set

empty():判空

count():判斷set中某個元素的個數,沒有就返回0,常用來判斷集合中是否存在某個元素

set常用來處理唯一的情況,若要處理不唯一的情況,用multiset(復集合),還有一種容器(c++11支援)unorder_set(無序set),用雜湊替代set的紅黑樹,只去重而不自動排序(結構體中可以不必寫比較函式),時間比set快的多

標頭檔案:#includeusing namespace std;(注意不是,這個是字串操作函式庫)

宣告:string s;string的輸入只能用cin,輸出可以用cout或者printf(s.c_str())

+=:拼接字串

==,!=,<,<=,>,>=:按照字典序比較大小,內部已經實現了,不必自己寫

length()/size():返回字串的長度,但是我常用length()

insert(pos,string):在pos位置插入string

insert(it,it2,it3):it表示源字串的欲插入位置,it2和it3是待插字串的首尾迭代器[it2,it3),被插在it的位置上

erase(it):刪除單個元素,it是需要刪除元素的迭代器

erase(first,second):兩個引數都是迭代器,刪除[first,second)中間的字串

erase(int pos,int length):刪除從pos開始的length長度的字串;若省略第二個引數,則是刪除從pos位置開始一直到字串末尾的子串,和substr一樣

clear():清空字串

empty():判空

substr(int pos,int length):取從pos開始的length長度的子串;若省略第二個引數,則是取從pos位置開始一直到字串末尾的子串

find(string str):返回str在字串中第一次出現的位置的下標,未匹配返回-1

find(char c):返回c第一次在s**現的位置,未找到返回-1

replace(int pos, int len, string str):從pos開始,長度為length的子串替換為str

replace(it,it2,str):迭代器[it,it2)中的子串替換為str

標頭檔案:#includeusing namespace std;

宣告:mapm;typename作為stl時候,c++11前》中要加空格;key作為結構體時,要提前寫好比較函式

find(key):返回鍵為key的迭代器,未找到返回map.end()

erase(it):it為需要刪除的元素的迭代器,時間o(1)

erase(key):直接刪除鍵為key的元素,時間o(logn)

erase(first,last):刪除迭代器區間在[first,last)的元素

size():返回元素個數

clear():清空map

empty():判空

標頭檔案:#includeusing namespace std;

宣告:queueq;

push(data):將元素入隊,新增在隊尾

front():返回隊首元素,並不彈出

back():返回隊尾元素,並不彈出

pop():彈出隊首元素,沒有返回值

empty():判空

size():返回佇列元素個數

queue沒有clear()函式

標頭檔案:#includeusing namespace std;(對,沒錯在queue的標頭檔案裡,沒有專門的優先佇列的標頭檔案)

宣告:priority_queuepq;typename若是結構體,必須寫好比較函式

push(data):元素入堆,同時調整堆結構,就是按照大小關係或者比較函式調整

pop():彈出堆頂元素,沒有返回值

top():返回堆頂元素,但並不彈出

empty():判空

size():返回堆元素的個數

堆沒有clear()函式

也有把比較函式寫在外面的,在宣告優先佇列的時候加進去(其實沒有寫在結構體內舒服)

priority_queue, cmp> priority_queue1;
對一些演算法進行效率上的優化,比如dijkstra演算法,因為堆在排序問題和提取最大元素的問題上效率很高

在使用堆的時候,top()前要判empty()

標頭檔案:#includeusing namespace std;

宣告:stacks;

push(data):元素入棧

pop():彈出元素,沒有返回值

top():返回棧頂元素,並不彈出

empty():判空

size():返回元素個數

stack也沒有clear()函式

常用來模擬遞迴,當遞迴層數過多的時候,程式棧容易溢位,用stack可以避免這個問題,其實這樣用的非常少

用到的時候再查吧

STL使用總結

使用vector,需要包含標頭檔案 include 一般來說 include 的查詢位置是標準庫標頭檔案所在目錄,include 的查詢位置是當前原始檔所在目錄。不過這些都可由編譯器呼叫引數等配置更改。一般我們都用的是 只有有時使用了 include bits stdc h 1 vector物件的比...

STL容器使用總結

include include include include include include 優先佇列,大的元素自動排在隊頭 include key唯一,重複會覆蓋 多重對映,允許有重複的key include 集合 相當於沒有value的對映using namespace std void pu...

STL之List使用總結

list是我們常用的stl標準容器之一,它是一種序列式容器,在資料結構上和雙向鍊錶結構類似,list中的資料元素是通過鍊錶指標串連邏輯意義上的線性表,因此,鍊錶的特點是支援元素在任意位置的插入刪除,且效率很高。list實際上就是我們資料結構中的雙向鍊錶,它的記憶體是不連續的,通過指標來進行資料訪問,...