欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

【算法設計與分析】2.常見STL總結-創(chuàng)新互聯

寫在前面

創(chuàng)新互聯是專業(yè)的通化網站建設公司,通化接單;提供成都網站建設、網站設計,網頁設計,網站設計,建網站,PHP網站建設等專業(yè)做網站服務;采用PHP框架,可快速的進行通化網站開發(fā)網頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網站,專業(yè)的做網站團隊,希望更多企業(yè)前來合作!

【算法設計與分析】這一系列是作者在本學期學習算法的時候做的筆記,由于本人水平有限,對很多概念的理解比較淺顯😭,歡迎各位大佬多多評價,多多批評指正,希望與大家互相交流學習👻。

參考資料

[1] Mark Allen Weiss 《數據結構與算法分析C語言描述》
[2] Stephen Prata《C Primer Plus》
[3] 余文溪 黃襄念《C++ STL——數據結構與算法實現》
[4] HUST算法設計與分析組 PPT
[5]高暢 《LeetCode 101:和你一起輕松刷題》

最后更新時間

2022-11-25 22:40


文章目錄
  • 2.常見STL總結
    • 2.1 vector
    • 2.2 set
    • 2.3 string
    • 2.4 map
    • 2.5 queue
    • 2.6 priority_queue
    • 2.7 stack
    • 2.8 pair

2.常見STL總結 2.1 vector

定義

#includevectorname;

??上面這個定義其實就是相當于定義了一個一維數組name[SIZE],只不過其長度可以根據需要進行變化。
??如果typename也是一個STL容器,定義的時候需要在>>符號之間加上一個空格,防止編譯器誤以為是移位符。

vector>name;

??定義二維數組有以下兩種方式:

vectorname[SIZE];
vector>name;

??動態(tài)開辟二維vector:

int m = 3;//行數
int n = 4;//列數
vector>Name(m, vector(n));//默認初始化為0
for (int i = 0; i< m; i++)
{for (int j = 0; j< n; j++)
	{cout<< Name[i][j];
	}
	cout<< endl;
}

內部元素的訪問

  1. 下標
    直接使用name[index]即可。
  2. 迭代器
    一個類似于指針的東西,定義為
vector::iterator it;

??然后就可以用這個迭代器來訪問容器內的元素:

#include#includeusing namespace std;
int main()
{vectorvi;
	for (int i = 1; i<= 5; i++)
	{vi.push_back(i);
	}
	vector::iterator it = vi.begin();
	for (int i = 0; i< 5; i++)
	{cout<< *(it + i);
	}
	return 0;
}

??其中,vi.begin()為取vi的首元素地址,it指向這個地址。再引入vi.end(),它是去取尾元素地址的下一個地址,不是尾元素地址。
??還有另一種使用迭代器遍歷的方法:

#include#includeusing namespace std;
int main()
{vectorvi;
	for (int i = 1; i<= 5; i++)
	{vi.push_back(i);
	}
	for (vector::iterator it = vi.begin(); it != vi.end(); it++)
	{cout<< *it;
	}
	return 0;
}

??注意vector迭代器并不支持it的寫法,所以只能用it!=vi.end()。

push_back()
??push_back(x)就是在vector最后添加一個元素x,時間復雜度為 O ( 1 ) O(1) O(1)。

#include#includeusing namespace std;
int main()
{vectorvi;
	for (int i = 1; i<= 3; i++)//將1、2、3依次插入vi末尾
	{vi.push_back(i);
	}
	for (int i = 0; i< vi.size(); i++)
	{cout<< vi[i];
	}
	return 0;
}

pop_back()
??pop_back用以刪除vector的尾元素,時間復雜度 O ( 1 ) O(1) O(1)。

#include#includeusing namespace std;
int main()
{vectorvi;
	for (int i = 1; i<= 3; i++)//將1、2、3依次插入vi末尾
	{vi.push_back(i);
	}
	vi.pop_back();
	for (int i = 0; i< vi.size(); i++)
	{cout<< vi[i];//輸出1 2
	}
	return 0;
}

