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