1. 程式人生 > 其它 >C++基礎語法學習:STL

C++基礎語法學習:STL

基礎語法學習,少點比較,多些謙虛

1.容器:

常見的容器有以下幾類:

1.vector:向量

2.deque:雙端佇列

3.list:列表

4.set:集合

5:multiset:多重集合

6.map:對映

7:multimap:多重對映

2.迭代器:

迭代器的話,其實可以簡單點理解就是一個指向容器內部的指標,比如我們現在伸出一根指標i,它可以進行任意的前後移動,同時我們可以取到指標i對應的內容,這就是迭代器,然後我們實際上操作這些容器,就是在操作迭代器。

宣告方式有很多,比如s.begin()和s.end(),

容器類名::iterator 迭代器名等

當然了iterator前面還可以加一些限定符,比如const_iterator代表獲得的是常量迭代器,reverse_iterator獲得反向迭代器,const_reverse_iterator獲得常量反向迭代器

宣告迭代器需要標頭檔案

3.函式物件

如果一個類將()運算子過載為成員函式,這個類就稱為函式物件類,這個類的物件就是函式物件。函式物件是一個物件,但是使用的形式看起來像函式呼叫,實際上也執行了函式呼叫,因而得名。

就是,函式物件其實也就是一個類,不過在指定的操作符函式裡對某個資料進行了處理,然後得到一個另外的資料型別,這樣操作起來就好像是在進行了函式操作一樣,目前不知道這樣做有什麼含義

  public:
    double operator()(int a1, int a2, int a3)
    {  //過載()運算子
        return (double)(a1 + a2 + a3) / 3;
    }
};

4.演算法

這個就不多說了,就是一些STL中自帶的方法,比如取平均數,比大小什麼的,這個就不用過多贅述了

STL中的演算法需要包含標頭檔案

5.vector中的屬性和方法

1.構造方法

vector():建立一個空vector
vector(int nSize):建立一個vector,元素個數為nSize
vector(int nSize,const t& t)​:建立一個vector,元素個數為nSize,且值均為t
vector(const vector&):複製建構函式
vector(begin,end):複製[begin,end)區間內另一個數組的元素到vector中

2.增加函式

​void push_back(const T& x)​:向量尾部增加一個元素X
​iterator insert(iterator it,const T& x)​:向量中迭代器指向元素前增加一個元素x
​iterator insert(iterator it,int n,const T& x)​:向量中迭代器指向元素前增加n個相同的元素x
​iterator insert(iterator it,const_iterator first,const_iterator last)​:向量中迭代器指向元素前插入另一個相同型別向量的[first,last)間的資料

3.刪除函式

​iiterator erase(iterator it)​:刪除向量中迭代器指向元素
​iterator erase(iterator first,iterator last)​:刪除向量中[first,last)中元素
​void pop_back()​:刪除向量中最後一個元素
​void clear()​:清空向量中所有元素

4.遍歷函式

​reference at(int pos)​:返回pos位置元素的引用
​reference front()​:返回首元素的引用
​reference back()​:返回尾元素的引用
​iterator begin()​:返回向量頭指標,指向第一個元素
​iterator end()​:返回向量尾指標,指向向量最後一個元素的下一個位置
​reverse_iterator rbegin()​:反向迭代器,指向最後一個元素
​reverse_iterator rend()​:反向迭代器,指向第一個元素之前的位置

5.判斷函式

​bool empty() const​:判斷向量是否為空,若為空,則向量中無元素
​int size() const​:返回向量中元素的個數
​int capacity() const​:返回當前向量所能容納的最大元素值
​int max_size() const​:返回最大可允許的 vector 元素數量值

6.其他函式

​void swap(vector&)​:交換兩個同類型向量的資料
​void assign(int n,const T& x)​:設定向量中前n個元素的值為x
​void assign(const_iterator first,const_iterator last)​:向量中[first,last)中元素設定成當前向量元素

7.常見方法

push_back 在陣列的最後新增一個數據
pop_back 去掉陣列的最後一個數據
at 得到編號位置的資料
begin 得到陣列頭的指標
end 得到陣列的最後一個單元+1的指標
front 得到陣列頭的引用
back 得到陣列的最後一個單元的引用
max_size 得到vector最大可以是多大
capacity 當前vector分配的大小
size 當前使用資料的大小
resize 改變當前使用資料的大小,如果它比當前使用的大,者填充預設值
reserve 改變當前vecotr所分配空間的大小
erase 刪除指標指向的資料項
clear 清空當前的vector
rbegin 將vector反轉後的開始指標返回(其實就是原來的end-1)
rend 將vector反轉構的結束指標返回(其實就是原來的begin-1)
empty 判斷vector是否為空
swap 與另一個vector交換資料

