C++學習筆記-vector

STL中的順序表——vector

        與string類一樣 vector 類是隨標準 C++引入的標準庫的一部分 ,爲了使用vector 我們必須包含相關的頭文件 :

#include <vector>
using std::vector;

        vector在實例化時不需要申明長度。標準庫負責管理和儲存元素相關的內存,用戶不用擔心長度不夠,例如:

vector<int> ivec//定義向量對象ivec,向量中每一個元素都是int類型

一.vector的初始化

        vector有兩種不同的使用形式,分別爲數組習慣和 STL習慣。

  1. 數組習慣用法
vector<int> ivec(5);  //類似數組定義int ivec[5];

        可以通過ivec[索引號] 來訪問元素

  1. STL習慣
            在定義vector的元素時,可以爲每個元素提供一個顯式的初始值來完成初始化,例如:
vector<int> ivec(2,1)

        定義了ivec,包含2個int類型的元素,每個元素初始化爲1

        對於數組,我們同樣可以進行初始化,例如:

int ia[2]={0,1};

        但是我們不能用同樣的方式初始化vector,但是可以通過數組來對vector進行初始化,例如:

vector<int> ivec(ia,ia+2)

        或者:

vector<int> ivec(&ia[0],&ia[1])

        表示將a[0],a[1]的元素拷貝到ivec內

  1. vector可以被另一個vector初始化,或被賦值給另一個vector,例如:
vector<int> ivec;
vector<int> ivec2(ivec);
ivec2 = ivec;

二.定義在vector類中的方法

方法名 方法描述
back() 返回最後一個向量的值
begin() 返回指向第一個元素的迭代器
capacity() 返回容量
clear() 將容器清空
empty() 若大小爲0,則返回true;否則,返回false
end() 返回指向最後一個元素的迭代器
erase() 在向量的任意位置刪除元素
insert() 在向量的任意位置插入元素
pop_back() 刪除最後一個元素
push_back() 在向量尾部添加元素
resize() 改變容量
size() 返回向量中的元素個數

三.vector使用實例

#include<iostream>
using namespace std;
#include<vector>
using std::vector;

void main()
{
	vector<PHONEBOOK> vec;
	PHONEBOOK pbook[4] = {
							{ 20181208, "Mary" ," 13011221827""classmates" },
							{ 20181127,"Tom" ,"13934621123”," "family" },
							{ 20181156, "John" ,"1324579880" ,"classmates" },
							{ 20181133, "Lisa" ," 1378001822”,' classmates" }
	};
	for (int i = 0; i < 4; i++)
		vec.push_back(pbook[i]); //尾部添加4條通信錄
	cout << "通信錄內容列表:" << endl;
	for (int i = 0; i < vec.size(); i++)
		vec[i].print();//使用數組方式訪問每個元素
	PHONEBOOK record(20181209,"phoenix","15930209020","teacher");
	vec.insert(vec.begin(), record); //在 vec頭添加元素record,該操作時間複雜度爲0(n)
	cout << "通信錄內容列表:" << endl;
	for (vector<PHONEBOOK>::iterator it = vec.begin(); it != vec.end(); it++)
		(*it).print();//使用迭代器訪問每個元素
	cout << "刪除元素:" << endl;
	vec.erase((++ ++vec.begin()))->print(); //刪除第3位置的元素
	cout << "通信錄內容列表:" << endl;
	for (vector < PHONEBOOK>::iterator it = vec.begin(); it != vec.end(); it++)
		(*it).print();//使用迭代器訪問每個元素
	cout << endl;
}

        這裏要重點說明的是,上例第一個循環採用下標方式訪問向量對象vec中的每個元素,操作與數組相同,但需要注意在使用下標操作符“[]”時要防止地址越界,否則這類錯誤很難被捕捉到,會導致程序運行結果不確定。爲了避免這種錯誤,一般使用迭代器,如上例中的第二個循環。
        定義迭代器的方法如下:

vector <PHONEBOOK>::iterator it;

        迭代器類似於指針,可以使用*it訪問相應元素。如it= vec.begin()表示迭代器it指向vec的第一個元素;it=vec.end()表示迭代器it指向vec最後一個元素的下一個元素位置。若向量對象vec爲空,vec.begin()與vec. end()指向同一個位置。容器的begin() 和end()函數都是常用接口,在程序設計時注意靈活使用。上例中還調用了push_back() 、size( )、insert()、erase()這4個接口函數,具體功能見上文函數表。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章