首页 > 其他分享 >mystl——vector容器

mystl——vector容器

时间:2023-07-04 22:12:19浏览次数:30  
标签:容器 mystl iterator value vector const type size

vector

代码仓库:https://github.com/sjz-hub/mystl

简介

  • vector是向量,c++标准STL容器的一种
  • 特点
    • 顺序存储:容器元素严格按照线性顺序排序
    • 随机访问:支持[]和at(),时间复杂度是O(1)
    • 动态添加删除:支持在内部添加删除元素

实现原理

image

  • vector的成员变量
    • iterator begin_指向存放的第一个元素
    • iterator end_指向存放的最后一个元素的下一个元素
    • iterator cap_指向容器空间最后一个位置的下一个位置
  • vector底层实现结构为数组,所以其迭代器iterator 就是T*
  • 当容器空间不足时,会重新申请一块更大空间,然后将原先的内容都move过来

vector的public方法

方法名 含义
vector() 尝试初始化一块16内存空间
explicit vector(size_type n) 创建包含n个元素的vector,调用默认构造函数
vector(size_type n, const value_type& value) 创建包含n个指定元素的vector
template <class Iter, typename std::enable_if< mystl::is_input_iterator::value, int>::type = 0> 使用[first,last)初始化容器
vector(const vector& rhs) 拷贝构造函数
vector(vector&& rhs) noexcept 移动构造函数
vector(std::initializer_list<value_type> ilist) 使用列表的方式初始化容器
vector& operator=(const vector& rhs) 拷贝运算符
vector& operator=(vector&& rhs) noexcept 移动运算符
vector& operator=(std::initializer_list<value_type> ilist) 接收列表的等于运算符
~vector() 析构函数
iterator begin() noexcept 返回开始迭代器
const_iterator begin() const noexcept 返回const_iterator开始迭代器
iterator end() noexcept 返回尾迭代器
const_iterator end() const noexcept 返回尾const_iterator
reverse_iterator rbegin() noexcept 返回反向开始迭代器
const_reverse_iterator rbegin() const noexcept 返回const_reverse_iterator开始迭代器
reverse_iterator rend() noexcept 返回reverse_iterator尾迭代器
const_reverse_iterator rend() const noexcept 返回const_reverse_iterator尾迭代器
const_iterator cbegin() const noexcept
const_iterator cend() const noexcept
const_reverse_iterator crbegin() const noexcept
const_reverse_iterator crend() const noexcept
bool empty() const noexcep 判断容器是否为空
size_type size() const noexcept 返回容器存储元素的个数
size_type max_size() const noexcept 返回容器的最大大小
size_type capacity() const noexcept 返回容器的开辟空间大小
void reserve(size_type n) 当原容量大小小于n时会重新分配,新的容量应该大于等于n
void shrink_to_fit(); 放弃多余的容量,使得容器容量变为和size一样的大小
reference operator[](size_type n) 访问元素,返回的是引用
const_reference operator[](size_type n) const 访问元素,返回的是const引用
reference at(size_type n) 返回指定索引的引用
const_reference at(size_type n) const 返回指定索引的const引用
reference front() 返回第一个元素的引用
const_reference front() const 返回第一个元素的const引用
reference back() 返回最后一个元素的引用
const_reference back() const 返回最后一个元素的const引用
pointer data() noexcept 返回第一个元素的指针
const_pointer data() const noexcept 返回第一个元素的const指针
void assign(size_type n, const value_type& value) 重新分配空间,包含n个内容为value的元素
template <class Iter, typename std::enable_if< mystl::is_input_iterator::value, int>::type = 0> void assign(Iter first, Iter last) 重新分配,使用[first,last)赋值
void assign(std::initializer_list<value_type> il) 使用列表的形式进行重新分配
template template <class ...Args> typename vector::iterator vector::emplace(const_iterator pos, Args&& ...args) 如果pos是尾迭代器,直接在这个位置构造元素,并且尾迭代器后移;在pos位置构造元素,原先的元素和后面的都统一后移
template <class... Args> void emplace_back(Args&& ...args) 在最后的位置添加一个元素
void push_back(const value_type& value) 在最后的位置添加一个元素
void push_back(value_type&& value) 在最后的位置添加一个元素
void pop_back() 删除最后一个元素
template typename vector::iterator vector::insert(const_iterator pos, const value_type& value) 在pos前面插入一个元素,并返回这个元素的迭代器
iterator insert(const_iterator pos, value_type&& value) 在pos前面插入一个元素,并返回这个元素的迭代器
iterator insert(const_iterator pos, size_type n, const value_type& value) 在pos前面插入n个元素,并返回这n个元素中第一个元素的迭代器
template <class Iter, typename std::enable_if< mystl::is_input_iterator::value, int>::type = 0> void insert(const_iterator pos, Iter first, Iter last) 在pos前面插入[first,last)的内容
iterator erase(const_iterator pos); 删除指定位置的元素,使得后面的元素前移一位,并且返回删除位置的迭代器
template typename vector::iterator vector::erase(const_iterator first, const_iterator last) 删除指定范围的元素,并返回删除元素后的first的迭代器
template void vector::resize(size_type new_size, const value_type& value) 重置容器大小,如果size大于new_size删除对应的元素即可,如果小于new_size,则在后面使用value进行填充
void resize(size_type new_size) 重置容器大小,如果size大于new_size删除对应的元素即可,如果小于new_size,则在后面使用T()进行填充
template void vector::swap(vector& rhs) noexcept 与另一个vector进行交换
void reverse() 容器元素反转
void clear() 清空容器,对容器中的每个元素调用析构函数,但是不释放内存

