C++容器(STL vector類模版總結)---3

vector是最簡單的順序(序列)式容器,支持隨機訪問。vector就像一個動態數組,是典型的“將元素至於動態數組中加以管理”的抽象概念。vector可以實現數據結構中的隊列、數組和堆棧的所有功能

在 vector 容器中,根據下標隨機訪問某個元素的時間是常數,在尾部添加一個元素的時間大多數情況下也是常數,總體來說速度很快

在中間插入或刪除元素時,因爲要移動多個元素,因此速度較慢,平均花費的時間和容器中的元素個數成正比。

在 vector 容器中,用一個動態分配的數組來存放元素,因此根據下標訪問某個元素的時間是固定的,與元素個數無關。

vector 容器在實現時,動態分配的存儲空間一般都大於存放元素所需的空間。例如,哪怕容器中只有一個元素,也會分配 32 個元素的存儲空間。這樣做的好處是,在尾部添加一個新元素時不必重新分配空間,直接將新元素寫入適當位置即可。在這種情況下,添加新元素的時間也是常數。但是,如果不斷添加新元素,多出來的空間就會用完,此時再添加新元素,就不得不重新分配內存空間,把原有內容複製過去後再添加新的元素。碰到這種情況,添加新元素所花的時間就不是常數,而是和數組中的元素個數成正比。
至於在中間插入或刪除元素,必然涉及元素的移動,因此時間不是固定的,而是和元素個數有關。
vector中的成員函數具體可查閱 :www.cplusplus.com

vector基本用法

#include <iostream>
#include <vector>  //使用vector需要包含此頭文件
using namespace std;
template <class T>
void PrintVector(const vector <T> & v)
{  //用於輸出vector容器的全部元素的函數模板
    vector <T>::const_iterator i;
   
    for (i = v.begin(); i != v.end(); ++i)
        cout << *i << " ";
    cout << endl;
}
int main()
{
    int a[5] = { 1, 2, 3, 4, 5 };
    vector <int> v(a, a + 5);  //將數組a的內容放入v
    cout << "1) " << v.end() - v.begin() << endl;  //兩個隨機迭代器可以相減,輸出:1)5
    cout << "2)"; PrintVector(v);  //輸出:2)1 2 3 4 5
    v.insert(v.begin() + 2, 13);  //在 begin()+2 位置插人 13
    cout << "3)"; PrintVector(v);  //輸出:3)1 2 13 3 4 5
    v.erase(v.begin() + 2);  //刪除位於 begin()+2 位置的元素
    cout << "4)"; PrintVector(v);  //輸出:4)1 2 3 4 5
    vector<int> v2(4, 100);  //v2 有 4 個元素,都是 100
    v2.insert(v2.begin(), v.begin() + 1, v.begin() + 3);  //將v的一段插入v2開頭
    cout << "5)v2:"; PrintVector(v2);  //輸出:5)v2:2 3 100 100 100 100
    v.erase(v.begin() + 1, v.begin() + 3);  //刪除 v 上的一個區間,即 [2,3)
    cout << "6)"; PrintVector(v);  //輸出:6)1 4 5
    return 0;
}

vecrot嵌套形成可變長的二維數組

#include <iostream>
#include <vector>
using namespace std;
int main()
{   
    vector<vector<int> > v(3); //v有3個元素,每個元素都是vector<int> 容器
    for(int i = 0;i < v.size(); ++i)
        for(int j = 0; j < 4; ++j)
            v[i].push_back(j);
    for(int i = 0;i < v.size(); ++i) {
        for(int j = 0; j < v[i].size(); ++j)
            cout << v[i][j] << " ";
        cout << endl;
    }
    return 0;
}

vector的增刪改查

//push_back/pop_back

#include <iostream>
#include <stdlib.h>
#include <vector>

using namespace std;


int main()
{
	int a[] = { 1, 2, 3, 4 };
	vector<int> v(a, a + sizeof(a) / sizeof(int)); //爲v分配大小
	vector<int>::iterator i = v.begin();
	while (i != v.end())
	{
		cout << *i << " ";
		++i;
	}
	cout << endl;

	v.pop_back();  //刪除末尾4
	v.pop_back(); //刪除末尾3
	v.push_back(6); //在末尾加上6
	i = v.begin();
	while (i != v.end())
	{
		cout << *i << " ";
		++i;
	}
	cout << endl;
	system("pause");
	return 0;
}

 

//find/insert/erase

