C++ STL vector容器详解

vector 容器是 STL 中最常用的容器之一,它和 array 容器非常类似,都可以看做是对 C++ 普通数组的“升级版”。不同之处在于,array 实现的是静态数组(容量固定的数组),而 vector 实现的是一个动态数组,即可以进行元素的插入和删除,在此过程中,vector 会动态调整所占用的内存空间,整个过程无需人工干预。

vector 常被称为向量容器,因为该容器擅长在尾部插入或删除元素,在常量时间内就可以完成,时间复杂度为O(1);而对于在容器头部或者中部插入或删除元素,则花费时间要长一些(移动元素需要耗费时间),时间复杂度为线性阶O(n)

vector 容器以类模板 vector<T>( T 表示存储元素的类型)的形式定义在 <vector> 头文件中,并位于 std 命名空间中。因此,在创建该容器之前,代码中需包含如下内容:

 
  1. #include <vector>
  2. using namespace std;

注意,std 命名空间也可以在使用 vector 容器时额外注明,两种方式都可以。

创建vector容器的几种方式

创建 vector 容器的方式有很多,大致可分为以下几种。

1) 如下代码展示了如何创建存储 double 类型元素的一个 vector 容器:

 
  1. std::vector<double> values;

如果程序中已经默认指定了 std 命令空间,这里可以省略 std::。

注意,这是一个空的 vector 容器,因为容器中没有元素,所以没有为其分配空间。当添加第一个元素(比如使用 push_back() 函数)时,vector 会自动分配内存。

在创建好空容器的基础上,还可以像下面这样通过调用 reserve() 成员函数来增加容器的容量:

  1. values.reserve(20);

这样就设置了容器的内存分配,即至少可以容纳 20 个元素。注意,如果 vector 的容量在执行此语句之前,已经大于或等于 20 个元素,那么这条语句什么也不做;另外,调用 reserve() 不会影响已存储的元素,也不会生成任何元素,即 values 容器内此时仍然没有任何元素。

还需注意的是,如果调用 reserve() 来增加容器容量,之前创建好的任何迭代器(例如开始迭代器和结束迭代器)都可能会失效,这是因为,为了增加容器的容量,vector<T> 容器的元素可能已经被复制或移到了新的内存地址。所以后续再使用这些迭代器时,最好重新生成一下。


2) 除了创建空 vector 容器外,还可以在创建的同时指定初始值以及元素个数,比如:

 
  1. std::vector<int> primes {2, 3, 5, 7, 11, 13, 17, 19};

这样就创建了一个含有 8 个素数的 vector 容器。

3) 在创建 vector 容器时,也可以指定元素个数:

  1. std::vector<double> values(20);

如此,values 容器开始时就有 20 个元素,它们的默认初始值都为 0。

注意,圆括号 () 和大括号 {} 是有区别的,前者(例如 (20) )表示元素的个数,而后者(例如 {20} ) 则表示 vector 容器中只有一个元素 20。

如果不想用 0 作为默认值,也可以指定一个其它值,例如:

  1. std::vector<double> values(20, 1.0);

第二个参数指定了所有元素的初始值,因此这 20 个元素的值都是 1.0。

值得一提的是,圆括号 () 中的 2 个参数,既可以是常量,也可以用变量来表示,例如:

  1. int num=20;
  2. double value =1.0;
  3. std::vector<double> values(num, value);


4) 通过存储元素类型相同的其它 vector 容器,也可以创建新的 vector 容器,例如:

  1. std::vector<char>value1(5, 'c');
  2. std::vector<char>value2(value1);

由此,value2 容器中也具有 5 个字符 'c'。在此基础上,如果不想复制其它容器中所有的元素,可以用一或者迭代器来指定初始值的范围,例如:

  1. int array[]={1,2,3};
  2. std::vector<int>values(array, array+2);//values 将保存{1,2}
  3. std::vector<int>value1{1,2,3,4,5};
  4. std::vector<int>value2(std::begin(value1),std::begin(value1)+3);//value2保存{1,2,3}

由此,value2 容器中就包含了 {1,2,3} 这 3 个元素。

vector容器包含的成员函数

相比 array 容器,vector 提供了更多了成员函数供我们使用,它们各自的功能如表 1 所示。
 