vector的private帮助函数

方法名 含义
template void vector::try_init() noexcept 尝试分配初始空间16,初始化三个迭代器
template void vector::init_space(size_type size, size_type cap) 初始化空间大小为cap,并且此时已经有了size个大小,这里只需要初始化三个迭代器,这里只是先确定了end_的大小,在调用这个函数的位置肯定会把前size个位置进行一个填充的;(调用这个函数的时候需要释放原先的空间,因为进行重新分配了)
template void vector:: fill_init(size_type n, const value_type& value) 初始化包含n个value的的vector,如果小于16就开辟16个元素空间,如果大于16,则开辟n个空间,然后将前n个元素进行初始化
template template void vector:: range_init(Iter first, Iter last) 这个和fill_init(size_type n, const value_type& value)函数一样,只不过每个元素的值为两个迭代器之间的值,这里面可以通过两个迭代器获得m
template typename vector::size_type vector:: get_new_cap(size_type add_size) 根据给出的增加的大小返回一个新的容器的大小;如果old_size*1.5>max_size() 此时返回的是 old_size+add_size(+16)如果加上16之后没有超过max_size()的话;如果old_size * 1.5< max_size() 此时会根据old_size是否为0,如果为0则返回16 和add_size的最大值,如果不为0,则返回1.5old_size和old_size+add_size的最大值
template void vector:: fill_assign(size_type n, const value_type& value) 对vector进行重新分配,如果n>capacity()则重新分配一个新空间的为n,然后为其进行赋值为value;如果只是大于size()则只需要将其前n个进行填充替换即可;如果n<size(),则填充前n个后面的则删除
template template void vector:: copy_assign(IIter first, IIter last, input_iterator_tag) 使用迭代器间的值进行重新分配[first,last)
template template void vector:: copy_assign(FIter first, FIter last, forward_iterator_tag) 双向迭代器的拷贝重新分配,这个和上面的那个输入迭代器没感觉出来应该有啥区别啊,所以这里暂时只将输入迭代器的方式实现,其实也不是输入迭代器的方式,而是直接实现,不管迭代器的类型
template typename vector::iterator vector:: fill_insert(iterator pos, size_type n, const value_type& value) 就是在pos前面插入n个value,返回插入元素的迭代器
template template void vector:: copy_insert(iterator pos, IIter first, IIter last) 和fill_insert(iterator pos, size_type n, const value_type& value)类似,只是使用两个迭代器之间的值进行赋值[first,last)
template void vector::reinsert(size_type size) 申请vector大小为size,然后将原先的内容move过来新的数组空间

代码仓库:https://github.com/sjz-hub/mystl

标签:容器,mystl,iterator,value,vector,const,type,size
From: https://www.cnblogs.com/sunjianzhao/p/17527153.html