#include <iostream>
#include <stdlib.h>
#include <vector>

using namespace std;


int main()
{
	int a[] = {1,2,3,4,5,6};
	vector<int> v(a, a + sizeof(a) / sizeof(int));
	//使用find在[begin,end)區域內尋找3的位置
	vector<int>::iterator i = find(v.begin(),v.end(),3);
	//在3位置之前插入數字30
	v.insert(i, 30);

	vector<int>::iterator it = v.begin();
	while (it != v.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
	//尋找4的位置並刪除
	i = find(v.begin(), v.end(), 4);
	v.erase(i);

	it = v.begin();
	while (it != v.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
	system("pause");
	return 0;
}

operator[] +index 和C++11中vector的新式for+auto的遍歷方式

#include <iostream>
#include <stdlib.h>
#include <vector>

using namespace std;


int main()
{
	int a[] = {1,2,3,4};
	vector<int> v(a, a + sizeof(a) / sizeof(int));
	//通過[]讀取第0個位置,並賦值爲10
	v[0] = 10;
	cout << v[0] << endl;
	//通過[i]的方式遍歷vector 內容爲10 2 3 4
	for (size_t i = 0; i < v.size(); ++i)
	{
		cout << v[i] <<" ";
	}
	cout << endl;
	//創建v2容器 內容爲5 6 7 8
	int b[] = { 5, 6, 7, 8 };
	vector<int> v2(b, b + sizeof(b) / sizeof(int));

	//v2與v中元素進行交換
	v2.swap(v);
	cout << "v_swap data:";  //內容爲 5 6 7 8
	for (size_t i = 0; i < v.size(); ++i)
	{
		cout << v[i] <<" ";
	}
	cout << endl;

	cout << "v2_swap data:"; //內容爲 10 2 3 4
	for (size_t i = 0; i < v2.size(); ++i)
	{
		cout << v2[i] << " ";
	}
	cout << endl;

	//c++11支持的新式遍歷v中元素
	cout << "C++11:";
	for (auto x : v)
	{
		cout << x << " ";
	}
    system("pause");
	return 0;
}

vector迭代器失效問題

int a[] = { 1, 2, 3, 4 };
	vector<int>v(a, a + sizeof(a) / sizeof(int));
	//使用find查找3所在位置的iterator
	vector<int>::iterator pos = find(v.begin(),v.end(),3);
	//刪除pos位置處的數據,導致pos迭代器失效
	v.erase(pos);
	cout << *pos << endl;
	
	// 在pos位置插入數據,導致pos迭代器失效。
	// insert會導致迭代器失效,是因爲insert可
	// 能會導致增容,增容後pos還指向原來的空間,而原來的空間已經釋放了
	pos = find(v.begin(), v.end(), 3);
	v.insert(pos, 3);
	cout << *pos << endl;//此處會導致非法訪問

將代碼進行修改後

int a[] = { 1, 2, 3, 4 };
	vector<int>v(a, a + sizeof(a) / sizeof(int));
	//使用find查找3所在位置的iterator
	vector<int>::iterator pos = find(v.begin(),v.end(),3);
	//刪除pos位置處的數據,導致pos迭代器失效
	v.erase(pos);
	
	
	// 在pos位置插入數據,導致pos迭代器失效。
	// insert會導致迭代器失效,是因爲insert可
	// 能會導致增容,增容後pos還指向原來的空間,而原來的空間已經釋放了
	pos = find(v.begin(), v.end(), 3);
	v.insert(pos, 4);
	//cout << *pos << endl;
	vector<int>::iterator it = v.begin();
	while (it != v.end())
	{
		cout << *it << " ";
		++it;
	}

使用sort()算法對vector進行排序

#include <iostream>
#include <vector>
#include <stdlib.h>
#include <algorithm>

using namespace std;

int main()
{
	int a[] = {1,23,2,3,5,6,10,20,3,2,1};
	vector<int> v(a,a+sizeof(a)/sizeof(int));
	cout << "初始數據:";
	for (auto x:v)
	{
		cout<< x << " ";
	}
	cout << endl;
	cout << "從小到大排序:";
	sort(v.begin(), v.end());
	for (auto x : v)
	{
		cout << x << " ";
	}
	
	cout << endl;
	sort(v.rbegin(), v.rend());
	cout << "從大到小排序:";
	for (auto x : v)
	{
		cout << x << " ";
	}
	cout << endl;
	system("pause");
	return 0;
}

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