size()
??size()用來獲得vector中元素的個數,返回unsigned類型,時間復雜度為 O ( 1 ) O(1) O(1)。

clear()
??clear()直接清空vector中所有的元素,時間復雜度為 O ( N ) O(N) O(N),N為元素的個數。

insert()
??insert(it,x)用來向vector的迭代器it處插入一個元素x,時間復雜度為 O ( N ) O(N) O(N)。

#include#includeusing namespace std;
int main()
{vectorvi;
	for (int i = 1; i<= 5; i++)
	{vi.push_back(i);//1 2 3 4 5
	}
	vi.insert(vi.begin() + 2, -1);
	for (int i = 0; i< vi.size(); i++)
	{cout<< vi[i];//1 2 -1 3 4 5
	}
	return 0;
}

erase()
??1. 刪除單個元素erase(it)。

#include#includeusing namespace std;
int main()
{vectorvi;
	for (int i = 1; i<= 5; i++)
	{vi.push_back(i);//1 2 3 4 5
	}
	vi.erase(vi.begin() + 3);
	for (int i = 0; i< vi.size(); i++)
	{cout<< vi[i];//1 2 3 5
	}
	return 0;
}

??2.刪除一個區(qū)間內的所有元素earse(first,last),區(qū)間左閉右開。

#include#includeusing namespace std;
int main()
{vectorvi;
	for (int i = 1; i<= 5; i++)
	{vi.push_back(i);//1 2 3 4 5
	}
	vi.erase(vi.begin() + 1, vi.begin() + 3);
	for (int i = 0; i< vi.size(); i++)
	{cout<< vi[i];//1 4 5
	}
	return 0;
}

主要用途

  1. 作為數組存儲數據,尤其適用于元素不確定的場合。
  2. 為了能夠滿足數據中間用空格隔開并且最后一個數據后面不能有額外的空格,可以先用vector記錄所有需要輸出的數據,然后一次性輸出。
  3. 用鄰接表存儲圖。
2.2 set

定義

setname;

??set翻譯為集合,是一個內部自動有序且不含重復元素的容器。

元素訪問
??注意,由于除了vector和string之外的STL容器都不支持*(it+i)的訪問方式,所以只能按以下方式枚舉:

#include#includeusing namespace std;
int main()
{setst;
	st.insert(3);
	st.insert(5);
	st.insert(2);
	st.insert(3);
	for (set::iterator it = st.begin(); it != st.end(); it++)
	{cout<< *it<< endl; //2 3 5
	}
	return 0;
}

??可以發(fā)現,set內的元素自動遞增排序,且自動去除了重復的元素。

insert()
??insert(x)可以將x插入到set容器中,并且自動排序和去重,時間復雜度為 O ( log ? N ) O(\log N) O(logN),N為元素個數。

find()
??find(value)返回set中對應值為value的迭代器,時間復雜度為 O ( log ? N ) O(\log N) O(logN)。若不存在,則返回st.end()

#include#includeusing namespace std;
int main()
{setst;
	for (int i = 1; i<= 3; i++)
	{st.insert(i);
	}
	set::iterator it = st.find(2);
	cout<< *it<< endl;
	it = st.find(4);
	if (it == st.end())
	{cout<< "Not found"<< endl;
	}
	return 0;
}

erase()
??1.刪除單個元素:st.erase(it),it為所需要刪除元素的迭代器,可結合find()函數實現,時間復雜度 O ( 1 ) O(1) O(1)。或者st.erase(value),value為所需要元素的值,時間復雜度 O ( log ? N ) O(\log N) O(logN)。

st.erase(st.find(100));
st.erase(100);

??2.刪除一個區(qū)間內的所有元素:st.erase(first,last),first為所需要刪除區(qū)間的起始迭代器,last為所需要刪除區(qū)間的末尾迭代器的下一個地址。

st.erase(st.find(100),st.end());//刪除元素30到末尾之間的元素

