C++的vector容器

嘻嘻作者哈哈發表於2019-03-06

注: 文章為本人為方便複習而寫,若有朋友要參考,本文的不清楚的地方可以留言,也可以參考其他網頁。

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

//容量與實際資料量
void test_one()
{
	vector<int> v;

	for (int i(0); i < 15; i++)
	{
		v.push_back(i);
		cout << v.capacity() << endl;
	}
	cout <<"\n" << v.size() << endl;
	//vector為類似動態陣列,其容量的分配增長速度不是一個確定值,容量 >= 實際元素個數
}

void printVector(vector<int> v)
{
	
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
		cout << *it << " ";
	cout << "\n";
}

//初始化和賦值
void test_two() {
	//初始化
	vector<int> v1{ 10,2,56,90,1000 };
	printVector(v1);

	vector<int> v2(v1.begin(), v1.end()); //把v1.begin()到v1.end()之間的資料拷貝給v2
	printVector(v2);

	int arr[5]{ 1,2,3,4,5 };
	vector<int> v3(arr, arr + sizeof(arr) / sizeof(int));   //功能類似於上一個
	printVector(v3);

	vector<int> v4(10, 666); //(n,elem), 將n個elem拷貝給v4
	printVector(v4);
	//以上呼叫建構函式初始化

	vector<int> v5(v4);    //呼叫拷貝建構函式把v4拷貝給v5
	printVector(v5);

	//賦值
	//1.使用assign會刪除容器之前的資料,重寫
	vector<int> v6;
	v6.assign(v1.begin(), v1.end());  //將區間:v1.begin()到v1.end()的資料賦值給v6
	printVector(v6);                //資料和v1一樣
	v6.assign(3, 10000);            //將刪除v6之前的資料,並將n個(3) val(10000)重新寫入到v6
	printVector(v6);

	//2.過載=
	vector<int> v7 = v6;
	printVector(v7);

	//3.swap交換資料
	v7.swap(v1);      //交換當前vector容器物件v7與v1的資料
	printVector(v7);   
}

//vector空間大小操作
void test_three()
{
	vector<int> v{ 1,2,3,4,5,6 };

	printVector(v);
	cout << "size : " << v.size() << endl;         //返回物件v有多少個有效資料
	cout << "capacity : " << v.capacity() << endl;  
	if (v.empty())
		cout << "v為空" << endl;
	else 
		cout << "v非空" << endl;

	//resize重新指定容器的長度
	//1.v.resize(n),重新指定長度為n,若容器變長,則以預設值(一般為0)填充新位置,若容器變短,則末尾超出長度的元素被刪除
	v.resize(3);
	printVector(v);
	v.resize(10);
	printVector(v);

	//2.v.resize(n,elem),若容器變長,則用elem填充新位置,若容器變短,末尾超出指定的長度的元素被刪除
	v.resize(7, 6);     //容器變短不重寫: 1 2 3 0 0 0 0
	printVector(v);
	v.resize(10, 6);
	printVector(v);
}

//注:資料量很大時可以用reserve預留出空間,避免多次開闢空間
//用swap收縮容器物件空間
void test_swap()
{
	vector<int> v;

	for (int i(0); i < 1000; i++)
		v.push_back(i);
	cout << "capacity of v : " << v.capacity() << endl;
	cout << "size of v : " << v.size() << endl;

	v.resize(10);   
	cout << "capacity of v : " << v.capacity() << endl;  //沒有變化
	cout << "size of v : " << v.size() << endl;         //變為10
	
	//匿名物件的空間為10,使用swap交換了v與匿名物件的空間,實現將物件v的空間收縮
	vector<int>(v).swap(v);
	cout << "capacity of v : " << v.capacity() << endl;  //變為10
	cout << "size of v : " << v.size() << endl;         //10
}

//讀取資料
void test_four(){
	vector<int> v;

	v.push_back(100);
	v.push_back(200);
	v.push_back(300);
	v.push_back(400);
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
		cout << *it << "  ";
	cout << endl;
	cout << "第二個資料 : " << v[1] << endl;
	cout << "第三個資料 : " << v.at(2) << endl;   //使用at越界時會丟擲異常,更安全
	cout << "第一個資料 : " << v.front() << endl;
	cout << "最後一個資料 : " << v.back() << endl;

	//vector容器的迭代器支援隨機訪問
	vector<int>::iterator itBegin = v.begin();
	itBegin = itBegin + 1;                   //這樣寫不報錯就表明該容器支援隨機訪問               
	itBegin += 2;

	list<int> l{ 10,30,49,90 };
	list<int>::iterator litBegin = l.begin();
	//litBegin = litBegin + 1;    //error 因為連結串列容器沒有過載迭代器加法操作
}

//插入和刪除
void test_five()
{
	vector<int> v;

	v.push_back(10);
	v.push_back(20);

	//insert( , , ):第一個引數是要插入的位置(一個迭代器值),第二個引數為插入的資料的個數,第三個引數為插入資料的值
	v.insert(v.begin(), 66);     //在迭代器起始位置可以實現前插
	printVector(v);
	v.insert(v.begin() + 1, 2, 888);
	printVector(v);

	v.pop_back();         //刪除vector容器物件裡的最後一個元素
	printVector(v);

	//erase刪除指定位置(迭代器值即指標)或者指定區間[first,last)的資料,不包括last
	v.erase(v.begin());
	printVector(v);
	v.erase(v.begin(), v.begin() + 1);   //等價於v.erase(v.begin());
	printVector(v);

	//清除所有資料
	v.clear();
	if (v.empty())
		cout << "v已經清空" << endl;
}

//逆序遍歷
void reverseprint() {
	vector<int> v{ 1,2,3,4,5,6 };

	//使用逆序迭代器:reverse_iterator
	for (vector<int>::reverse_iterator rit = v.rbegin(); rit != v.rend(); rit++)
		cout << *rit << "  ";
	cout << "\n";
}

int main()
{
	//test_one();
	//test_two();
	//test_three();
	//test_swap();
	//test_four();
	//test_five();
	reverseprint();

	cin.get();
	return 0;
}

相關文章