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;
}