首页 > 编程语言 >c++ 容器 vector

c++ 容器 vector

时间:2024-08-04 23:24:16浏览次数:15  
标签:容器 迭代 c++ 构造 back vector swap 就是

vector的意思就是向量,就是一个顺序表的意思,这个顺序表可以存任意的类型,因为其线性的内存特点,所以在stl里是经常被使用的存在。

vector

vector既然要能储存任意的变量,那么就必须使用模板:

这里的T就是变量类型,Alloc是内存池,这里先不多介绍不是vector的重点,后面我单独提出来讲。

vector的成员变量

因为vector本质就是顺序表,所以它的成员变应该是一个指针,一个size,一个capacity,但是通过查阅stl的官方开源代码,发现是一下的一种成员形式:

这里我们看到源码里面将Ttypedef成了value_type 所以看到它就是类型变量名的意思,iterator就是对应的指针。

用start变量,即T*的指针来指向空间的开始,然后用finish变量来指向内容的结尾的下一个地址,用end_of_storage来指向存储空间的结尾的下一个地址:

vector的成员函数和相关的全局函数

构造、析构,赋值

首先讲的函数就是和构造相关的操作

构造函数

这里构造函数主要是默认构造,拷贝构造,带参构造,迭代器构造,初始值设定项列表构造,右值引用构造。这里的右值引用我先不讲,因为我还没学。后面补上,迭代器还有读者不清楚的可以看这一篇文章:c++迭代器介绍

其中初始值设定项列表和右值引用是在c++11之后才有的。

默认构造

默认构造就是构造一个什么内容都没有的容器。

带参构造

带参构造支持:

写成函数就是这个样子。如果只写一个参数,那么就以T的默认构造的值来进行构造。这里要补充一下,为了让所有变量都支持T()这种写法,所以将所有的编译器自带的变量也支持的带参、默认了:

所以我们以int的vector为例:

拷贝构造

拷贝构造就是我们传一个预先构造好的同类型vector,让后创建和它相同值的vector出来:

其中的b和c都是拷贝构造。

迭代器构造

迭代器构造就是可以用一个容器的迭代器开始和结束来实现构造,那么它的优点就很明显,可以跨容器构造:

初始值设定项列表构造

这个可能对大家有点陌生,可以看看我的这一篇博客,详细介绍了它c++ 初始值设定项列表(initializer_list)-CSDN博客

那么这里就不多介绍,看一个例子就行了:

其他函数

迭代器类

不会迭代器的可以看这一篇:c++迭代器的介绍-CSDN博客

里面详细介绍了迭代器,这里就不多讲了,我在之前的string类里面也详细讲了迭代器,所有容器迭代器基本上都是这几个函数。具体不同都是因为内存的结构不一样导致的。只会少不会多。

容器内存操作类

有几个比较常见的我就不说了。提一下容易错的

max_size和capacity

max_size和capacity是不一样的,max_size是我们一直往后存n个数,能存的极限是多少,一般就是size_t类的-1。

capacity是一直往后存,不扩容的情况下能存的极限是多少,也就是当前new的内存的长度。

resize

就是你要增长就按对应的值增长

如果是长度比之前小,就是缩短,如果是增长,且你不穿第二个参数,就是用默认值增长,这里的默认值是T(),你传了就是用你的。

reserve

我们先看扩大:

发现它是属于绝对听从命令的

然后看缩小

我们发现,它绝对不缩容。

那么和string不一样的点就在扩容上面,string增长会根据1.5倍扩容来reserve ,假如你现在是64长度的capacity,那么你要扩到80,他会给你扩到96。

综上就是,扩容全听你的,缩容不听你的。

shrink_to_fit

这个也好说,强制缩容,让capacity=size

元素操作类

operator[]和at

作用都是一样的,只是一个断言,一个抛异常。

这个同back一样,返回对应点的引用。

data

data就是返回一个同类型的数组给你。

修改类

第一个就是重新初始化,对之前的数据进行覆盖:

相对于构造函数,少了拷贝,默认和右值引用。其他和对应的构造是一样的。

push_back,emplace_back功能上是一样的,但是emplace_back在某些场景下是比push_back快的。他们都是尾插。

pop_back就是尾删

 insert和emplace

insert第一个参数就是要插入的下标之前插入n个数,后面的参数和构造函数的传参为一不同的就是没有默认构造。

emplace和其实同样的功能

erase

erase有两个传参分别传开头和结尾的迭代器,如果不穿结尾迭代器默认全部删除
swap

