1.构造函数
void test_vector1()
{
vector<int> v; //无参的构造函数
vector<int> v2(10, 0);//n个value构造,初始化为10个0
vector<int> v3(v2.begin(), v2.end());//迭代器区间初始化,可以用其他容器的区间初始化
vector<int> v4(v3); //拷贝构造初始化
}
2.遍历vector的三种方式
//遍历vector
//1.下标[]
for (size_t i = 0; i < v3.size(); i++)
{
cout << v3[i] << " ";//也可以用at
}
cout << endl;
//2.迭代器
vector<int>::iterator it = v4.begin();
while (it != v4.end())
{
cout << *it << " ";
++it;
}
//3.for
for (auto ch : v4)
{
cout << ch << " ";
}
cout << endl;
3.析构函数
4.capacity
先看一下vector的扩容机制
void test_vector2()
{
size_t sz;
vector<int> v;
v.reserve();提前开好空间,size没有变,capacity变了
sz = v.capacity();
cout << "making v grow:\n";
for (int i = 0; i < 100; i++)
{
v.push_back(i);
if (sz != v.capacity())
{
sz = v.capacity();
cout << "capacity changed:" << sz << '\n';
}
}
}
输出:大概是1.5扩容
易错点:reserve空间开出来就可以访问吗?看下面的代码:
void test_vector3()
{
vector<int> v;
v.reserve(100);
/*for (size_t i = 0; i < v.size(); i++) 不能初始化,因为reserve只是把v的容量变成100,但是size还是0
{
v[i] = i;
}*/
for (size_t i = 0; i < 100; i++)//错误
{
v[i] = i;//[]只能访问0~size-1的数据
}
for (auto e : v)
{
cout << e << " ";
}
cout << endl;
}
要是想访问,只能用下面的方法。
void test_vector3()
{
vector<int> v;
// v.reserve(100);//size=0 capacity=100
v.resize(100); //size=100 capacity=100
for (size_t i = 0; i < 100; i++)
{
v[i] = i;
}
for (auto e : v)
{
cout << e << " ";
}
cout << endl;
}
其中最最重要的是resize和reserve,max_size是没有意义的接口,告诉能开多大空间,但是实际上不准,所以平时不需要管。
5.[]、at
和string类似
front和back支持访问头尾的数据,但是一搬习惯于[]
6.push_back、pop_back
void test_vector4()
{
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.insert(v.begin(), 5); //在pos位置之前,插入val
for (auto e : v)
{
cout << e << " ";
}
cout << endl;
auto it = find(v.begin(), v.end(), 3);//要想在3之前插入,vector里面没有find,algorithm算法库里面有find
if (it != v.end())
{
v.insert(it, 30);
}
for (auto e : v)
{
cout << e << " ";
}
删除
it = find(v.begin(), v.end(), 3);
if (it != v.end())
{
v.erase(it);
}
for (auto e : v)
{
cout << e << " ";
}
//clear只是清除数据,不清除capacity
}
输出: