STL库——Vector常见使用接口

一、介绍

1. vector是表示可变大小数组的序列容器,就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素 进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。

原先数组的本质也是对一个个整形进行数据管理,可以想象成一个表格,由于需要管理的数据比起单个整形,现实情况更加的复杂和庞大,因此其作用也需要扩大,可以将其想象成一个笔记本,被开一个空间则表示笔记本有多少页,统一管理一个相同类型的数据,当然如果系统更为复杂的情况,则可以往更大的系统去想象

2.本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是 一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。

3.vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存 储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是 对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。因此,vector占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增 长。与其它动态序列容器相比(deque, list and forward_list), vector在访问元素的时候更加高效,在末 尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起list和forward_list 统一的迭代器和引用更好。

二、常见接口及其使用

1.vector的定义

构造函数声明接口说明
vector()无参构造
vector(size_type n, const value_type& val = value_type())构造并初始化n个val
vector (InputIterator first, InputIterator last)用迭代器初始化
vector (const vector& x)拷贝构造
    vector<int> first;                                // empty vector of intsvector<int> second(4, 100);                       // four ints with value 100vector<int> third(second.begin(), second.end());  // iterating through secondvector<int> fourth(third);                       // a copy of third

2.vector iterator的使用

iterator的使用接口说明
begin+endbegin获取第一个数据位置的iterator,end获取最后一个数据下一个位置的iterator
rbegin+endrbegin获取最后一个数据位置的reverse_iterator,end获取第一个数据前一个位置的reserve_iterator
void PrintVector(const vector<int>& v)
{// const对象使用const迭代器进行遍历打印vector<int>::const_iterator it = v.begin();while (it != v.end()){cout << *it << " ";++it;}cout << endl;
}

迭代器失效问题

对于vector可能会导致其迭代器失效的操作有:

1. 会引起其底层空间改变的操作,都有可能是迭代器失效,比如:resize、reserve、insert、assign、 push_back等。

2. 指定位置元素的删除操作--erase,删除操作在vs编译器认为,一旦执行,则原有迭代器视为失效
3. 与vector类似,string在插入+扩容操作+erase之后,迭代器也会失效。

迭代器失效解决办法:在使用前,对迭代器重新赋值即可。

3.vector空间管理接口

容量空间接口说明
size获取数据个数
capacity获取容量大小
empty判断是否为空

resize

改变vector的size,必要时会扩容,但不会缩容
reserve改变vector的capacity的大小,必要是会扩容,一般不缩容

4.vector的增删查改

增删查改接口说明
push_back尾插
pop_back尾删
find

查找(vector接口内没有自带的查找接口,需要时常用算法模块的查找功能),传参传迭代器,找到返回对应迭代器位置,找不到返回end的位置

insert在pos之前插入val值
erase删除pos位置的数据
swap交换两个vector的数据空间
operator[ ]像数组一样访问
void TestVector5()
{// 使用列表方式初始化,C++11新语法vector<int> v{ 1, 2, 3, 4 };// 在指定位置前插入值为val的元素,比如:3之前插入30,如果没有则不插入// 1. 先使用find查找3所在位置// 注意:vector没有提供find方法,如果要查找只能使用STL提供的全局findauto pos = find(v.begin(), v.end(), 3);if (pos != v.end()){// 2. 在pos位置之前插入30v.insert(pos, 30);}vector<int>::iterator it = v.begin();while (it != v.end()) {cout << *it << " ";++it;}cout << endl;pos = find(v.begin(), v.end(), 3);// 删除pos位置的数据v.erase(pos);it = v.begin();while (it != v.end()) {cout << *it << " ";++it;}cout << endl;
}// operator[]+index 和 C++11中vector的新式for+auto的遍历
// vector使用这两种遍历方式是比较便捷的。

三、相关的OJ题

1.只出现一次的数字(一)

题目链接:

​​​​​​力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

题目描述:

在一组数字中,除了一个数字是单独出现的,其余都是成双出现的,要求找到那个单独的数字。

