C Primer新筆記之 容器和演算法

2021-06-29 06:36:17 字數 4699 閱讀 6659

包括 vector、deque、list、forward_list、array、string  //其中forward_list、array為c++11的新特性

另外還有3種介面卡,stack、queue、priority_queue;

#include "stdafx.h"

#include #include#include#includeusing namespace std;

int _tmain(int argc, _tchar* argv)

;//後面自動補0

vectorv(a.begin(),a.end());

//vectorv=;//error

v.push_back(0);

v.push_back(1);

v.push_back(2);

for(auto iter=v.begin();iterv1(v);

for(auto iter=v1.rbegin();iter輸出:

01230012 21003210請按任意鍵繼續. . .

思想:這種反向迭代思想不錯,利用別的容器來進行複製構造,但是還是不能像array那樣進行初始化。

assign適用於初始化之後,再用別的容器或者常量來對其賦值

如:v.assigh(c.begin(),c.end())

或者(10,8)//10個8

v1.assign(v.begin(),v.begin()+3);//這裡為從begin開始數3個字元,這是為了跟end()配合

swap

swap(v1,v);//還是很好用的
(1)array都不支援

(2)vector,string支援push_back(),不建議使用insert

(3)deque支援頭尾插

(4)insert(pos,v.begin(),v.end());//在插入位置插入數,返回插入位置

或者insert(插入位置,)//返回剛剛指向

(5)現在還沒有找到emplace和push_back等的區別,都呼叫的是複製建構函式

*iter           front()           at()    

pop_back()   erase ()   (begin,end)  clear

#include "stdafx.h"

#include #include#includeusing namespace std;

int _tmain(int argc, _tchar* argv)

; 列表初始化,都是可以的,但是要vs2012及以上的編譯器

多餘的會被刪掉,但是不會改變容器的大小

capacity()   reserve() shrink_to_fit()       size()

#include "stdafx.h"

#include #includeusing namespace std;

int _tmain(int argc, _tchar* argv)

; //sort和unique操作

v.clear();

v.push_back(0);

v.push_back(2);

v.push_back(3);

v.push_back(2);

v.push_back(3);

sort(v.begin(),v.end());

auto end_iter=unique(v.begin(),v.end());//返回排序消除重複的元素的最後乙個位置,且會覆蓋掉重複的元素,那麼整個容器變得不可信

for(auto iter=v.begin();iter

思想:(1)注意fill操作不能允許為空,但是用back_inserter 還是可以的

(2)注意sort作用還是蠻大的,另外unique是返回乙個迭代器的。

1.1  繫結,形參,可修改捕獲值、修改返回型別等

適用於只在一兩個地方使用的簡單操作

繫結

int sz=4;

auto f=[&sz](int a,int b);//放在主函式內,感覺這個東西還是蠻有用的

sz=5;

cout《輸出:5

因為對捕獲值進行繫結 &sz

反之沒有繫結的話,輸出4

可修改

int sz=4;

auto f=[sz](int a,int b)mutable;//放在主函式內,感覺這個東西還是蠻有用的

sz=5;

cout《輸出:5

在沒有繫結的情況下,要修改sz的值,需要加上mutable,然而若為繫結,則不需要

修改返回型別

int sz=4;

auto f=[sz](int a,int b)mutable -> int;//放在主函式內,感覺這個東西還是蠻有用的

sz=5;

cout《輸出:5

lambda一般是不允許返回兩種型別的,會預設為void,如果非要那麼做,必須加上-> int 其中int為返回型別。

一些泛型演算法

#include #include#include#include#includeusing namespace std;

int main()

; vectorv(a,a+5);

vectorvtemp;

replace(v.begin(),v.end(),2,5);

//替換操作非常強大,但是這種方法不適用於整個文字中子串的替換吧

sort(v.begin(),v.end());//排序也挺方便

for_each(v.begin(),v.end(),(const int &a));//最後乙個引數是判斷

//可以簡寫為(const int &a)

for_each(iter,v.end(),(const int &a)) //根據後面的lambda表示式來判斷。

2、accumulate(v.begin().v.end(),val),是由第三個引數決定初始值,以及做什麼操作,以及返回什麼型別,可以是string,int等,但是如果型別是double,但是初值為0,那麼最後返回的是整形。

3、equal(v.begin(),v.end(),v1.begin())比較兩個容器中的元素,判斷是否相等。第二個容器中的元素至少和第乙個容器中的元素一樣多。

4、fill(v.begin(),v.end(),val)是覆蓋操作

fill_n(v.begin(),n,val) 從這個位置開始,後面的n個元素覆蓋為val,但是會出問題,因為原來本來就沒有這麼多元素。

因此用到auto it=back_inserter(v);其返回乙個迭代器it,當執行*it=val的時候,會呼叫push_back將元素插入。

用法為fill_n(back_inserter(v),n,val) ,會預設呼叫push_back。

5、copy

陣列拷貝如:copy(begin(a1),end(a1),a2),其中a1和a2都是陣列。

6、replace()

7、刪除重複單詞

sort(v.begin(),v.end());//可以過載其排序方法

auto iter=unique(v.begin(),v.end());

v.erase(iter,v.end());

8、字串排序

elimdups(words);//按照字典序排序,消除重複

stable_sort(words.begin().words.end(),(const string &s1,const string &s2);

sets(a,a+3);

set::iterator iter;//不能用auto

for(auto iter=s.begin();iter!=s.end();iter++)

cout<<*iter<<" ";

cout<>b;

while(cin.get()!='\n')//不為為回車,get()函式直接轉化成ascii碼,但是會刪去最後乙個元素,不好用

return 0;

}

思想:(1)在find函式中 iter不能用auto,遍歷的時候可以

(2)對於string型別的set無法用find函式

(3)利用cin.get()來判斷是否輸入回車,但是這種辦法的缺點是,最後乙個字元不能插入,這個問題有待解決

#include "stdafx.h"

#include #include #include using namespace std;

int main()

思想:

(1)第乙個引數為關鍵字,第二個為值key-value

(2)遍歷為利用iter指向來讀取,還是比較方便的

(3)進行查詢的時候若找不到關鍵字,則將關鍵字加入,預設初始化。

1、介紹

map關鍵陣列,儲存關鍵字-值對

set關鍵字即值,即只儲存關鍵字的容器

multimap關鍵字可重複出現

multiset同樣

無序unordered_map//以雜湊函式組織的map

unordered_set

unordered_multimap

unordered_set

C Primer 學習筆記之關聯容器

關聯容器 關聯容器支援通過鍵來高效地查詢和讀取元素。兩個基本的關聯容器型別是map和set。map的元素以鍵 值對的形式組織 鍵用作元素在map的索引,而值則表示所儲存和讀取的資料。set僅包含乙個鍵,並有效地支援關於某個鍵是否存在的查詢。set和map型別的物件不允許為同乙個鍵新增第二個元素。如果...

C Primer 筆記 順序容器

將單一元素型別聚集起來成為容器,然後根據位置來儲存和訪問這些元素 vectorivec listslist dequedstr vector 支援快速隨機訪問 list 支援快速插入 刪除 deque 雙端佇列 stack 後進先出 lifo 棧 queue 先進先出 fifo 佇列 priorit...

C Primer 筆記 關聯容器

關聯容器 associative container 支援通過鍵來高效的查詢和讀取元素。map 關聯陣列,元素通過鍵來儲存和讀取 set 大小可變的集合,支援通過鍵來快速讀取 multimap 支援同乙個鍵出現多次的map型別 multiset 支援同乙個鍵多次出現的set型別 pairp1 建立乙...