vector
vector是表示可变大小数组的序列容器,即动态顺序表
像数组一样,vector也采用连续得到存储空间来存储元素,可以使用下标访问
又不像数组,vector大小可以动态改变,而且大小会被容器自动处理
初始化
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int>v{ 0,1,2,3,4,5,6,7 }; //0 1 2 3 4 5 6 7
//从数组中获得初始值
vector<int> v1(10); //
//定义了10个整型元素的向量
//尖括号为元素类型名,没有给初始值
vector<int>v2(10, 1); //1 1 1 1 1 1 1 1 1 1
//定义了10个整型元素的向量,且初始值为1
vector<int>v3(v); //0 1 2 3 4 5 6 7
//用v向量来创建v3,使v3和v一样
vector<int>v4(v.begin(), v.begin()+3); //0 1 2
//基于迭代器的初始化,左闭右开
}
非更易型操作(Nonmodifying Operating)
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int>a{ 1,2,3,4,5 };
cout << a.size() << endl; //5
//返回当前元素个数
cout << a.empty() << endl; //0
//判空,相当于size()==0
cout << a.capacity() << endl; //5
//返回容器当前最大容量
a.reserve(100); //若容量不足,则扩容为100
cout << a.size() << endl; //5
cout << a.capacity() << endl; //100
a.shrink_to_fit(); //降低容量,使capacity()=size()
cout << a.capacity() << endl; //5
}
赋值操作
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int>b{ 1,2,3,4,5 };
vector<int>c;
c = b; //1 2 3 4 5
//将b的全部元素赋值给c
c.assign(5, 1); //1 1 1 1 1
//给c赋值5个1
c.assign(b.begin(), b.end()-1); //1 2 3 4
//基于迭代器的赋值,左闭右开
c.swap(b); //b:1 2 3 4 c:1 2 3 4 5
//置换b,c的数据
swap(b, c); //b:1 2 3 4 5 c:1 2 3 4
//置换b,c的数据
}
元素访问
只有at()会检查边界,若越界,抛出 out_of_range 异常
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int>d{ 0,1,2,3,4,5 };
cout << d[2] << endl; //2
//返回索引所指向的元素
cout << d.at(2) << endl; //2
//返回索引所指向元素,会进行边界检查
cout << d.front() << endl; //0
//返回第一个元素
cout << d.back() << endl; //5
//返回最后一个元素
}
插入和移除
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int>e{ 1,2,3 };
e.push_back(4); //1 2 3 4
//在末尾添加元素 4
e.pop_back(); //1 2 3
//移除末尾元素,不返回该元素
e.insert(e.begin()+1, 2); //1 2 2 3
//在begin()+1位置插入2
e.insert(e.begin() + 1, 3, 5); //1 5 5 5 2 2 3
//在begin()+1位置插入3个5
e.insert(e.begin(), e.begin(), e.begin() + 2); //1 5 1 5 5 5 2 2 3
//在begin()位置插入前两个元素
e.erase(e.begin()+1); //1 1 5 5 5 2 2 3
//移除begin()+1位置的元素,返回下一个元素的位置
e.erase(e.begin() + 1, e.begin() + 6); //1 2 3
//移除begin()+1到begin()+6所指向的元素,左闭右开,返回下一个元素的位置
e.clear(); //清空
}