6.deque 雙端佇列:

雙端佇列和向量比起來的話,就是說雙端佇列本身的演算法就是在兩頭新增或刪除資料,其時間複雜度是1,也就是說如果是經常會進行頭尾增刪的資料結構,儘量選用deque,當然用vector應該或者別的資料結構也是可以的,其實這個結構本身感覺沒有其特別的特色,不過要注意的是:eque 容器中儲存元素並不能保證所有元素都儲存到連續的記憶體空間中。

這個感覺不怎麼會用到,所以這裡的話我就不看了,如果將來回看這個有用的話,可以檢視這條部落格

C++ STL deque容器 詳解版

7.list 列表

列表,其實準確的說是一個雙向連結串列,具體怎麼實現的就不過多贅述了,這樣的儲存結構也不用多嘻嘻哈哈別的,它在任意位置增刪的時間複雜度都是1,移動元素的速度也最快,是一個效率非常高的資料結構,這可不是隨便和什麼vector和array可以嘻嘻哈哈的啊。當然了這麼牛逼的list也有它的問題:不能隨機存取資料,也就是說不能像vector那樣直接給一個位置,就可以直接轉到指定的元素上去,而是隻能一個個遍歷,直到找到指定的位置才行。

這個很重要,著重寫一下。

1.建立方法:

std::list<int> values;
std::list<int> values(10);

//拷貝普通陣列,建立list容器
int a[] = { 1,2,3,4,5 };
std::list<int> values(a, a+5);
//拷貝其它型別的容器,建立 list 容器
std::array<int, 5>arr{ 11,12,13,14,15 };
std::list<int>values(arr.begin()+2, arr.end());//拷貝arr容器中的{13,14,15}

2.常用方法

8.set集合

這位更是重量級

set其實也是鍵值對,這點和map很像,但是又有些不同,因為set中的鍵值必須相等,也就是key 和 value兩個值都必須相等,比如
上面的資料就不能組成set,下面的才可以,當然了,既然如此那set就不用寫鍵值對了,直接每個元素寫一個值就可以了。

set容器有兩個特點,一是:不可以存在有重複的鍵值對 二是:輸入元素資料之後會自動排序。

對於初學者來說,切勿嘗試直接修改 set 容器中已儲存元素的值,這很有可能破壞 set 容器中元素的有序性,最正確的修改 set 容器中元素值的做法是:先刪除該元素,然後再新增一個修改後的元素。

1.初始化:

std::set<std::string> myset;

std::set<std::string> myset{"http://c.biancheng.net/java/",
                        "http://c.biancheng.net/stl/",
                        "http://c.biancheng.net/python/"};

std::set<std::string> copyset(myset);
//等同於
//std::set<std::string> copyset = myset

std::set<std::string> myset{ "http://c.biancheng.net/java/",
                "http://c.biancheng.net/stl/",
                "http://c.biancheng.net/python/" };
//copyset方法支援從某個元素開始到某個元素結束,皆可自由指定
std::set<std::string> copyset(++myset.begin(), myset.end());

2.常用方法

3.multiset:

和set的區別?同樣是排序好的集合,但是multiset允許有相同的元素

個人感覺沒什麼含義,不如直接vector排序,追求極致效能的時候可能有用,詳情見

在學習掌握set和multiset過程中,我們會了解到set和multiset是存在一定差異的;
在set中每個元素的值都唯一,並且元素在插入後會自動的為其升序排序,值得注意的是set中數元素的值不能直接被改變。

C++ STL中標準關聯容器set, multiset, map, multimap內部採用的就是一種非常高效的平衡檢索二叉樹:紅黑樹,也成為RB樹(Red-Black Tree)。RB樹的統計效能要好於一般平衡二叉樹,所以被STL選擇作為了關聯容器的內部結構。

區別:
set不能插入已有的資料,即不能重複插入;multiset可以實現;

set在插入資料同時會返回插入成功失敗結果;

multiset不會實現資料監測;

multiset詳解

9.map對映

和set差不多,但是不同的是map是鍵值對,其中的資料是一對一的,且key不能重複,但是value可以,容器會根據key的大小來進行排序,

1.構造方式

std::map<std::string, int>myMap;

std::map<std::string, int>myMap{ {"C語言教程",10},{"STL教程",20} };

std::map<std::string, int>myMap{std::make_pair("C語言教程",10),std::make_pair("STL教程",20)};

std::map<std::string, int>newMap(myMap);

std::map<std::string, int>newMap(++myMap.begin(), myMap.end());

2.常用方法