1. 程式人生 > >STL典型使用--vector類模板

STL典型使用--vector類模板

vector是將元素放在一個動態陣列中加以管理的容器,vector可以隨機存取元素(用[]操作符或at()直接存取),也支援迭代器存取元素;vector在尾部新增或移除元素十分高效,但是在中間或者頭部插入/移除元素會比較費時。

1. 增加/刪除vector內的元素

vector採用類模板實現,從而實現了演算法和資料型別的分離,因此vector可以存放任何型別的元素(一個vector裡的元素只能是一種):

vector<int> intVec;		//一個存放int的vector容器

class TT {};
vector<TT> vecTT;		//一個存放TT物件的vector容器
vector<TT*> vecTTAddr;	//一個存放TT物件地址的vector容器

需要注意,容器元素存放是按值複製的方式進行的,所以TT類必須提高TT的拷貝建構函式,以保證TT物件間拷貝正常。

示例1:

std::vector<int> intVec;

for (int i = 0; i < 5; ++i) {
	intVec.push_back(i + 1);	//尾插元素值
}

intVec.front() = 128;	//修改頭部資料,front()返回的是頭部元素的引用
intVec.back() = 666;	//修改尾部資料,back()返回的是尾部元素的引用

while (intVec.size() > 0) {
	std::cout << intVec.back() << std::endl;
	intVec.pop_back();	//刪除尾部元素
}

vector有如下帶參建構函式:

vector(beg, end);			//建構函式將[beg, end)區間中的元素拷貝給本身。注意該區間是左閉右開區間
vector(n, elem);			//建構函式將n個elem拷貝給本身
vector(const vector& vec);	//拷貝建構函式
int arr[] = {0, 1, 2, 3, 4};
std::vector<int> int_vec1(arr, arr + 5);

std::vector<int> int_vec2(int_vec1.begin(),int_vec1.end());
std::vector<int> int_vec3(int_vec1.begin(), int_vec1.begin() + 3);
std::vector<int> int_vec4(3, 9);

std::vector<int> int_vec5 = int_vec1;

2. vector的[]的下標操作符

需要注意,進行[]操作之前要保證該地址已分配記憶體
示例1:

std::vector<int> v1(10);	//分配10個int的空間,其初始值為0

for (int i = 0; i < 10; ++i) {
	v1[i] = i * 2;
}

for (int i = 0; i < 10; ++i) {
	printf("%d\n", v1[1]);
}

3. vector的迭代器

迭代器是一個可遍歷STL容器內全部或者部分元素的物件,它如同一個指標,指出容器中的一個特定位置。迭代器提供對容器中的物件的訪問方法,並且可以定義了容器中物件的範圍。
示例:

//正序遍歷
for (std::vector<int>::iterator it = v1.begin(); it != v1.end(); ++it) {
	std::cout << *it << std::endl;
}

//逆序遍歷,.rbegin()等價於.end()
for (std::vector<int>::reverse_iterator rit = v1.rbegin(); rit != v1.rend(); ++rit) {
	std::cout << *rit << std::endl;
}

迭代器由只讀/非只讀、正序/逆序組合如下4種:

typedef __gnu_cxx::__normal_iterator<pointer, vector>	iterator;
typedef __gnu_cxx::__normal_iterator<const_pointer, vector> const_iterator;
typedef std::reverse_iterator<const_iterator>	const_reverse_iterator;
typedef std::reverse_iterator<iterator>	reverse_iterator;

4. vector的插入和刪除

v1.clear();						//移除容器中所有資料
v1.erase(v1.begin(), v1.end());	//刪除[begin(), end())區間的資料,返回下一個資料的位置
v1.erase(pos);					//刪除pos位置的資料,返回下一個資料的位置

示例:

for (std::vector<int>::iterator it = v1.begin(); it != v1.end(); ) {
	if (*it == 6) {
		it = v1.erator(it);	//刪除迭代器所指的元素時,該函式會自加it並且返回,所以for()迴圈中不能++it
	}
	else {
		++it;
	}
}

元素插入:

v1.insert(pos, elem);			//在pos位置插入一個elem元素的拷貝,返回新資料的位置
v1.insert(pos, n, elem);		//在pos位置插入n個elem元素的拷貝,無返回值
v1.insert(pos, begin(), end());	//在pos位置插入[begin(), end())區間的資料,無返回值