解题思路:

全部异或一起就能找到那个数字

参考代码:

class Solution {
public:int singleNumber(vector<int>& nums) {int ret = 0;for(auto ch: nums){ret^=ch;}return ret;}
};

2.杨辉三角

题目链接:

118. 杨辉三角 - 力扣(LeetCode)

题目描述:

给一个数字表示杨辉三角的层级数,需要返回一个类似于二维数组的结构去表示杨辉三角

解题思路:

首先先构造出杨辉三角的结构,可以用vector<vector>类型去初始化出相应的结构,然后在对数据进行处理

代码参考:

class Solution {
public:vector<vector<int>> generate(int numRows) {vector<vector<int>> vvi;vvi.resize(numRows);for(int i = 0;i<vvi.size();i++){vvi[i].resize(i+1,0);vvi[i][0] = vvi[i][i] = 1;}for(int i = 0;i<vvi.size();i++){for(int j = 0;j<vvi[i].size();j++){if(vvi[i][j] == 0){vvi[i][j] = vvi[i-1][j-1] + vvi[i-1][j];                    }}}return vvi;}
};

3.电话号码字母组合

题目链接:

17. 电话号码的字母组合 - 力扣(LeetCode)

题目描述:

数字“2-9”对应着一串字母,题目给定一串数字字符串,要求得到对应字母的全排列组合

解题思路:

这里画出部分逻辑,将数字先转化成字母串,对字母串每一个都单独往下递归,将递归至最后一层的结果记录下来,最终将所有组合完成递归后结束。

参考代码:

class Solution 
{string num_let[10] = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
public://递归的参数设计上,第一个参数是数字字符,第二个di是用于在递归过程中控制字母字符是第几层的参数//第三个参数是用于在递归过程中记录下每次完成一次排列后的结果,第四个参数则是每次完成单趟排列后,统一存起来,用于返回的//因此,第一个参数和第四个参数采用的是传引用void letterCom(string& s_num,int di,string tmp,vector<string>& ret){if(di == s_num.size())//递归的结束条件,结束时将单次排列的结果存到ret中{ret.push_back(tmp);return;}//先将每一层对应的字母串取出来int num = s_num[di] - '0';string s_letter= num_let[num];//每一个都逐一向下递归for(auto ch: s_letter){letterCom(s_num,di+1,tmp+ch,ret);}}vector<string> letterCombinations(string digits) {vector<string> ret;//用于存放返回的结果if(digits == "")//这里是考虑到空数字字符,则直接返回空{return ret;}letterCom(digits,0,"",ret);//递归的参数不止一个digits,因此要单独用一个函数实现递归return ret;}
};

总结

本篇对vector的常用接口进行了整理介绍,并且整理了相关的OJ题,用于练习熟悉vector的使用。

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

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

相关文章

基于 Triple 实现 Web 移动端后端全面打通

*作者&#xff1a;陈有为&#xff0c;陌陌研发工程师、Apache Dubbo PMC RPC 协议开发微服务 在我们正常开发微服务的时候&#xff0c;传统 RPC 服务可能在最底层。上层可能是浏览器、移动端、外界的服务器、自己的测试、curl 等等。我们可能会通过 Tomcat 这种外部服务器去组…

​蔚来 V2G:带你重新了解如何参与构建新型电力系统

8 月 23 号&#xff0c;蔚来低调的在官方社区社区内发布了一条推文&#xff0c;推文为 「蔚来参与全国最大规模 V2G 需求响应」。 而车网互动验证中心(简称 e-Park)的 V2G 试验&#xff0c;在江苏无锡正式启动。 本次响应时间为 30 分钟&#xff0c;50 台电动车送电近 2000kW…

手术麻醉临床信息管理系统源码,客户端可以接入监护仪、麻醉机、呼吸机

