// 順序容器(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;
}
c++ primer(第五版)筆記 第九章 順序容器(1)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.