Vector容器
与数组不同,它的大小可以动态变化,其存储由容器自动处理。就是说当空间不够时,会自动增加capacity,自己无需考虑重新分配空间。
例如:
vector<int> x(2);
int num=4;
while(num--){
x.push_back(1);
}
x.capacity();//为6 自动扩大了x的空间
vector内存成长方式可归结以下三步曲:
(1)另觅更大空间;
(2)将原数据复制过去;
(3)释放原空间。
vector可以用下标访问元素,但是,只能访问size以内的
vactor实际占用空间为capacity大小
#include<vector>
/********** 声明 ***********/
vector<int> x;
vector<int> x(5); // 定义未赋值的大小为5的向量
vector<int> x(10, 2); // 定义了初始值为5的,有10个整型元素的向量
vector<int> x = {0, 1, 2, 3}; // 定义了一个有4个整型元素的向量
vector<int>v1(x.begin()+i, x.begin()+j); //将x中[i,j)赋值给v1
vector<int>v1=x; //x的值赋值给v1
v1.swap(x) //交换v1和x的值
/*********** 遍历 ***********/
for (vector<int>::iterator i = x.begin(); i != x.end(); ++i) {
cout << *i << ' ';
}
/*********** 基础操作 ***********/
x.push_back(5); // 在最后插入值为5的元素
x.pop_back(); // 删除 x 向量的最后一个元素
x.reserve() //改变当前vecotr的capacity
x.empty() //是否为空
x.clear() //清空当前的vector size=0 capacity不变
x[i] = 100; // 将 x 向量的第i个元素的值改为 100
x.at(i) //与x[i]等价 增加了检查过界的功能
x.begin(); // 返回一个迭代器,它指向 x 的第一个元素
x.front() //返回x第一个元素的值
x.end(); // 返回一个迭代器,它指向 x 的最后一个元素的下一个位置,即超出了范围
x.back() //返回最后一个元素的值
x.insert(x.begin()+i, 100); // 在 x 的第i个元素的位置(从0开始)插入一个值为100的元素。如x为1,2,3,插入元素后为1,100,2,3
v.insert(x.begin()+i,k,a);//从i开始插入k个a [i,i+k)
x.size(); // 返回 x 中元素的个数,实际所占空间
x.capacity(); // x最大容纳能力,与size不同
进阶操作
/*********** 进阶操作 ***********/
x.resize(n,a)
//重新设置vector的元素个数
//当n<=x.size()时,改变x.size的值,并且删除多余元素;
//当n>x.size()时,会改变x.size和x.capacity的值,用默认值或a填充
sort(x.begin(),x.end()); //从小到大排序
vector<int>::iterator it
vector<int>::iterator a
a = x.erase(it) //删除it所指向的元素
a = x.erase(it,it+3) //删除[it,it+3)的元素
//被删除元素之后的所有元素都向前移动一位,size减少
//注意此时it变成了野指针!!
//函数返回值为被删除元素的下一个元素的迭代器
x.remove()
vector<int>(v).swap(v);//可以减少v的capacity
/*
(1)交换时,首先会用v1初始化一个临时对象,临时对象会根据v1的元素个数进行初始化;
(2)交换临时对象和v1;
(3)临时对象交换后销毁,v1原来的空间也销毁了;v1就指向现在的空间,使得v1的capacity减少
*/
reverse(x.begin(), x.end());
vector<vector<int> > x(5); //定义二维动态数组大小5行
for(int i =0; i< x.size(); i++)//动态二维数组为5行6列,值全为0
{
x[i].resize(6);
}
或者
vector<vector<int> > x(5, vector<int>(6)); //定义二维动态数组5行6列
//二维数组遍历
for(it = v.begin(); iter != v.end(); it++)
{
x = *it;
for(i = x.begin(); i != x.end(); i++)
cout << *i << " ";
}
for (i = 0; i < v.size(); i++)
{
for(j = 0; j < v[i].size(); j++)
cout << vec[i][j] << " ";
}