表 1 vector 容器的成员函数
函数成员函数功能
begin()返回指向容器中第一个元素的迭代器。
end()返回指向容器最后一个元素所在位置后一个位置的迭代器,通常和 begin() 结合使用。
rbegin()返回指向最后一个元素的迭代器。
rend()返回指向第一个元素所在位置前一个位置的迭代器。
cbegin()和 begin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
cend()和 end() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
crbegin()和 rbegin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
crend()和 rend() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
size()返回实际元素个数。
max_size()返回元素个数的最大值。这通常是一个很大的值,一般是 232-1,所以我们很少会用到这个函数。
resize()改变实际元素的个数。
capacity()返回当前容量。
empty()判断容器中是否有元素,若无元素,则返回 true;反之,返回 false。
reserve()增加容器的容量。
shrink _to_fit()将内存减少到等于当前元素实际所使用的大小。
operator[ ]重载了 [ ] 运算符,可以向访问数组中元素那样,通过下标即可访问甚至修改 vector 容器中的元素。
front()返回第一个元素的引用。
back()返回最后一个元素的引用。
push_back()在序列的尾部添加一个元素。
pop_back()移出序列尾部的元素。
insert()在指定的位置插入一个或多个元素。
erase()移出一个元素或一段元素。
clear()移出所有的元素,容器大小变为 0。
swap()交换两个容器的所有元素。


除此之外,C++ 11 标准库还新增加了 begin() 和 end() 这 2 个函数,和 vector 容器包含的 begin() 和 end() 成员函数不同,标准库提供的这 2 个函数的操作对象,既可以是容器,还可以是普通数组。当操作对象是容器时,它和容器包含的 begin() 和 end() 成员函数的功能完全相同;如果操作对象是普通数组,则 begin() 函数返回的是指向数组第一个元素的指针,同样 end() 返回指向数组中最后一个元素之后一个位置的指针(注意不是最后一个元素)。

vector 容器还有一个 std::swap(x , y) 非成员函数(其中 x 和 y 是存储相同类型元素的  vector 容器),它和 swap() 成员函数的功能完全相同,仅使用语法上有差异。

如下代码演示了表 1 中部分成员函数的用法:

#include <iostream>
#include <vector>
using namespace std;
int main()
{
//初始化一个空vector容量    vector<char>value;value.push_back('S');value.push_back('T');value.push_back('L');//调用 size() 成员函数容器中的元素个数printf("元素个数为:%d\n", value.size());for (auto i = value.begin(); i < value.end(); i++) {cout << *i << " ";}cout << endl;//向容器开头插入字符value.insert(value.begin(), 'C');cout << "首个元素为:" << value.at(0) << endl;return 0;
}
输出结果为:

元素个数为:3
S T L
首个元素为:C

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/224232.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Debezium日常分享系列之:Debezium 2.5.0.CR1发布

Debezium日常分享系列之&#xff1a;Debezium 2.5.0.CR1发布 一、重大变化1.Cloud Event 标头的架构名称2.MySQL BIT 默认长度 二、新功能和改进1.重新选择列2.Debezium Server - 用于 Apache Kafka 接收器的 StreamNameMapper3.增量快照水印的 INSERT/DELETE 语义4.Debezium 服…

1.7 实战:Postman请求Post接口-登录

上一小节我们实战了使用Postman请求Get接口。本小节我们来使用Postman请求Post接口。 我们来测试一下登录,之前已经创建好了Collections。我们选择登录页下的登录这个请求。地址也是跟之前一样,我们打开校园二手交易系统,打开浏览器开发者工具,输入用户名和密码,点击登录…

力扣22. 括号生成(java 回溯法)

Problem: 22. 括号生成 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 我们首先要知道&#xff0c;若想生成正确的括号我们需要让右括号去适配左括号&#xff0c;在此基础上我们利用回溯去解决此题目 1.题目给定n个括号&#xff0c;即当回溯决策路径长度等于 2 n 2n…

网络基础2

三层交换机&#xff1a;路由器交换机 创建vlan 配置0/0/2串口为vlan2&#xff0c;3接口为vlan3 三层交换机的串口是不能直接配置地址&#xff0c;要在虚拟接口&#xff08;vlan的接口&#xff09;配置IP地址 配置vlan1的虚拟接口 此时vlan1的主机能ping通三层交换机串口1的地址…

西南交通大学【数电实验7---按键防抖动设计】

实验电路图、状态图、程序代码、仿真代码、仿真波形图&#xff08;可以只写出核心功能代码&#xff0c;代码要有注释&#xff09; 一共四个状态&#xff1a;1.未按下时空闲状态 2.按下抖动滤除状态 3.按下稳定状态 4.释放抖动滤除状态 在第一个状态时&#xff0c;等待按键按下&…

【jitterbuffer】3:VCMJitterEstimator及所需的概率知识:期望、方差、协方差

期望 : 全国的平均积雪深度 期望值为负 概率就是 不同国家的面积了,总面积是1 期望计算公式 某种函数的期望 K的求和范围 计算期望 1

Peter算法小课堂—简单建模(1)

简单建模是什么&#xff1f;建模模拟数据结构。 太戈编程2601题 题目描述&#xff1a; 你经过多年学习&#xff0c;获得了博士学位&#xff0c;一共发表了n篇论文&#xff0c;并且你的第 i 篇论文得到了来自其他研究文献的 ci 次引用。在学术圈里&#xff0c;通常会使用 H 指数…

Java常用API合集(一)

