STL中的順序表——vector
與string類一樣 vector 類是隨標準 C++引入的標準庫的一部分 ,爲了使用vector 我們必須包含相關的頭文件 :
#include <vector>
using std::vector;
vector在實例化時不需要申明長度。標準庫負責管理和儲存元素相關的內存,用戶不用擔心長度不夠,例如:
vector<int> ivec//定義向量對象ivec,向量中每一個元素都是int類型
一.vector的初始化
vector有兩種不同的使用形式,分別爲數組習慣和 STL習慣。
- 數組習慣用法
vector<int> ivec(5); //類似數組定義int ivec[5];
可以通過ivec[索引號] 來訪問元素
- 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內
- 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個接口函數,具體功能見上文函數表。