vector
vector
std::vector,真正属于STL的一种容器类,封装了动态数组的功能(顺序表)。
使用vector需要包< vector >头文件
vector实际上是类模板,需要显式给模板类型
template <class T, class Allocator = allocator<T>>
class vector;
基本操作
//构造函数
vector<int> v1; //默认构造
vector<int> v2(10,1); //传入参数 n个value初始化
vector<int> v3(++v2.begin(),--v2.end());//传入迭代器 用区间内的初始化
vector<int> v4 = v3; //拷贝构造
vector<int> v5 = {1, 2, 3, 4, 5}; //初始化列表初始化
//遍历
void TestVector1()
{
vector<int> v1(10, 1);
for (int i = 0; i < v1.size(); ++i)
{
cout << v1[i] << " ";
}
cout << endl;
vector<int>::iterator it = v1.begin();
while (it!=v1.end())
{
cout << *it << " ";
++it;
}
cout << endl;
for (auto& vi : v1)
{
cout << vi << " ";
}
cout << endl;
}
//增删改
void push_back (const value_type& val); //尾插
iterator insert (iterator position, const value_type& val); //插入单个数据
iterator erase (iterator position); //删除单个数据
iterator erase (iterator first, iterator last); //删除区间内
void clear() //移除所有元素,size置零
全局swap,成员swap,重载了比较大小
vector没有重载流插入和流提取
迭代器失效
扩容导致内存重新分配
原内存释放导致_start_finish_end_of_storage指针重新指向新的内存
参数 pos 指向原来的位置
但原来的位置已经释放 相当于野指针
因此需要重新计算pos
void insert(iterator pos, const T& val) {
int ipos = pos - _start;
if (_finish == _end_of_storage) reserve(capacity() == 0 ? 4 : capacity() * 2);
pos = _start + ipos;
iterator end = _finish -1;
while (end >= pos) {
*(end+1) = *end;
--end;
}
*pos = val;
++_finish;
}
insert调用后导致迭代器失效,因此注意不访问p(野指针)
int x;
cin >> x;
auto p = find(v.begin(),v.end(),x);
if(p != v.end())
{
// insert调用后p就失效
v.insert(p,40);
//(*p) *= 10;
}
解决办法insert()返回值新的pos,在使用p之前,重新赋值
2655

被折叠的 条评论
为什么被折叠?