文章目录 一、StringBuilder类1.1 方法演示1.2 String 和StringBuilder互转1.3 String 和StringBuilder效率对比1.4 应用案例 二、StringJoiner类三、Math类四、System类五、Runtime类 一、StringBuilder类 StringBuilder代表可变字符串对象&#xff0c;相当于是一个容器&…

dcf写入机制

dcf写入机制 写入 dcf提供如下两个写入接口&#xff1a; dcf_write int dcf_write(unsigned int stream_id, const char* buffer, unsigned int length, unsigned long long key, unsigned long long *index);仅在leader节点调用。 dcf_universal_write int dcf_universal_w…

代码审计的未来趋势

代码审计的未来发展趋势&#xff0c;如人工智能、区块链、云计算等代码审计是一项非常重要的工作&#xff0c;可以帮助团队发现潜在的安全漏洞和缺陷。随着技术的不断发展&#xff0c;代码审计也在不断地发展和改进。本文将介绍代码审计的未来发展趋势&#xff0c;包括人工智能…

C++ 标准库-chrono 基本用法

文章目录 再C开发中&#xff0c;经常会遇到时间相关的问题&#xff0c;这里可以借助 <chrono>来帮我们解决问题。 <chrono> 是 C 标准库中的一个头文件&#xff0c;它提供了处理时间和日期的功能。这个库引入了一组类型和函数&#xff0c;用于在程序中进行时间点、…

Linux(22):X Window 设定介绍

X Window System X Window System 是个非常大的架构&#xff0c;他还用到网络功能。也就是说&#xff0c;其实 X 窗口系统是能够跨网络与跨操作系统平台的。 X Window系统最早是由 MIT (Massachusetts Institute of Technology&#xff0c;麻省理工学院) 在1984年发展出来的&…

day13 栈与队列(三)

day13 2023.12.11 代码随想录 今天刚出差回来&#xff0c;拉下了很多天的博客&#xff0c;慢慢补吧&#xff0c;每天做当天的任务&#xff0c;再补一篇博客。 1. 239滑动窗口最大值 本题就是每次窗口内容放在一个单调队列中&#xff0c;那么每次直接返回队头元素&#xff08;最…

register_chrdev函数使用

static struct class *led_class;static int major 0; /*记得static 不然可能会出现外部.c调用这个变量的可能*/static struct file_operations led_drv {.owner THIS_MODULE,.open led_drv_open,.read led_drv_read,.write led_drv_write,.release led_drv…

Python中的继承:概念、用法与示例

目录 一、引言 二、继承的概念 三、继承的用法 1、继承父类的属性和方法 2、添加新的属性和方法 3、覆盖父类的方法 四、示例代码展示 五、继承中的多态性 六、继承中的封装和抽象 七、继承中的多重继承 总结 一、引言 面向对象编程&#xff08;OOP&#xff09;是一…

「完美世界」石昊被诓入至尊道场,修炼无敌道,打跑天仙书院弟子

Hello,小伙伴们&#xff0c;我是拾荒君。 《完美世界》这部国漫&#xff0c;在粉丝的翘首期盼中&#xff0c;终于迎来了第141集的更新。这一集的内容&#xff0c;对于喜欢石昊和至尊道场劫难的观众来说&#xff0c;可谓是扣人心弦&#xff0c;让人目不转睛。 在这一集中&#…

【信息学奥赛】拼在起跑线上,想入道就别落下自己!

编程无难事&#xff0c;只怕有心人&#xff0c;学就是了&#xff01; 文章目录 1 信息学奥赛简介2 信息学竞赛的经验回顾3 优秀参考图书推荐《信息学奥赛一本通关》4 高质量技术圈开放 1 信息学奥赛简介 信息学奥赛&#xff0c;作为全国中学生学科奥林匹克“五大学科竞赛”之一…

ChatGPT使用:一个发包机器人的提示词

发包机器人&#xff1a; 设想&#xff1a;目前项目组有n条打包线会输出多个包&#xff0c;用户想获取最新的包是比较困难的&#xff0c;难点在于 1. 分支多&#xff1a;trunk&#xff0c;release&#xff0c;outer等&#xff0c;至少有3个分支&#xff1b; 2. 多平台&#x…

C++ 面向对象模型 小知识点

空类 大小 空类的 sizeof 结果是 1。原因&#xff1a;每个对象都应该在内存上有独一无二的地址&#xff0c;因此给空对象分配 1 个字节空间。 当定义了一个变量后&#xff0c;则类的大小为这个变量的大小。 类中 变量和函数是分开存储的。 静态成员变量&#xff0c;静态成员函数…

浅谈“前端已死”论

自我介绍一下&#xff0c;我目前是一个C#后端开发工程师&#xff0c;题目中所述的java和前端貌似跟我没有太大的关系&#xff0c;我想说&#xff0c;在这IT行业内&#xff0c;所有的东西都是互通的&#xff0c;最近公司也在搞B/S&#xff0c;也是使用了javavue的模式&#xff0…