c++ primer(第五版)筆記 第九章 順序容器(1)

// 順序容器(sequential container)
	// vector	可變大小數組,快速隨機訪問,在尾部之外的位置插入或刪除元素可能很慢
	// deque	雙端隊列,快速隨機訪問,在頭尾快速插入或刪除
	// list	雙向鏈表,雙向順序訪問,任何位置均可快速插入
	// forward_list	單向鏈表,單向順序訪問,任何位置均可快速插入
	// array	(非內置的 array)固定大小數組,快速隨機訪問,不能插入或刪除元素
	// string	和 vector 相似,專用於保存字符,快速隨機訪問,在尾部位置插入或刪除元素速度快
	
// 選擇原則
	// 除非有很好的理由選擇其他容器,否則使用 ventor
	// 如果元素較小,且空間開銷很重要,不要使用 list ,forward_list 
	// 要求快速隨機訪問,使用 vector ,deque
	// 要求快速中間插入或刪除,使用 list ,forward_list
	// 要求快速頭尾插入或刪除,但中間不會插入或刪除,使用 deque
	// 要求讀取輸入時在中間插入,隨後可隨機訪問
		// 使用 vector 向尾端加入,使用 sort 等方法排序
		// 使用 list 插入,完成後,轉存至 vector
	
//經驗:如果不確定用哪個容器,可以在程序中使用 ventor 和 list 的公共操作:使用迭代器代替下標,避免隨機訪問,必要時可以方便切換ventor 和 list 

//迭代器(iterator),標準庫的基礎
	// 所有容器都支持的操作(forward_lsit 不支持 --)
	// *iter
	// iter->member
	// ++iter
	// --iter
	// iter1 == iter2
	// iter1 != iter2
	
	// 僅string vector deque array 的迭代器支持的算術運算
	// iter + n
	// iter - n
	// iter -= n
	// iter += n
	// iter1 - iter2
	// >, >=, <, <=
	
	// 迭代器範圍(iterator range),由一對分別指向容器內元素或尾元素的下一個位置(begin , end)表示
	// 左閉合區間 [begin,end)
		// 如果 begin 和 end 相等,則範圍爲空
		// 如果 begin 和 end 不相等,則至少包含一個元素,且 begin 指向範圍中的第一個元素
		// 可以遞增 begin 若干次,使 begin == end
	//構成範圍的迭代器的要求:
		// 指向同一個容器,或者容器最後一個元素之後的位置,且可以通過遞增 begin,到達 end

#include<vector>
#include<array>
#include<list>
#include<iostream>
using std::vector;
using std::array;
using std::list;
using std::cout;
using std::endl;

// bool find_in_vec(vector<int>::iterator first, vector<int>::iterator last, int n);
vector<int>::const_iterator find_in_vec(vector<int>::const_iterator first, vector<int>::const_iterator last, int n);
	
int main()
{
	const vector<int> vi{1,35,7423,8,23,89,213,45,2438,2,2367,923,77,3};
	vector<int> vi2{1,35,7423,8,23,89,213,45,2438,2,2367,923,77,3};
	//begin 有2個版本,一個非常量一個常量
	auto ivi = vi.begin();		//vector<int>::const_iterator
	auto ivi2 = vi.cbegin();	//vector<int>::const_iterator
	auto ivi3 = vi2.begin();	//vector<int>::iterator	
	auto ivi4 = vi2.cbegin();	//vector<int>::const_iterator
	
	cout <<"find_in_vec : " <<*(find_in_vec(vi.cbegin(), vi.cend(), 923)) << endl;
	cout << "===========================================================" << endl;
	//直接拷貝內容,必須同容器類型和同元素類型
	vector<int> vi3 = vi2;	
	// vector<double> vi4(vi2);	錯誤
	for(auto i:vi3)
		cout << "vi3 : " << i << endl;
	cout << "===========================================================" << endl;
	//使用迭代器範圍,不需要容器類型一致,元素類型只要能轉換就可以
	list<double> vi4(vi2.cbegin(),vi2.cend());
	for(auto i:vi4)
		cout << "vi4 : " << i << endl;
	//列表初始化, 除 array 外,都隱式指明瞭容器大小
	vector<int> vi5{4, 234, 74};
	cout << "vi5.size:" << vi5.size() << endl;
	cout << "===========================================================" << endl;
	//順序容器(array 除外)都有一個接受容器大小的構造函數
	vector<int> vi6(10);	//10個元素未定義
	for(auto i:vi6)
		cout << "vi6 : " << i << endl;
	cout << "===========================================================" << endl;
	vector<int> vi7{10};	//1 個元素
	for(auto i:vi7)
		cout << "vi7 : " << i << endl;
	cout << "===========================================================" << endl;	
	
	//創建 array 時,需要指定大小,元素執行默認初始化
	array<int, 5> vi8 = {1,2}; 	//用0初始化第一個元素,其他進行值初始化
	for(auto i:vi8)
		cout << "vi8 : " << i << endl;
	//內置數組不可以拷貝,array 可以但類型要一致,且容器大小也是類型的一部分
	//array<int, 11> vi9 = vi8; 錯誤,類型不同
	//vi8 = {2,4,2,6};	//這種行爲對於 array 是錯誤的,如果右側列表元素數量大於容器大小...
	for(auto i:vi8)
		cout << "2vi8 : " << i << endl;
	cout << "===========================================================" << endl;		
	vector<int> vi10;
	vi10.swap(vi2);		//交換2個容器的元素,比拷貝快
	for(auto i:vi10)
		cout << "vi10 : " << i << endl;
	cout << "===========================================================" << endl;
	for(auto i:vi2)
		cout << "vi2 : " << i << endl;
	cout << "===========================================================" << endl;		
	swap(vi5,vi10);	//交換2個容器的元素
	for(auto i:vi10)
		cout << "vi10 : " << i << endl;
	for(auto i:vi5)
		cout << "vi5 : " << i << endl;
		
	//assign 運算,不支持關聯容器 和 array,
	// c.assign(iter1,iter2);	將c 的元素替換爲迭代器範圍中的元素
	// c.assign(c2);			將c 的元素替換爲 c2 中元素
	// c.assign(n,i);			將c 的元素替換爲 n 個值爲 i 的元素
	
	//只有容器內的元素定義了關係運算符時,纔可以用關係運算符比較容器
	// 2邊必須同容器類型,同元素類型,除無序關聯容器外,其他容器都支持
	return 1;
}

//傳入2個迭代器,查找 n ,返回bool
// bool find_in_vec(vector<int>::iterator first, vector<int>::iterator last, int n)
//返回迭代器版本
vector<int>::const_iterator find_in_vec(vector<int>::const_iterator first, vector<int>::const_iterator last, int n)
{
	while(first != last)
	{
		if(*first == n)
			// return true;
			return first;
		++first;
	}
	// return false;
	return first - 1;
}


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