vector简介
vector向量是一种顺序行容器。相当于数组,但其大小可以不预先指定,并且自动扩展。它可以像数组一样被操作,由于它的特性我们完全可以将vector 看作动态数组。
在创建一个vector 后,它会自动在内存中分配一块连续的内存空间进行数据存储,初始的空间大小可以预先指定也可以由vector 默认指定。当存储的数据超过分配的空间时vector 会重新分配一块内存块,但这样的分配是很耗时的,在重新分配空间时它会做这样的动作:
首先,vector 会申请一块更大的内存块;
然后,将原来的数据拷贝到新的内存块中;
其次,销毁掉原内存块中的对象(调用对象的析构函数);
最后,将原来的内存空间释放掉。
当vector保存的数据量很大时,如果此时进行插入数据导致需要更大的空间来存放这些数据量,那么将会大大的影响程序运行的效率,所以我们应该合理的使用vector。
vector初始化
vector<T> v1; // 默认的初始化方式,内容为空
vector<T> v2(v1); // v2是v1的一个副本
vector<T> v3(n, i); // v3中包含了n个数值为i的元素
vector<T> v4(n); // v4中包含了n个元素,每个元素的值都是0
vector基本操作
(1)头文件#include<vector>.
(2)创建vector对象,vector<int> vec;
(3)尾部插入数字:vec.push_back(a);
(4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。
(5)使用迭代器访问元素.
(6)插入元素: vec.insert(vec.begin()+i,a); 在第i个元素后面插入a;
(7)删除元素: vec.erase(vec.begin()+2); 删除第3个元素
vec.erase(vec.begin()+i,vec.end()+j); 删除区间[i,j-1];区间从0开始
(8)向量大小:vec.size();
(9)清空:vec.clear() //清空之后,vec.size()为0vector常用函数
empty():判断向量是否为空,为空返回真,否则为假
begin():返回向量(数组)的首元素地址
end(): 返回向量(数组)的末元素的下一个元素的地址
clear():清空向量
front():返回得到向量的第一个元素的数据
back():返回得到向量的最后一个元素的数据
size():返回得到向量中元素的个数
push_back(数据):将数据插入到向量的尾部
pop_back():删除向量尾部的数据
.....
一个介绍vector的简单程序
#include <iostream>
#include <vector>
using namespace std;
//这里我们抽象出一个函数,用来打印vec里的数据
void print(vector<int> vec)
{
//用迭代器方式遍历向量vec
int i = 0;
vector<int>::iterator iter = vec.begin();
while(iter != vec.end())
{
cout <<"value of vec[" << i << "]: " << *iter <<endl;
i++;
iter++; //迭代器迭代
}
}
int main()
{
vector<int> vec;
//打印初始向量vec的大小
cout << "初始vec的大小" << vec.size() << endl;
//给向量vector赋值
for(int i = 0; i < 10; i ++)
{
vec.push_back(i);
}
//打印复制后vec的大小
cout << "赋值后vec的大小" << vec.size() << endl;
//用数组方式遍历向量vec
cout << "用数组方式遍历向量vec: " <<endl;
for(int i = 0; i < 10; i++)
{
cout <<"value of vec[" << i << "]: " << vec[i] << endl;
}
//用迭代器方式遍历向量vec
cout << "用迭代器方式遍历向量vec: " << endl;
int i = 0;
vector<int>::iterator iter = vec.begin();
while(iter != vec.end())
{
cout <<"value of vec[" << i << "]: " << *iter <<endl;
i++;
iter++; //迭代器迭代
}
//测试vec的函数
cout << "测试vec的函数" <<endl;
//向向量vec中添加一个数,并打印出来
vec.push_back(2018);
cout << vec.back() <<endl;
//打印刚刚添加后向量的值
print(vec);
//判断是否为空,为空返回真,反之返回假
cout << vec.empty() <<endl; //打印的值是0,说明vec不为空
//删除向量尾部的数据
cout << "删除之前尾部的数据为:" <<vec.back() << endl;
vec.pop_back();
cout << "删除之后尾部的数据为:" <<vec.back() << endl;
return 0;
}
运行结果