C++ STL學習——vector
學過C++的人肯定會很熟悉STL標準模板庫,STL其實就是封裝了一系列的介面,供我們呼叫。很多函式或者演算法的實現不需要我們從頭開始寫,大大提高我們的程式設計效率。這篇部落格在簡單介紹STL的情況下,會詳細的來介紹vector的使用。
STL共有六大元件:
一。容器(Container):是一種資料結構,如list,vector,deque,queue等,以模板類的方法提供,為了訪問容器中的資料,可以使用由容器類提供的迭代器。
二。迭代器(Iterator):提供了訪問容器中物件的方法。
三。演算法(Algorithm):用來操作容器中的資料的模板函式。
四。仿函式(Function object)。
五。迭代介面卡(Adapter)。
六。控制元件介面卡(allocator)。
我們這裡主要會討論的是容器、迭代器和演算法。我們先來談談vector。相關的示例程式碼上傳至https://github.com/chenyufeng1991/STL_vector 。vector對應的資料結構為陣列,而且是動態陣列,也就是說我們不必關心該陣列事先定義的容量是多少,它的大小會動態增長。與陣列類似的是,我們可以在末尾進行元素的新增和刪除,也可以進行元素值的隨機訪問和修改。首先要引入標頭檔案 #include 。具體使用如下:
(1)vector的建立
vector<int>vec1;// 建立一個空的vector vector<int>vec2(vec1);// 建立一個vector vec2,並用vec1去初始化vec2 vector<int>vec3(10);// 建立一個含有n個數據的vector vector<int>vec4(10,0);// 建立含有10個數據的vector,並全部初始化為0
建構函式進行了過載,可以用多種方式建立vector。
(2)push_back(),pop_back()新增刪除元素
// 在vector尾部新增元素 vec1.push_back(4); vec1.push_back(6); vec1.push_back(8); vec1.push_back(1); vec1.push_back(2); PrintVector(vec1); // 在vector尾部刪除元素 vec1.pop_back(); PrintVector(vec1); // 在vector頭部新增元素,無法完成,因為vector的資料結構為陣列,無法在頭部插入元素,否則需要整個陣列前移; // 在vector頭部刪除元素,無法完成,理由同上。
可以使用push_back()不斷的在vector尾部新增元素,使用pop_back刪除尾部元素。操作非常的方便,比我們直接用陣列結構方便多了。
(3)[],at(),取某位置的元素值
// 取vector中某位置的元素值 cout << "在1位置的元素值為:" << vec1.at(1) << endl; cout << "在1位置的元素值為:" << vec1[1] << endl;
因為vector的資料結構就是一個數組,所以可以進行隨機訪問。
(4)begin(),end(),指向頭元素、尾元素的指標
voidPrintVector(vector<int>ve) { cout<<"Vector中的資料為:"; vector<int>::iteratorveIterator; for(veIterator=ve.begin();veIterator<ve.end();veIterator++) { cout<<*veIterator<<" "; } cout<<endl; }
這裡以列印vector中的所有元素來理解begin().end()。這裡需要使用迭代器來進行遍歷,也可以把迭代器理解為指標,把begin(),end()分別理解為頭指標和尾指標。這樣就能訪問到vector中的每一個元素了。
(5)back(),front(),訪問頭部元素和尾部元素
// 返回尾部資料的引用 cout<<"尾部資料的值為:"<(6)max_size(),vector的最大容納量;size():vector當前的元素個數。
cout<<"vector中的最大容量為:"<(7)empty(),判斷vector是否為空
cout<<"vector是否為空:"<<vec1.empty()<<endl;
如果為空,返回1.否則返回0。
(8)swap():交換兩個vector中的值。
(9)sort():對vector升序排序;reverse():對vector降序排序。
// 對vector進行升序排序 sort(vec1.begin(),vec1.end()); PrintVector(vec1); // 對vector進行降序排序 reverse(vec1.begin(),vec1.end()); PrintVector(vec1);傳遞的引數是需要排序的範圍,因為這裡要對整個vector排序,所以引數分別指向頭部和尾部。
(10)[],at():修改元素
// 修改vector中的某個值 vec1[2]=99; PrintVector(vec1); vec1.at(3)=88; PrintVector(vec1);(11)erase():刪除某個元素
// 刪除陣列的某個元素 // 為什麼要使用iterator來進行定位,因為陣列如果要刪除一個元素或者插入一個元素,會導致其他元素移動,所以不能直接進行刪除 vector<int>::iteratorvItera=vec1.begin(); vItera=vItera+2; vec1.erase(vItera); PrintVector(vec1);在刪除元素時,要借用迭代器。
(12)insert(): 插入元素
// vector插入某元素,要使用iterator來定位某個位置 vector<int>::iteratorvInsert=vec1.begin(); vInsert=vInsert+2; vec1.insert(vInsert,777); PrintVector(vec1);同樣要藉助迭代器。
(13)clear():清除所有元素
// 清除所有資料 vec1.clear(); PrintVector(vec1); cout<<"vector是否為空:"<執行以後就是一個空的vector,不包含任何元素。
關於vector的更詳細介紹可以參考文件:http://en.cppreference.com/w/cpp/container/vector
另外,如果有想學習C語言和c++的程式設計師,可來我們的C語言c++學習扣qun:9416,36044免費送C語言的視訊教程噢!我整理了一份適合大學生學習的c++乾貨,送給每一位想學的小夥伴,並且每天晚上8點還會在群內直播講解c/c++知識,歡迎大家前來學習哦。