相关文章

  • mystl之deque容器
    deque代码仓库:https://github.com/sjz-hub/mystl简介deque是双端队列,c++标准STL容器的一种特点双向访问:支持在队列的两端进行高效的插入和删除操作内部插入:支持在内部进行插入和删除操作,但是性能不如list随机访问:支持[]和at(),但是性能不如vector实现原理双端队列容......
  • 2023容器网络趋势:CNI网络插件逐渐普及,Kube-OVN受欢迎度持续攀升
    今年,Kube-OVN社区联合OSCHINA、云原生社区共同发起了《2022-2023容器网络使用情况调研》,得到了大批K8s/容器网络技术人员的关注。本调研旨在更加直观地了解各行业企业容器网络的使用现状,以及Kube-OVN在社区用户中的使用情况,以便更全面地评估容器网络发展方向,更有针对性地规划Kub......
  • 条件注解之@ConditionalOnProperty注解:通过配置文件的配置来控制配置类是否加入spring
    一、条件注解分类常见的@ConditionalOnxxx开头的注解我们称之为条件注解,常见的条件注解有class条件注解:@ConditionalOnClassbean条件注解:@ConditionalOnBean属性条件注解:@ConditionalOnProperty…@ConditionalOnProperty:如果有指定的配置,条件生效;@ConditionalOnBean:如果......
  • docker命令、容器挂载、镜像制作、docker compose、docker私有仓库
    服务相关命令--开启dockersystemctlstartdocker--关闭dockersystemctlstopdocker--查看docker状态systemctlstatusdocker--重启systemctlrestartdocker--开机启动dockersystemctlenabledocker镜像相关命令--查看镜像dockerimages--搜索镜像以......
  • shell脚本:将运行容器的日志输出到文件清理服务器上的符合条件的docker镜像
    采集容器日志的shell脚本内容为:点击查看代码#!/bin/bashexportLANG=zh_CN.gb18030.~/.bash_profile#日志放置目录log_path=/aa/bb/cc/dd/eetodaydate=$(date+%Y%m%d)nowdate=$(date+%Y%m%d%H%M)#pod列表dube_pod_id='xx1-servicexx2-servicexx3-servicexx4-se......
  • 开发软件 --- java web 容器
    JavaWeb容器是一种运行JavaWeb应用程序的环境,提供对Servlet和JSP等技术的类库支持。以下是一些常见的JavaWeb容器:轻量级 ApacheTomca流行的开源轻量部分支持的javaweb容器。支持Servlet、JSP和WebSocket等技术。Jetty高性能的开源轻量部分支持的java......
  • 算法竞赛中C++ vector的常规操作
    算法竞赛中C++vector的常规操作对vector的理解vector官方将其翻译为向量,但实际上是变长的动态数组,其可以存放各种类型的对象。vector定义语法大致格式:vector<类型>数组名在初始情况下,vector的大小是0,也就是空的数组。下面都以int型举例。vector<int>v;/......
  • PowerShell系列四:容器操作
    容器容器是一个很通用的概念。比如文件、文件夹、注册表、磁盘分区、数组、hash表、命名空间、用户组、OU、数据库、数据表等等,它们的共同点就是包含了数据。在PowerShell中一切都是从"PSDrive"开始的,您熟悉了操作PSDrive,基本就涵盖了对资源的操作。Get-PSDrive#输出Name......
  • 可视化容器管理工具-portainer.io使用
    续docker日常使用指南背景当我们开始使用docker后,我们的机器上镜像和容器会越来越多,或者有时候我们有多台开发机的时候,单纯使用命令行去管理镜像和容器就变得麻烦了,这时,我们就可以选择一些可视化的容器管理工具来保护我们为数不多的头发了。portainer.io就是这方面的一个不错的......
  • Spring容器获取Bean的9种方式
    1前言随着SpringBoot的普及,Spring的使用也越来越广,在某些场景下,我们无法通过注解或配置的形式直接获取到某个Bean。比如,在某一些工具类、设计模式实现中需要使用到Spring容器管理的Bean,此时就需要直接获取到对应的Bean。本文为大家整理汇总了常见的获取Bean的方式,并提供一些优......