swap相比于传统的swap来说,只是浅交换,将三个变量进行交换,因为传统的swap会创建中间变量。

clear

清除数据但是保留容量

非成员函数

逻辑运算符

swap

这里的swap是一个实例化函数,专门针对vector的,防止实例化了原版的swap。这个swap是调用vector类的swap函数。

vector的实现

有了顺序表的基础和string的基础,我们实现vector就是手拿把掐的事情:

标签:容器,迭代,c++,构造,back,vector,swap,就是
From: https://blog.csdn.net/2301_80772499/article/details/140906152

相关文章

  • C++11 中的闭包
    什么是闭包?闭包是一种可以捕获其创建环境中的变量的函数。闭包允许函数在离开其创建环境后仍然访问和操作这些变量。Lambda表达式lambda表达式的基本语法如下:[capture](parameters)->return_type{//functionbody};capture:指定哪些外部变量可以在lambda表达式中......
  • C++11 中 声明式的编程风格
    //SetatargetPoseautoconsttarget_pose=[]{geometry_msgs::msg::Posemsg;msg.orientation.w=1.0;msg.position.x=0.28;msg.position.y=-0.2;msg.position.z=0.5;returnmsg;}();move_group_interface.setPoseTarget(target_pose);//......
  • Ros2 Moveit2 第一个C++项目
     本教程将指导您使用MoveIt编写第一个C++应用程序。警告:MoveIt中的大多数功能将无法正常工作,因为完整的MoveGroup功能需要附加参数。如需完整设置,请继续阅读MoveGroupC++接口教程。先决条件如果您还没有这样做,请确保您已经完成入门指南中的步骤。本教程假设您了......
  • 【C++从小白到大牛】栈和队列(优先级队列)
    目录引言:使用方法篇:stack:queuepriority_queue使用方法:模拟实现篇:stack:原码:queue原码:priority_queue插入和删除数据的思想:仿函数实现比较原码:引言:本文主要讲解C++STL库中stack、queue、priority_queue的使用方法和模拟实现。我们首先需要对stack、queue进......
  • ubuntu22.04容器安装ssh服务
    除了特别说明外,否则以下命令均为ubuntu22.04容器内执行!!!安装查看ubuntu22.04有没有安装openssh-server,执行命令:sudodpkg--list|grepssh没有找到openssh-server的包,很显然,没有安装,那么就开始安装,执行:sudoaptinstallopenssh-server安装完成后,通过上图相关的包已经......
  • 希尔排序, 插入排序, 冒泡排序, 选择排序【C++】
    希尔排序,插入排序,冒泡排序,选择排序测试代码希尔排序选择排序冒泡排序插入排序测试代码#include<iostream>usingnamespacestd;intmain(){intarr[6]={0};intlen=sizeof(arr)/sizeof(int);for(inti=0;i<len;i++){......
  • c++编写生产者消费者模型
    直接上代码啦:#include<iostream>#include<queue>#include<thread>#include<mutex>#include<condition_variable>#include<stdexcept>//定义一个同步的队列类classSyncQueue{public:SyncQueue(size_tcapacity):max_capacity(c......
  • windows C++-通过 C++/WinRT 使用 API(三)
    统一构造在C++/WinRT版本2.0及更高版本中,有一种优化的构造形式可供你使用,它被称作“统一构造”(请参见C++/WinRT2.0中的新增功能和更改)。若要使用统一构造而不是winrt::make,你需要一个激活工厂。要生成激活工厂,一种好的方式是向IDL添加构造函数。//MainPage.idl......
  • windows C++-通过 C++/WinRT 使用 API(二)
    延迟初始化在C++/WinRT中,每个类型都有一个特殊的C++/WinRTstd::nullptr_t构造函数。除了该构造函数,所有其他类型的构造函数(包括默认的构造函数)都会导致系统创建一个支持的Windows运行时对象,并为你提供它的智能指针。因此,该规则适用于使用默认构造函数的任何地方,例如......
  • C++3级
    虚拟星辰大家好,我是新人,这是我的第一个博客,6月29日的3级认证T1题目大致是这样的:小杨发明了一套密码系统,具体来说,他把字母的顺序向后移了N位。比如说,原来的字母顺序是:ABCDEFGHIJKLMNOPQRSTUVWXYZ当N为1时,字母顺序变为:BCDEFGHIJKLMNOPQRSTUVWXYZA当N为2时,字母顺序变为:CDEF......