C++STL之vector



前言

  本文主要介绍C++STL中的vector使用以及模拟实现vector会遇到的一些问题及解决方案。


提示:以下是本篇文章正文内容,下面案例可供参考

一、vector使用

  ①vector定义

#include<iostream>
#include<vector>
using namespace std;
int main(){
    vector<int> v1;  //等待后续传值
    v1.push_back(5);
    vector<int> v2={2,3,4,5};//给定数组定义
    vector<int> v3=v2;
    vector<int> v4(v2);
}

  vector的定义方式常见的就是上面的几种。我们可以根据场景需要,定义自己的数组。
  ②vector的插入与遍历
  数组定义之后,最常见的操作就是数组插入和数组的遍历。用的比较多的是前面两种遍历方式。

#include<iostream>
#include<vector>
using namespace std;
int main(){
    vector<int> v1;  //等待后续传值
    v1.push_back(5);
   	v1.push_back(4);
    v1.push_back(3);
    v1.push_back(2);
    for(const auto&e: v1){
        cout<<e<<" ";
    }
    cout<<endl;
    for(int i=0;i<v1.size();i++){
        cout<<v1[i]<<" ";
    }
    cout<<endl;
    vector<int>::iterator it =v1.begin();
    for(it=v1.begin();it!=v1.end();++it){
        (*it)++;
        cout<<*it<<" ";
    }
    cout<<endl;
}

二、vector模拟实现中的坑

  ①迭代器失效
  vector的inserterase操作可能会导致迭代器失效,对于insert而言,可能会扩容从而导致迭代器失效,对于erase而言,尾删或者删除完整个vector的时候,迭代器会失效。
    insert应对方法:记录相对位置距离即可。返回值为第一个插入元素的位置。

iterator insert(iterator positon,const T& val) {
			assert(positon <= _finish && positon >= _start);
			size_t size = (*this).size();
			size_t capacity = (*this).capacity();
			size_t pos = positon - _start;
			if (size == capacity) {
				capacity = capacity == 0 ? 4 : capacity * 2;
				T* new_start = new T[capacity];
				for (size_t i = 0; i < size; i++) {
					new_start[i] = (*this)[i];
				}
				delete[] _start;
				_start = new_start;
				_finish = _start + size;
				_end_of_storage = _start + capacity;
			}
			iterator tmp = _finish;
			iterator pre = nullptr;
			while ((int)(tmp - positon) > 0) {
				pre = tmp - 1;
				*tmp = *pre;
				tmp--;
			}
			*(positon) = val;

			_finish++;
			return _start + pos;
		}

  同样,对于erase操作而言,也是记录相对位置就行。返回值为删除元素的下一个位置。

iterator erase(iterator position) {
			assert(position >= _start && position < _finish);
			size_t pos = position - _start;
			//if (position == _start) _start+=1;  //内存泄露 无法释放动态申请的空间
			
			iterator next = position + 1;
			iterator pre = nullptr;
			while (next<_finish) {
				pre = next - 1;
				*pre = *next;
				next++;
			}
			_finish--;
			return _start + pos;
		}

总结

本文主要讲了讲vector的常用使用方法,以及插入删除的时候迭代器失效的原因和解决方案。希望对大家有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值