一、手术麻醉临床信息管理系统介绍 1、手术麻醉临床信息管理系统是数字化手段应用于手术过程中的重要组成部分&#xff0c;用数字形式获取并存储手术相关信息&#xff0c;既便捷又高效。既然是管理系统&#xff0c;那就是一整套流程&#xff0c;管理患者手术、麻醉的申请、审批…

传输层协议(TCP/UDP协议)

全文目录 端口号端口号范围划分 传输层UDP协议特点基于UDP的应用层协议 TCP协议确认应答机制&#xff08;可靠性&#xff09;延迟应答机制超时重传机制流量控制连接管理机制TIME_WAIT 状态CLOSE_WAIT 状态拥塞控制滑动窗口 TCP、UDP对比TCP的listen第二个参数 端口号 在套接字…

【ELK 使用指南 1】ELK + Filebeat 分布式日志管理平台部署

ELK和EFLK 一、前言1.1 日志分析的作用1.2 需要收集的日志1.3 完整日志系统的基本特征 二、ELK概述2.1 ELK简介2.2 为什么要用ELK?2.3 ELK的组件 三、ELK组件详解3.1 Logstash3.1.1 简介3.1.2 Logstash命令常用选项3.1.3 Logstash 的输入和输出流3.1.4 Logstash配置文件 3.2 E…

用JavaScript输出0-9的两种方法、以及setTimeout的三个参数的意义

方法一&#xff1a; for (let i 0; i < 10; i) {setTimeout(() > {console.log(i);}, 1000) } 方法二&#xff1a;利用 setTimeout 函数的第三个参数&#xff0c;会作为回调函数的第一个参数传入 for (var i 0; i < 10; i) {setTimeout(i > {console.log(i);…

java springboot 实现 对象或对象数组 转为 前端可解析的JSON字符串格式

这是我的接口代码 逻辑就是 通过 IBookService对象中的 list 函数获取数据列表 然后定义 state(响应状态) message(提示信息) 最后将这三个信息 做成对象返回给前端 接口访问结果 但是这种对象数组对存储空间消耗肯定是比字符串大很多的 所以 我们来尝试 将json数组转成字符…

Arduino Nano 引脚复用分析

近期开发的项目为气体传感器采集仪&#xff0c;综合需求&#xff0c;选取NANO作为主控&#xff0c;附属设备有 oled、旋转编码器、H桥板、蠕动泵、开关、航插等&#xff0c;主要是用现有接口怎么合理配置实现功能。 不管stm32 还是 Arduino 都要看清引脚图 D2 D3 引脚是两个外…

vector+算法sort与list+sort的效率比较,容易写错的地方原因探析

我写的代码&#xff1a; #include <iostream> using namespace std; #include <vector> #include <list> #include <algorithm> int main() {const int N 10000000;vector<int> v;list<int> l;for (int i 0; i < N; i){v.push_back(…

计算机网络 | 应用层

计算机网络 | 应用层 计算机网络 | 应用层应用层概述网络应用模型客户/服务器模型&#xff08;Client/Server&#xff0c;C/S&#xff09;P2P模型&#xff08;Peer-to-Peer&#xff09; 域名系统&#xff08;DNS&#xff09;层次域名空间域名服务器域名解析过程 文件传输协议&a…

Ubuntu的Python从2.x升级到3.x

我的Ubuntu系统默认是2.7,我想升级为3.5 升级python3.5 下载python sudo apt-get install python3查看 刚才下载的Python程序被安装在usr/local/lib/python3.5 中 cd usr/local/lib备份一下 sudo cp /usr/bin/python /usr/bin/python_bak删除python的旧关联 sudo rm -rf py…

undefined reference to symbol ‘pthread_condattr_setclock@@GLIBC_2.3.3‘ 的参考解决方案

写在前面 自己的测试环境&#xff1a; Ubuntu20.04&#xff0c;PCL 1.10, ROS-Noetic. 一、问题描述 编译PCL 程序的时候报错&#xff1a; /usr/bin/ld: CMakeFiles/passthrough.dir/src/passthrough.cpp.o: undefined reference to symbol pthread_condattr_setclockGLIBC…