size()
??獲取set內元素的個數,時間復雜度 O ( 1 ) O(1) O(1)。

clear()
??清空set中所有的元素,時間復雜度 O ( N ) O(N) O(N)。

主要用途

  1. 自動去重并按升序排序。
  2. set中元素唯一,如果遇到不唯一的情況,需要使用multiset。
  3. C++11添加了unordered_set,使其去重但不排序,速度比set快很多。
2.3 string

定義

#include//注意string和string.h是不一樣的頭文件
string str;
string str="abcd";

元素訪問

  1. 元素下標
string str="abcd";
cout<
  1. 迭代器
string::iterator it;
string str="abcd";
for(it=str.begin();it!=str.end();it++)
{cout<<*it;
}

operatpr+=
??string的加法,可以將string直接拼接起來。

string str1="abc";
string str2="def";
string str3=str1+str2;//將str1和str2拼接,賦給str3
str1+=str2;//將str2直接拼接到str1上

compare operator
??兩個string類型可以直接使用==,!=,<,<=,>,>=比較大小,比較順序是字典序。

#include#includeusing namespace std;
int main()
{string str1 = "aa";
	string str2 = "aaa";
	string str3 = "abc";
	string str4 = "xyz";
	if (str1< str2) cout<< "ok1"<< endl;//ok1
	if (str1 != str3) cout<< "ok2"<< endl;//ok2
	if (str4 >= str3) cout<< "ok3"<< endl;//ok3
	return 0;
}

length()/size()
??length()返回字符串存放的字符數,時間復雜度為 O ( 1 ) O(1) O(1),size()與其用法基本相同。

insert()

  1. insert(pos,string),在pos號位置插入字符串string,時間復雜度 O ( N ) O(N) O(N)。
string str="abcxyz",str2="opq";
str.insert(3,str2);
cout<
  1. insert(it,it1,it2),it為原字符串欲插入的位置,it2和it3為待插字符串的首尾迭代器,用來表示串[it2,it3)將被插在it的位置上,時間復雜度 O ( N ) O(N) O(N)。
string str1="abcxyz",str2="opq";
str1.insert(str1.begin()+3,str2.begin(),str2.end());//abcopqxyz

erase()

  1. erase(it),刪除單個元素,it為元素的迭代器,時間復雜度 O ( N ) O(N) O(N)。
  2. erase(first,last),刪除區(qū)間內的元素,時間復雜度 O ( N ) O(N) O(N)。
  3. erase(pos,length),pos為需要刪除的起始位置,length為要刪除的長度,時間復雜度 O ( N ) O(N) O(N)。

clear()
??清空string中的所有元素,時間復雜度 O ( 1 ) O(1) O(1)。

substr()
??substr(pos,len)返回從pos開始,長度為len的子串,時間復雜度為 O ( l e n ) O(len) O(len)

string::npos
??它是一個常數,值為-1,用作find函數失配時的返回值。

find()
??str1.find(str2),當str2時str1的子串時,返回其在str中第一次出現的位置,否則返回string::npos。
str1.find(str2,pos)從str1的pos號開始匹配,返回值同上。時間復雜度 O ( m n ) O(mn) O(mn),m和n分別是str1和str2的長度。

replace()
??str1.replace(pos,len,str2)把str1從pos號位置開始,長度為len的子串替換為str2。
str1.replace(it1,it2,str2)把str1的迭代器[it1,it2)范圍的子串替換為str2。

#include#includeusing namespace std;
int main()
{string str1 = "abcxyz";
	string str2 = "opq";
	str1.replace(3, 4, str2);
	cout<< str1<< endl;//abcopq
	str1.replace(str1.begin() + 1, str1.end(), str2);
	cout<< str1<< endl;//aopq
}
2.4 map

??map翻譯為映射,類似于hash表,能將某個類型的元素映射到另一個類型的元素。

定義

mapmp;

??其中前一個為鍵(key),后一個為值(value)。map中的鍵是唯一的。如下面的代碼:

