vector是定义于命名空间namespace std内的模板,头文件为#include< vector >

vector介绍

  • vector表示可变大小的序列器
  • vector采用连续的空间来存储数据,所以可以用下标来访问,其空间大小可以动态变化,所以类似于动态数组,因为支持随机访问,所以导致其效率低。
  • vector使用动态分配数组来存储元素,每当容器满了,再插入需要进行扩容时,其会分配一个新数组,将全部元素转移过去,再进行插入操作。

vector接口整理

构造函数

函数声明 接口说明
vector() 无参构造函数
vector(size_type n,const T& val = T() 构造并初始化n个val
vector(Inputlterator first,Inputlterator last) 用迭代器进行构造
vector(const vector& v) 拷贝构造函数
 vector<int> first(4, 10); //构造4个10vector<int> second(first); //拷贝构造函数int m[] = { 1,2,3,4,5 };vector<int> third(m, m + sizeof(m) / sizeof(m[0]));//使用迭代器初始化for (auto it : first){cout << it<<" ";}for (auto it : second){cout << it << " ";}for (auto it : third){cout << it << " ";}

vector迭代器
[begin,end)

iterator 接口说明
begin() 获取数据的第一个位置
end() 获取数据最后一个元素的下一个位置
rbegin()/rend() 反向遍历


增删改查

增删改查 接口说明
push_back() 尾插
pop_back() 尾删
_Pop_back_n(size_t n) 尾删n个元素
find 查找
insert() 在pos位置前面插入
erase() 删除pos位置上的元素
clear() 清空容器
swap() 交换数据空间
operator[ ] 下标访问

push_back()与insert()的区别

push_back()将元素插到vector对象的末尾,insert()将元素插到vector对象的任意位置。
pop_back()尾删操作、erase()可以删除迭代器指定的元素,也可以删除一段区间、clear()删除vector对象的所有元素,类似于erase(begin(),end())

capacity操作

size() 返回有效元素个数
capacity() 返回容器所能容纳的元素数
reserve() 预设容器容量
resize() 修改容器大小
empty() 判空,if==nullptr 返回真
 int a[] = { 1,2,3,4,5,6,7,8,9 };vector<int> v(a, a + sizeof(a) / sizeof(a[0]));//findauto pos = find(v.begin(), v.end(), 3);//insertv.insert(pos, 10);auto it = v.begin();while (it != v.end()){cout << *it << " ";it++;}//operator[] 范围forint a[] = { 1,2,3,4,5,6,7,8,9 };vector<int> v(a, a + sizeof(a) / sizeof(a[0]));v[0] = 10;for (auto e : v){cout << e <<" ";}

迭代器失效

 //场景1 ---------因位置删除int a[] = { 1,2,3,4 };vector<int> v(a, a + sizeof(a) / sizeof(a[0]));auto pos = find(v.begin(),v.end(),3);//因为erase将pos位置的值删除v.erase(pos);//导致迭代器失效cout << *pos << endl;
 //场景2 ---------因底层扩容int a[] = { 1,2,3,4 };vector<int> v(a, a + sizeof(a) / sizeof(a[0]));auto pos = find(v.begin(),v.end(),3);cout << v.capacity() << endl;//insert插入操作,导致底层扩容,但是pos依然指向扩容之前的位置,//但是已经被释放了,导致访问出错v.insert(pos, 5);v.insert(pos, 6);v.insert(pos, 7);

失效场景

  • 所有可能导致底层空间改变的操作 push_back, resize, reaserve
  • erase(it) 删除某个位置

解决办法:
重新给迭代器赋值

vector底层模拟实现

namespace bai
{template<class T>class vector{public:typedef T* iterator;typedef const T* const_iterator;iterator begin()return _first;iterator end()return _end;const_iterator cbegin()return _first;const_iterator cend()return _end;vector():_first(nullptr), _end(nullptr), _endOfcapacity(nullptr){}vector(int n, const T& val = T()):_first(nullptr),_end(nullptr),_endOfcapacity(nullptr){reserve(n);while (n--){push_back(val);}}template<class T>vector(InputIterator start, InputIterator finish){reverse(finish - start);while (start != finish){push_back(*start);++start;}}vector(const vector<T>& v):_first(nullptr),_end(nullptr),_endOfcapacity(nullptr){reverse(v.capacity());iterator it = begin();const_iterator vit = cbegin();while (vit != cend()){*it++ = *vit++;}_end = _first + v.size();_endOfcapacity = _first + v.capacity();}vector& operator(const vector& v){Swap(v);return *this;}~vector(){delete[] _first;_first = _end = _endOfcapacity = nullptr;}void Swap(vector<T>& v){swap(_first, v._first);swap(_end, v, _end);swap(_endOfcapacity, v._endOfcapacity);}private:iterator _first; //指向数据块开头iterator _end;    //指向数据块结尾iterator _endOfcapacity;  //指向容量的尾部};
}

vector:如何创建一个二维数组:

vector<vector<int>> res;res.resize(3); //创建3行for (auto& e : res)  //注意e.resize(4, 1);//给每行申请4个空间,默认初始化值为1

注意:当用vector创建二维数组时,给行申请空间时,最好写成引用,如果不写成引用,导致给行申请空间失败。

C++---vector剖析与模拟实现相关推荐

  1. 详解vector容器(应用+模拟实现,vector相关练习题)

    vector容器 动态的顺序表,数组. vector操作 vector操作及其概念 构造 vector<int>v1;vector<int>v2(10, 5);vector&l ...

  2. C++ vector类的模拟实现

    vector和string虽然底层都是通过顺序表来实现的,但是他们利用顺序表的方式不同,string是指定好了类型,通过使用顺序表来存储并对数据进行操作,而vector是利用了C++中的泛型模板,可以 ...

  3. 主成分分析(PCA)深入剖析+Matlab模拟

    1.降维引发的思考 对于现在维数比较多的数据,我们首先需要做的就是对其进行降维操作.降维,简单来说就是说在尽量保证数据本质的前提下将数据中的维数降低.降维的操作可以理解为一种映射关系,例如函数z=f( ...

  4. 【C++】STL — vector的使用 + 模拟实现

    文章目录

  5. Leetcode402 remove-k-digits贪心+vector模拟栈的思想

    题目 给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小. 注意: num 的长度小于 10002 且 ≥ k. num 不会包含任何前导零. 示例 1 : 输入: ...

  6. vector之resize剖析-曾经的我以为自己真的学会了vector

    vector之resize剖析 零.前言 一.先看下面一段代码 二.测试结果 三.测试代码 零.前言 曾经的我以为自己真的学会了vector!人的认知有限,就以为自己什么都会了.当你深入研究一下时,才 ...

  7. 学习笔记:C++初阶【C++入门、类和对象、C/C++内存管理、模板初阶、STL简介、string、vector、list、stack、queueu、模板进阶、C++的IO流】

    文章目录 前言 一.C++入门 1. C++关键字 2.命名空间 2.1 C语言缺点之一,没办法很好地解决命名冲突问题 2.2 C++提出了一个新语法--命名空间 2.2.1 命名空间概念 2.2.2 ...

  8. c++ - 第9节 - vector类

    目录 1.标准库中的vector类 1.1.vector类 1.2.vector类的常用接口说明 1.3.vector类练习题 2.vector类的模拟实现 2.1.vector类源代码解析 2.2. ...

  9. 冰冰学习笔记:反向迭代器的模拟

    欢迎各位大佬光临本文章!!! 还请各位大佬提出宝贵的意见,如发现文章错误请联系冰冰,冰冰一定会虚心接受,及时改正. 本系列文章为冰冰学习编程的学习笔记,如果对您也有帮助,还请各位大佬.帅哥.美女点点支 ...

最新文章

  1. 2021中国国际消费电子博览会和青岛国际软件融合创新博览会盛大开幕
  2. 寒门出贵子,传递正能量
  3. SQL SERVER全面优化-------写出好语句是习惯
  4. LeetCode Pancake Sorting
  5. 计算机一级考试试题window,全国计算机等级考试一级Window复习题及答案.doc
  6. awk获取+sed替换+paste命令追加一列
  7. @requestbody 接受int参数_C++之指针作为函数参数
  8. Spark(一)-- Standalone HA的部署
  9. 韩国遭 Lazarus Group 供应链攻击
  10. 漏洞奖励计划的五大成功要素问答实录
  11. java web 部署_一步一步将java web项目部署到云服务器
  12. 关于might_sleep的一点说明
  13. ussd代码大全_USSD查询器app
  14. 绿联串口线linux驱动下载,绿联pl2303转串口驱动下载
  15. Unity 监听Hierachy、Project等视图结构变化的事件
  16. ul阻燃标准有几个等级_UL阻燃等级
  17. 原代码审计笔记-安全缺陷
  18. java8_我是如何优雅的使用Optional的
  19. android版本5.1下载,嘉兴禾点点下载-禾点点 安卓版v5.1.1-PC6安卓网
  20. [Python|Clothoid]Clothoid曲线(回旋曲线)与直角坐标求解的python实现

热门文章

  1. UCloud基于Linux内核新特性的下一代外网网关设计及相关开源工作
  2. 谷歌浏览器chrome设置特定网页使用Https(ssl)访问
  3. redis主从配置转
  4. 使用 webstorm 写 typescript 的一些小技巧
  5. SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论...
  6. centOS6.4下Percona-XtraBackup的安装
  7. ASP.NET MVC 之 View 测试
  8. Tomcat的结构概述
  9. 网络性能测试之pathrate的安装使用
  10. 【Liteos系列】之osCmdReg