順序容器

順序容器的種類有:vector,list、deque(vector元素是連續存放的

順序容器適配器:stack,queue,priority_queue

關於容器內的元素類型約束:容器內的元素必須支持賦值和賦值操作。

迭代器:所有的迭代器都有相同的藉口(其實就是有相同的成員函數),都支持==和!=的關係操作符,但是對於vector和deque這兩個容器卻提供了額外的關係操作符,他們支持(假設迭代器對象爲iter)的額外操作有:iter+n,iter1 += iter2,>,>=,<,<=。

向容器內添加元素的方法有通用的insert接口和push_back接口,同時,對於list和deue而言還有push_front接口,需要注意的是,當修改了容器之後,原先的容器的迭代器可能會失效,最好的例子就是,如果在修改或者刪除容器內的元素之前存儲了end返回的迭代器,那麼當修改完容器之後,這個迭代器會失效,所以在代碼中應該儘量避免存儲end返回的迭代器。

容器的大小操作:resize(int )和resize(int, T),max_size()。resize用來改變容器所包含的元素個數,如果當前容器的長度比resize給出的長度要大,那麼容器就會將容器的多出來的後面部分從容器中刪除,若當前容器的大小小於resize給出的 長度,則系統就會在容器的後部添加元素。

賦值(asign)和交換(swap),asign首先會將原先容器內的所有元素刪除,然後再將新的值複製到容器內,li = li1相當於:

li.erase(li.begin(), li.end());//刪除
li.insert(li.begin(),li1.begin(),li1.end());

swap操作是一個常量級的函數調用,不會刪除和插入任何元素,因此迭代器不會失效。(我覺得這swap操作相當於換名,操作的對象相互換名字)


容器的內存管理

vector的元素是連續存放的,而其他的則相當於鏈表的內存結構。容器的max_zise(0是和平臺相關的,是說容器最大是多少,而capacity()則是相對於特定的容器在不需要重新分配內存的情況下所能容納的最大元素個數。舉個例子,對於局部數組而言(windows下面的),由於棧的最大值爲1M,所以在數組最大隻能聲明爲1M大小,這個相當於max_size,但是特定的數組,比如你聲明瞭數組int a[20],這個數組最大能夠容納20個元素,此即爲capacity()。

vector<int> vec(5,10);
vector<int> vec1(2,1);
vector<char> vec2(4,'2');

//查看capacity 
cout << "vec的capacity:" << vec.capacity() << endl;//輸出5 
cout << vec.max_size() << endl; 
cout << vec1.max_size() << endl; 
cout << vec2.max_size() << endl; 
//插入一個元素後 ,超過capacity,所以需要重新分配內存
//capacity變大 
vec.push_back(13); 
cout << "vec的capacity:" << vec.capacity() << endl;
cout << vec.max_size() << endl; 
//刪除一個元素後,不需要重新分配內存,所以capacity不變 
vec.pop_back(); 
cout << "vec的capacity:" << vec.capacity() << endl;
cout << vec.max_size() << endl; 

對於上述代碼的運行結果發現,vec和vec1的max_size是相同的,而vec2大約是vec的4倍,可以想象,編譯器會給一個容器對象固定的大小,但是因容器內的元素類型不一樣,所以會產生max_size不一樣,但是對於相同的元素類型的容器,其大小是一樣的。對於上述代碼中的vec1和vec2,如果對vec1的max_size結果成衣4,那麼就會發現此時他們幾乎就相等了。如下圖所示:


從結果可以看出,就是數學中所說的約等於。、


練習代碼:

#include <iostream>
#include <vector>
#include <list>
#include <deque>
#include <string>

using namespace std;
int main(int argc, char *argv[])
{
	//定義一個1長度爲10的list容器 
	list<string> li(2,"init_data");
	for(list<string>::const_iterator i=li.begin(); i!=li.end(); i++)
		cout << *i << "  ";
	cout << endl;
	
	//push_front 
	li.push_front("push_front");
	for(list<string>::const_iterator i=li.begin(); i!=li.end(); i++)
		cout << *i << "  ";
	cout << endl;
	
	//push_back 
	li.push_back("push_back");
	for(list<string>::const_iterator i=li.begin(); i!=li.end(); i++)
		cout << *i << "  ";
	cout << endl;
	
	//insert 
	li.insert(++li.begin(),"insert(p,t)");
	for(list<string>::const_iterator i=li.begin(); i!=li.end(); i++)
		cout << *i << "  ";
	cout << endl;
	
	li.insert(--li.end(),2,"insert(p,n,t)");
	for(list<string>::const_iterator i=li.begin(); i!=li.end(); i++)
		cout << *i << "  ";
	cout << endl << endl;
	
	//insert
	/******************************************************** 
	 *li.insert(li.end(),li.begin(),--li.end());
	 *上面的這一句有問題,修改了容器,所以兩處使用end會出錯 ,
	 *該語句原本想把原容器內的內容複製一遍到後面,可是不成功,
	 *我的運行結果是容器內剩最後的一個元素沒有複製,所以下
	 *面的resize不能回覆容器
	 ********************************************************/ 
	for(list<string>::const_iterator i=li.begin(); i!=li.end(); i++)
		cout << *i << "  ";
	cout << endl;
	
	//resize
	//容器大小減半 
	cout << "容器大小減半:" << endl;
	li.resize(li.size()/2); 
	for(list<string>::const_iterator i=li.begin(); i!=li.end(); i++)
		cout << *i << "  ";
	cout << endl;
	
	//刪除容器的元素,clear可以刪除所有元素, 
	//當然也可以通過pop_front和pop_back刪除元素 
	cout << "刪除首元素:" << endl; 
	li.erase(li.begin()); 
	for(list<string>::const_iterator i=li.begin(); i!=li.end(); i++)
		cout << *i << "  ";
	cout << endl; 
	
	//容器大小再減半 
	cout << "容器大小減半:" << endl;
	li.resize(li.size()/2); 
	for(list<string>::const_iterator i=li.begin(); i!=li.end(); i++)
		cout << *i << "  ";
	cout << endl;
	
	//容器大小翻倍 
	cout << "容器大小翻倍:" << endl;
	//resize變大的話,若不指定增加元素值,採用值初始化(初始化爲對應的數據類型的默認值)
	li.resize(li.size()*2,"resize_add"); 
	for(list<string>::const_iterator i=li.begin(); i!=li.end(); i++)
		cout << *i << "  ";
	cout << "大小爲" << li.size() << endl;
	
	//back和font的使用
	//back爲*--end(),front爲*begin() 
	cout << "front:" << li.front() << "  back:" << li.back() << "  \n" << endl;
	
	vector<int> vec(5,10);
	vector<int> vec1(2,1);
	vector<char> vec2(4,'2');
	
	//查看capacity 
	cout << "vec的capacity:" << vec.capacity() << endl;//輸出5 
	cout << vec.max_size() << endl; 
	cout << "vec1.max_size()*4:" << vec1.max_size()*4 << endl; 
	cout << "vec2.max_size():" << vec2.max_size() << endl; 
	//插入一個元素後 ,超過capacity,所以需要重新分配內存
	//capacity變大 
	vec.push_back(13); 
	cout << "vec的capacity:" << vec.capacity() << endl;
	cout << vec.max_size() << endl; 
	//刪除一個元素後,不需要重新分配內存,所以capacity不變 
	vec.pop_back(); 
	cout << "vec的capacity:" << vec.capacity() << endl;
	cout << vec.max_size() << endl; 
	
	return 0;
}

運行結果:




發佈了80 篇原創文章 · 獲贊 12 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章