mapmp;
mp['c']=20;
mp['c']=30;

最后c的映射應該為30,20被覆蓋掉。

元素訪問
??1.通過下標訪問。
??2.通過迭代器訪問。
因為map的每一對映射都有兩個typename,所以map可以使用it->firstit->second來分別訪問map中的key和value。
??另外,map中的元素會以鍵的次序從小到大自動排序,其內部使用紅黑樹實現。

find()
??find(key)返回鍵為key的映射的迭代器,時間復雜度為 O ( N ) O(N) O(N)。

#include#includeusing namespace std;
int main()
{mapmp;
	mp['c'] = 100;
	map::iterator it = mp.find('c');
	cout<< it->first<< ":"<< it->second<< endl;//c:100
	it = mp.find('b');
	if (it == mp.end())
		cout<< "Not Found"<< endl;
	return 0;
}

erase()/size()/clear()
??與前面大致相同,不再介紹。

map的常見用途

  1. 建立字符(字符串)與整數之間的映射關系,減少代碼量。
  2. 判斷大整數或其他類型的數據是否存在。
  3. 字符串到字符串的映射也有可能遇到。
  4. 如果一個鍵需要對應多個值,則需要使用multimap。另外C++11中添加了unordered_map,使其只處理映射而不按key排序,速度比map快很多。
2.5 queue

??queue翻譯為隊列,在STL中是一個先進先出的容器。

定義

queuename;

元素訪問
??由于queue本身是一種先進先出的限制性數據結構,因此只能通過front()來訪問隊首元素,或back()訪問隊尾元素。

#include#includeusing namespace std;
int main()
{queueq;
	for (int i = 1; i<= 5; i++)
	{q.push(i);//將i入隊
	}
	cout<< q.front()<< endl;//1
	cout<< q.back()<< endl;//5
	return 0;
}

push()
??push(x)將x入隊,時間復雜度 O ( 1 ) O(1) O(1)。

pop()
??pop()將隊首元素出列,時間復雜度 O ( 1 ) O(1) O(1)。

front()/back()
??分別獲得隊首元素和隊尾元素,時間復雜度 O ( 1 ) O(1) O(1)。

empty()
??empty()檢測queue是否為空,返回true則為空,返回false則非空,時間復雜度 O ( 1 ) O(1) O(1)。

size()
??返回queue中元素的個數,時間復雜度 O ( 1 ) O(1) O(1)。

queue常見用途

  1. 廣度優(yōu)先搜索時,可以不用自己手動實現隊列。
  2. 雙端隊列deque、優(yōu)先隊列priority_queue,前者是首位皆可插入和刪除的隊列,后者則是使用堆實現的默認將當前隊列大元素置于隊首的容器。
2.6 priority_queue

??稱為優(yōu)先隊列,其底層是用堆來實現的。在優(yōu)先隊列中,隊首元素一定是當前隊列中優(yōu)先級最高的那一個。

定義

priority_queuename;

元素訪問
??優(yōu)先隊列沒有front()和back(),只能通過top()函數訪問隊首元素,也稱堆頂元素。

#include#includeusing namespace std;
int main()
{priority_queueq;
	q.push(3);
	q.push(4);
	q.push(1);
	cout<< q.top()<< endl;//4
	return 0;	
}

push()/pop()/empty()/size()
??與queue相同,不再介紹。

優(yōu)先級的設置

  1. 基本數據類型的優(yōu)先級設置(以int為例)。
priority_queueq;
priority_queue,less>;
priority_queue,greater>;

其中,第二個參數vector是用來承載底層數據結構堆的容器,第三個參數則是對第一個參數的比較類,less表示數字越大的優(yōu)先級越大,greater表示數字越小優(yōu)先級越大。

  1. 結構體的優(yōu)先級設置
    給定一個水果-價格結構體:
struct fruit
{string name;
	int price;
}

如果想要按照水果價格越高優(yōu)先級越高排序,則需要重載運算符"<":

