vector是C++STL中的部分,中文意思为"向量",它是一个多功能的,能够适用于多种数据结构和算法的模板类和函数库。因为它能够像容器一样存放各种类型的对象,因此也被称为容器。也可以说,vector是一个能够存放任意类型的动态数组,能够增加和移除数据。它只能在尾端快速插入删除元素,所以也叫单端数组。
使用vector时需要加入头文件和命名空间:
#include <vector>
using namespace std;
一.vector 默认构造和带参构造
//默认构造
vector<int> v1; //存储int类型的vector容器
vector<float> vFloat; //存储float类型的vector容器
vector<stubent> vStu; //存储自定义类类型的vector容器
//带参构造
vector<int> vInt2(10); //构造时分配10个元素空间,值默认为0
vector<int> vInt3(10, 666); //构造时分配10个元素,值为666
vector<int> vInt4(vInt2); //构造时vInt2拷贝给vInt4
vector<int> vInt5(vInt2.begin(), vInt2.end()); //构造时将vInt2[degin end)区间元素拷贝给vInt5,注意:前开后闭
vector<int> vInt6(vInt2.begin() + 3, vInt2.end()); //构造时将vInt2[degin+3 end)区间元素拷贝给vInt6,注意:前开后闭
int test[] = { 1, 2, 3, 4, 5 };
vector<int> vInt4(test, test + 5); //构造时将test[test test+5)区间元素拷贝给vInt4,注意:前开后闭
二.vector的赋值
vector<int> vInt2(10, 6);
vector<int> vInt3(5, 5);
//注意:vInt2为空时这样访问会报错,注意访问越界
vInt2[0] = 1; //将1赋值给vInt2下标为0的元素
//使用at,注意越界
vInt2.at(2) = 7; //将7赋值给vInt2下标为2的元素
//assign赋值
vInt2.assign(2, 8); //改变vInt2中的第二个元素的值替换成8
vInt2.assign(vInt3.begin(), vInt3.end()); //将vInt3[begin end)区间元素赋值给vInt2,注意:前开后闭
vInt2.assign(test, test + 3); //将test[test test+3)区间元素赋值给vInt2,注意:前开后闭
vInt2 = vInt3; //直接调用赋值
//使用接口返回的引用
vInt2.front() = 7; //将7赋值给vInt2最靠前的那个元素
vInt2.back() = 7; //将7赋值给vInt2最靠后的那个元素
//swap交换
vInt2.swap(vInt3); //交换vInt2和vInt3的元素和值
三.vector的大小
vector<int> vInt1(10, 5);
//resize调整大小
vInt1.resize(2); //重新调整大小,缩小时指定元素值无效
vInt1.resize(15, 7); //重新调整大小,扩大后多出元素值为7
vInt1.resize(15); //重新调整大小,扩大后多出元素值默认为0
//size查看存储元素个数
cout << "v2 的元素个数:" << vInt1.size() << endl; //查看vInt1的元素个数
//capacity查看容量
cout << "v2 的容量:" << vInt1.capacity() << endl; //查看vInt1的空间大小
//empty判断是否为空
if (vInt1.empty()) {
cout << "vInt1 为空!" << endl; //如果执行这一行就为空
}
/*
注意:如果vInt1的首地址和vInt1调整大小后首地址不一样,原因是以前的
10个空间不够用了,重新开辟一块空间把原来的值拷贝到新的空间中!
*/
四.vector尾部的添加与删除元素
vector<int> vInt2(10,5);
//push_back尾部添加
vInt2.push_back(999); //尾部添加元素,值为999
//pop_back尾部删除
vInt2.pop_back(); //尾部删除元素
五.vector的插入与删除
vector<int> vInt2(10, 5);
vector<int> vInt3(3, 8);
//insert插入单个元素
vInt2.insert(vInt2.begin()+1, 888); //插入位置需要用迭代器,插入的值为888,插入位置之后的元素都要向后进行移动
//insert插入多个元素
vInt2.insert(vInt2.begin(), 3, 777); // 在最靠前的位置插入3个元素,值为777,插入位置之后的元素都要向后进行移动
vInt2.insert(vInt2.begin(), vInt3.begin(), vInt3.end()); // 在最靠前的位置插入vInt3[begin end)区间的元素个数,值为vInt3[begin end)区间的元素值,插入位置之后的元素都要向后进行移动
vInt2.insert(vInt2.begin() + 3, vInt3.begin(), vInt3.end()); // 在最靠前的位置加上(下标为3)的位置上插入vInt3的[begin end)的元素个数,值为vInt3[begin end)区间的元素值,插入位置之后的元素都要向后进行移动
//clear删除所有元素
vInt2.clear(); //所有元素都删除了,(注意:空间不受影响)
//erase删除单个元素
vInt2.erase(vInt2.begin()); //删除最靠前的元素
//erase删除多个元素
vInt2.erase(vInt2.begin(), vInt2.begin() + 3);//删除vInt2[begin begin+3)区间元素(注意:前开后闭)
六.vector与迭代器
vector<int> vInt2;
vInt2.push_back(1);
vInt2.push_back(2);
vInt2.push_back(3);
vInt2.push_back(4);
vInt2.push_back(5);
//下标输出
for (unsigned int i = 0; i < vInt2.size(); i++) {
cout << vInt2[i] << endl;
}
//普通迭代器输出
for (vector<int>::iterator it = vInt2.begin(); it != vInt2.end(); it++) {
cout << *it << "\t"; //输出1 2 3 4 5
}
//逆转迭代器输出
for (vector<int>::reverse_iterator rit = vInt2.rbegin(); rit != vInt2.rend(); rit++) {
cout << *rit << endl; //输出5 4 3 2 1
}
//常量迭代器输出
for (vector<int>::const_iterator cit = vInt2.cbegin(); cit != vInt2.cend(); cit++) {
cout << *cit << endl; //输出1 2 3 4 5 注意:常量迭代器不能修改值
}
//常量逆转迭代器输出
for (vector<int>::const_reverse_iterator crit = vInt2.crbegin(); crit != vInt2.crend(); crit++) {
cout << *crit << endl;//输出5 4 3 2 1 注意:常量迭代器不能修改值
}