STL库——Vector常见使用接口

news2025/1/12 18:38:58

一、介绍

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 ints
    vector<int> second(4, 100);                       // four ints with value 100
    vector<int> third(second.begin(), second.end());  // iterating through second
    vector<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提供的全局find
	auto pos = find(v.begin(), v.end(), 3);
	if (pos != v.end())
	{
		// 2. 在pos位置之前插入30
		v.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.coloradmin.cn/o/1108797.html

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

相关文章

报错InitializeComponent报错(提示不存在)

我是c#新手。为了解决这个问题&#xff0c;需要按照以下步骤进行。、 首先&#xff0c;确保项目的类型为WPF应用(.NET Framework)&#xff1b; 然后&#xff0c;代码的位置应正确处于项目的MainWindow.xaml.cs&#xff1b; 最后&#xff0c;将MainWindow.xaml打开&#xff0c;…

FPGA软件【紫光】

软件&#xff1a;编程软件。 注册账号需要用到企业邮箱 可以使用【企业微信】的邮箱 注册需要2~3天&#xff0c;会收到激活邮件 授权&#xff1a; 找到笔记本网卡的MAC&#xff0c; 软件授权选择ADS 提交申请后&#xff0c;需要2~3天等待邮件通知。 使用授权&#xff1a; 文…

最新!两步 永久禁止谷歌浏览器 Google Chrome 自动更新

先放效果图&#xff1a; CSDN这个问题最火的大哥的用了没用 像他这样连浏览器都打不开 为什么要禁止chrome自动更新 看到很多搞笑的大哥&#xff0c;说为啥要禁止&#xff1b; 我觉得最大的原因就是chromedriver跟不上chrome的自动更新&#xff0c;导致我们做selenium爬虫的…

在 Python 3 中释放 LightGBM 的力量:您的机器学习大师之路

机器学习是 Python 占据主导地位的领域,它一直在给全球各行各业带来革命性的变化。要在这个不断变化的环境中脱颖而出,掌握正确的工具是关键。LightGBM 就是这样一个工具,它是一个强大且快速的梯度提升框架。在这份综合指南中,我们将通过实际示例和示例数据集从基础知识到高…

PRCV 2023 - Day3

主会场——主旨报告 报告题目&#xff1a;变与不变&#xff1a;有关大模型的一些数理基础问题 讲者&#xff1a;徐宗本&#xff08;中国科学院院士&#xff09; 徐宗本院士的演讲首先通过一系列示例阐释了ChatGPT引领了人工智能研究的新浪潮&#xff0c;推动了人工智能从深度…

行业追踪,2023-10-18

自动复盘 2023-10-18 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

15.2 主机探测与路由追踪

Ping 使用 Internet 控制消息协议&#xff08;ICMP&#xff09;来测试主机之间的连接。当用户发送一个 ping 请求时&#xff0c;则对应的发送一个 ICMP Echo 请求消息到目标主机&#xff0c;并等待目标主机回复一个 ICMP Echo 回应消息。如果目标主机接收到请求并且网络连接正常…

Top 10 数据恢复工具,可从iPhone 和 iPad 恢复数据

您是否正在寻找最好的 iPad 恢复软件&#xff0c;但不知道哪个选项最好&#xff1f;没有什么可担心的。本文将为您提供有关根据文件类型、设备兼容性和数据丢失原因等因素选择合适的 iPad 恢复软件的提示。此外&#xff0c;前 10 名提到的恢复软件是安全可靠的。 第 1 部分、iP…

这可能是最全面的TCP面试八股文了

计算机网络基础&#xff0c;考验一个程序员的基本功&#xff0c;也能更快的筛选出更优秀的人才。 说说TCP的三次握手 假设发送端为客户端&#xff0c;接收端为服务端。开始时客户端和服务端的状态都是CLOSED。最全面的Java面试网站 第一次握手&#xff1a;客户端向服务端发起…

2023年【公路水运工程施工企业安全生产管理人员】新版试题及公路水运工程施工企业安全生产管理人员模拟试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 公路水运工程施工企业安全生产管理人员新版试题是安全生产模拟考试一点通生成的&#xff0c;公路水运工程施工企业安全生产管理人员证模拟考试题库是根据公路水运工程施工企业安全生产管理人员最新版教材汇编出公路水…

Freemarker快速入门(SpringBoot版)

文章目录 Freemarker快速入门1、Freemarker概述2、Freemarker初体验3、数据类型3.0 常见操作符3.1 数值类型3.2 字符串类型3.3 布尔类型3.4 日期类型3.5 序列类型3.6 哈希类型 4、运算符4.1 算术运算符4.2 逻辑运算符4.3 比较运算符4.4 空值运算符 5、常用指令5.1 assign 自定义…

python argparse解析参数

用法比较简单&#xff0c;直接看代码 import argparseargparser argparse.ArgumentParser(descriptionthis is a hello argparser program) argparser.add_argument(--arg1, -a, typestr, helparg1 has value) argparser.add_argument(--arg2, typestr, default"value2&q…

Web攻防02-MySQL注入概述MySQL架构注入获取数据

文章目录 SQL注入概述&#xff1a;sql注入的原理&#xff1a;sql注入攻击&#xff1a; MYSQL-Web组成架构MYSQL5.0以上版本&#xff1a;自带的数据库information_schema MYSQL注入流程MYSQL注入查询数据过程查询数据流程靶场案例 MYSQL-SQL跨库注入查询跨库注入&#xff1a;影响…

xray的使用

不需要扫描 点击 双击xray 1.打开 2.使用 主打扫描 3.被动扫描 网站 与 Burp 联动 - xray 安全评估工具文档 双击 xray cmd xray_windows_amd64.exe webscan --listen 127.0.0.1:7777 --html-output text.html 1.bp 2.这道这个 3.配置 xray 改为* 4.代理

Hadoop3教程(二十二):Yarn的基础架构与工作流程

文章目录 &#xff08;126&#xff09;基础架构&#xff08;127&#xff09;YARN的工作机制&#xff08;128&#xff09;作业全流程参考文献 &#xff08;126&#xff09;基础架构 之前基本介绍完了Hadoop的几个核心组件&#xff0c;接下来可以思考下&#xff0c;在MR程序运行…

计算未来:微软眼中的人工智能

计算未来 :人工智能及其社会角色&#xff08;The Future Computed. Artificial Intelligence and its role in society &#xff09;这本书于2018年09月由北京大学出版社出版。 书籍的作者是&#xff1a;沈向洋&#xff08;微软全球执行副总裁&#xff09;,&#xff08;美&…

C++标准模板(STL)- 类型支持 (数值极限,quiet_NaN,signaling_NaN,denorm_min)

数值极限 提供查询所有基础数值类型的性质的接口 定义于头文件 <limits> template< class T > class numeric_limits; numeric_limits 类模板提供查询各种算术类型属性的标准化方式&#xff08;例如 int 类型的最大可能值是 std::numeric_limits<int>::ma…

AST实战|比较大的混淆文件(超过10M)怎么还原

关注它&#xff0c;不迷路。 本文章中所有内容仅供学习交流&#xff0c;不可用于任何商业用途和非法用途&#xff0c;否则后果自负&#xff0c;如有侵权&#xff0c;请联系作者立即删除&#xff01; 1. 需求 目前&#xff0c;我接触到的混淆js文件大小刷新了新记录&…

在 Visual Studio Code (VS Code) 中设置

在 Visual Studio Code (VS Code) 中设置代理服务器的详细教程如下&#xff1a; 打开 Visual Studio Code。 在顶部菜单栏中&#xff0c;点击 "File"&#xff08;文件&#xff09; > "Preferences"&#xff08;首选项&#xff09; > "Settings…

成为吃鸡战场绝对王者,掌握顶级作战干货!

在绝地求生的战场上&#xff0c;只有强者才能生存&#xff01;作为吃鸡行家&#xff0c;吃鸡将在这里为您带来与众不同的游戏技巧和干货&#xff0c;助您成为绝对的战场王者&#xff01; 首先&#xff0c;让我们来介绍几个实用的吃鸡作图工具。我们推荐了几款实用的绘图软件和工…