1.初步了解和使用vector list、vector实质是一个动态增长数组,list是一个链表,他们都是STL的一种容器。
①使用vector
vector使用样例代码:
#pragma once
#include<iostream>
using namespace std;
#include<vector>
void test_vector()
{
vector<int> v;
v.push_back(1);
v.push_back(2);//尾插
v.push_back(3);
v.push_back(4);
v.push_back(5);
vector<int>::iterator it = v.begin();//迭代器
while (it != v.end())
{
cout << *it << " ";
++it;
}
it--;
v.insert(it, 0);//在目标位之前插入
cout << endl;
it = v.begin();
while (it != v.end())
{
cout << *it << " ";
it++;
}
cout << endl;
--it;
v.erase(it);//对目标位置进行删除
it = v.begin();
while (it != v.end())
{
cout << *it << " ";
it++;
}
cout << endl;
v.resize(10,5);//改变vector size大小,并对新添加的空间初始化;
it = v.begin();
while (it != v.end())
{
cout << *it << " ";
it++;
}
cout << endl;
v.reserve(100);//改变数组容量,不进行初始化
it = v.begin();
while (it != v.end())
{
cout << *it << " ";
it++;
}
cout << endl;
cout << v.size() << endl;//size()返回数组当前所用的数据个数
cout << v.capacity() << endl;//capacity()返回数组的容量
}
通过上面的使用我们了解vector各个接口的功能,对于插入我只是用了push_back、insert接口,头插和尾插是一样的效果;还有迭代器我只是用了iterator,其实他还有consr_iterator、reverse_iterator其实用法都是一样的;接下来我们再来了解一下list的用法和接口功能;
- 在这里我得讲清楚一个问题迭代器失效,首先它的场景是这样的:
while (it != v.end())
{
if (*it % 2 == 0)
{
v.erase(it);
}
it++;
}
分析当这句代码执行第一次循环是会挂掉,原因是这样的:第一次执行他的时候,v.erase(it)删掉了这个位置,而it在vector下的实际情况是一个指针,所以当删掉它的时候就会出现像野指针这样的问题,再对他进行加加操作时就再找不到它的位置了;
关于vector迭代器失效问题有以下接解决方案:
while (it != v.end())
{
if (*it % 2 == 0)
{
it=v.erase(it);//erase返回it得下一个位置(迭代器类型)
}
else
{
it++;
}
}
erase删除的时候会返回的他的下一个位置的迭代器