struct fruit
{string name;
	int price;
	friend bool operator< (fruit f1,fruit f2)
	{return f1.price< f2.price;//價格高優(yōu)先級高
	}
}

注意,如果重載大于號會顯示編譯錯誤,因為從數學上來說只需重載小于號即可(aa,a==b等價于!(a同理,若想要以價格低的水果為優(yōu)先級高的次序輸出,只需要把return中的小于號改為大于號即可。

struct fruit
{string name;
	int price;
	friend bool operator< (fruit f1,fruit f2)
	{return f1.price >f2.price;//價格低優(yōu)先級高
	}
}

另外,還可以將函數寫在結構體外,即:

struct cmp
{bool operator () (fruit f1,fruit f2)
	{return f1.price< f2.price;
    {}

在這種情況下,需要使用第一種方法定義優(yōu)先隊列:

priority_queue,cmp>p;

常見用途
??priority_queue可以解決一些貪心問題,也可以對迪杰斯特拉算法進行優(yōu)化。

2.7 stack

??stack翻譯為棧,在STL種是一個后進后出的容器。

定義

stackname;

元素訪問
??由于stack是一個后進后出的數據結構,所以只能通過top()來訪問棧頂的元素。

push()/top()/pop()/empty()/size()
??與前面大致相同,不再介紹。

常見用途
??stack常用來模擬實現一些遞歸,防止程序對棧內存的限制而導致程序運行出錯。

2.8 pair

??pair將兩個元素綁在一起作為一個合成元素。

定義

#includepairname;

元素訪問
??pair中只有兩個元素,分別是first和second,只需按照正常結構體的方式去訪問即可。

比較操作數
??兩個pair類型數據可以直接使用“==”,“<=”等比較大小,比較規(guī)則是現以first的大小作為標準,只有當first相等時才會去判別second的大小。

常見用途
??用來代替二元結構體及其構造函數,節(jié)省編碼時間。還可以作為map的鍵值對進行插入,如:

mapmp;
mp.insert(make_pair("heihei",5));
mp.insert(pair("haha",10));

你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧

當前標題:【算法設計與分析】2.常見STL總結-創(chuàng)新互聯
分享地址:http://aaarwkj.com/article28/ccohjp.html

成都網站建設公司_創(chuàng)新互聯,為您提供靜態(tài)網站、營銷型網站建設、Google網站導航、網站營銷云服務器

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

日本韩国三级视频在线观看| 另类激情综合在线观看| 高清中文一区二区三区| 久久这里精品中文字幕| 久久av免费一区二区观看| 伊人久久亚洲精品综合| 亚洲综合国产一二三四五区| 亚洲欧美日韩精品二区| 亚洲熟妇av一区二区三区l| 国产欧美日韩精品国产| 放荡成熟人妻中文字幕| 蜜臀久久精品亚洲一区| 四虎在线观看最新免费| 日本亚洲中文字幕网站| 国产午夜亚洲精品羞羞网站| 一区二区三区av夏目彩春| 欧美日韩亚洲1区2区| av中文字幕在线激情| 婷婷五激情五月激情片| 亚洲av优选在线观看精品| 久久久精品国产亚洲av色哟哟| av在线观看亚洲天堂| 欧美精品在线观看不卡一区| 久久综激情丁香开心婷婷| 亚洲激情午夜福利视频| 正在播放老肥熟妇露脸| 亚洲男人的天堂久久精品| 亚洲家庭伦理在线观看| 日韩欧美国产综合第一页| 清纯美女爱爱高潮av| 人妻少妇被猛烈进入中出视频| 自拍偷拍一区蜜桃视频| 国产日韩欧美亚洲中文| 这里只有精品国产999| 国产精品久久一国产精品| 中文字幕人妻少妇美臀| 日韩精品人妻一区二区网站 | 欧美日韩另类综合91| 国产精品三级高清在线| 午夜视频免费在线观看| 日韩国产传媒视频在线观看|