【C++】vector(上)

news2024/11/14 17:44:04

在这里插入图片描述

个人主页~


vector类

  • 一、vector的介绍和使用
    • 1、vector的介绍
    • 2、vector的使用
      • (1)vector的定义
      • (2)vector iterator的使用
      • (3)vector 空间增长
      • (4)vector的增删查改
      • (5)vector迭代器失效
        • ①引起底层改变的操作
        • ②指定元素的删除操作
        • ③string类似于vector
    • 3、vector的优越性

一、vector的介绍和使用

1、vector的介绍

这里是cplusplus官方介绍

vector是表示可变大小数组的序列容器

vector类似于数组,采用连续存储空间来存储元素,可以用下标对vector元素进行访问,但它的大小是可以动态改变的,而且这个改变可以被容器自动处理

因为vector使用动态分配数组来存储它的元素,当新元素插入的时候需要扩容,一般来说进行扩容都是按照倍数扩容的,在VS上以1.5倍扩容,在gcc上以2倍扩容,这样后来的几位数字插入的复杂度就很低了

与其他动态序列容器相比,vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效,对于其它不在末尾的删除和插入操作,效率更低

2、vector的使用

(1)vector的定义

构造函数说明接口说明
vector()无参构造
vector(const vector& x)拷贝构造
vector(size_type n,const value_type& val = value_type())构造并初始化n个val
vector(Inputlterator first,Inputlterator last)使用迭代器进行初始化构造
void test1()
{
	vector<int> v1;
	vector<int> v2(10, 0);
	vector<int> v3(v2);
	vector<int> v4(v2.begin(), v2.end());
}

在这里插入图片描述
在这里插入图片描述

(2)vector iterator的使用

iterator的使用接口说明
begin+end获取第一个数据位置的iterator/const_iterator, 获取最后一个数据的下一个位置的iterator/const_iterator
rbegin+rend获取最后一个数据位置的reverse_iterator,获取第一个数据前一个位置的reverse_iterator
void test2()
{
	vector<int> v1(10, 0);
	int a = 0;
	for (auto& i : v1)
	{
		i += a;
		a++;
	}
	for (auto it = v1.begin(); it != v1.end(); ++it)
	{
		cout << *it << " ";
	}
	cout << endl;
}

在这里插入图片描述

(3)vector 空间增长

容量空间接口说明
size获取数据个数
capacity获取容量大小
empty判断是否为空
resize改变size
reserve改变capacity
void test3()
{
	vector<int> v1(10,0);
	cout << v1.size() << endl;
	cout << v1.capacity() << endl;
	cout << v1.empty() << endl;
	v1.resize(5);
	cout << v1.size() << endl;
	cout << v1.capacity() << endl;
	v1.reserve(15);
	cout << v1.size() << endl;
	cout << v1.capacity() << endl;
}

在这里插入图片描述

这里提一下不同模版的resize以及reserve基本是相同的,resize是改变size,reserve是改变capacity,清楚它们之间的一一对应的关系

(4)vector的增删查改

接口接口说明
push_back尾插
pop_back尾删
find查找
insert在pos位置之前插入val
erase删除pos位置的值
swap交换两个vector的数据空间
operator[]使用下标访问vector

其中vector中没有find,find在标准函数库中有定义,第一个参数是开始位置的迭代器,第二个参数是结束位置的迭代器,第三个参数是一个常量的引用,它可以是任何模版实例化后的常量
在这里插入图片描述

void test4()
{
	vector<int> v1(10, 0);
	v1.push_back(1);
	v1.push_back(2);
	v1.pop_back();
	v1.push_back(3);
	auto pos = find(v1.begin(), v1.end(), 3);
	v1.insert(pos, 4);
	v1.erase(v1.end() - 1);
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}
	cout << endl;
	vector<int> v2(10, 0);
	v1.swap(v2);
	for (int i = 0; i < v1.size(); i++)
	{
		cout << v1[i] << " ";
	}
	cout << endl;
	for (int i = 0; i < v2.size(); i++)
	{
		cout << v2[i] << " ";
	}
	cout << endl;
}

在这里插入图片描述

(5)vector迭代器失效

迭代器的主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个指针或被封装的指针,vector的迭代器就是原生态指针T*,因此迭代器失效就是迭代器底层对应指针所指向的空间销毁了,而使用一块已经被释放的空间,如果继续使用已经失效的迭代器,程序可能会崩溃

下面是可能导致迭代器失效的操作

①引起底层改变的操作

resize、reserve、insert、assign、push_back等可能引起扩容的函数

这里拿resize来举例

void test1()
{
	vector<int> v{ 1,2,3,4,5,6 };
	auto it = v.begin();
	v.resize(100, 0);
	while (it != v.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
}

在这里插入图片描述
包括上面提到的其他函数,因为需要空间的增大,所以vector需要扩容,而vector扩容的操作是开辟新空间,拷贝数据到新空间,销毁旧空间,而寄存器it指向的位置是旧空间的位置,所以会出现操作已经被释放的空间的问题

解决方法是扩容之后重新赋值it

②指定元素的删除操作
void test2()
{
	vector<int> v{ 1,2,3,4,5 };
	auto pos = find(v.begin(), v.end(), 3);
	v.erase(pos);
	cout << *pos << endl;
}

在这里插入图片描述
当使用erase删除元素时,所有在 erase() 之后的迭代器(包括 erase() 使用的迭代器)都会变得无效。这意味着一旦 pos 被用于 erase() 操作,pos 就不能再被用来访问或解引用任何元素了

③string类似于vector

string在上述过程之后,迭代器也会失效,原因相同,解决办法相同,性质相似

3、vector的优越性

杨辉三角问题

对于这个杨辉三角问题,我们需要一个二维数组,用C语言来写的话稍微的复杂一些,需要malloc一个指针数组,然后指针数组的指针指向一个一维数组
在这里插入图片描述
对于C++来说,我们需要一个vector<vector< int>>

在这里插入图片描述
最上面的_a的类型是vector< int>*
中间的_a的类型是int *

class Solution {
public:
    vector<vector<int>> generate(int numRows)//numRows是杨辉三角行数 
    {
        vector<vector<int>> vv;
        vv.resize(numRows);//扩容numRows行
        for(size_t i = 0;i < vv.size();i++)
        {
            vv[i].resize(i+1,0);//将每一行所有的数字置为0
            vv[i][0] = vv[i][vv[i].size() - 1] = 1;//将三角两边的数字全部置为1
        }

        for(size_t i = 0;i < vv.size();i++)
        {
            for(size_t j = 0;j < vv[i].size();j++)
            {
            	if(vv[i][j] == 0)
            	{
                	vv[i][j] = vv[i-1][j]+vv[i-1][j-1];
                	//将所有不在三角两边的按照杨辉三角的原则相加得数
            	}
            }
        }
        return vv;
    }
};

今日分享就到这里了~

在这里插入图片描述

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

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

相关文章

linux qt编写串口软件

1.界面布局 界面的简单设置&#xff0c;用到了 1.输入显示栏 2.数据发送栏 3.选择栏 4.16进制显示栏 和若干pushbottom label&#xff0c;布局就是横竖横竖这样布局下去 对界面进行基础的对齐美化 1.右侧布局的对齐 添加设置代码 右上选项已对齐 有个校验位一开始忘记添加…

PostgreSQL:后端开发者的瑞士军刀

PostgreSQL&#xff1a;后端开发者的瑞士军刀 在后端开发的世界中&#xff0c;PostgreSQL不仅是一个数据库&#xff0c;它更像是一个多功能的瑞士军刀&#xff0c;为开发者提供了强大的工具来构建和维护复杂的数据系统。作为一名资深后端开发者&#xff0c;我想分享一些关于Po…

Nginx四层负载均衡

1、Nginx四层负载均衡 1.1 负载均衡概述 负载均衡是一种分布式计算技术&#xff0c;用于将网络流量和用户请求分散到多台服务器上&#xff0c;以此来提高网络服务的可用性和可靠性。它通过优化资源使用、最大化吞吐量以及最小化响应时间&#xff0c;增强了网络、服务器和数据…

资源受限的智能陷阱:集成TinyML的果蝇监控框架

这篇论文的标题是《Resource-Constrained Intelligent Trap: Fruit Flies Surveillance Framework with TinyML Integration》&#xff0c;作者是Quan Minh Nguyen、Minh Nhat Lai、Vu Thanh Le和Hien Bich Vo。论文介绍了一种资源受限的智能陷阱系统&#xff0c;用于监测和控制…

开放式耳机什么牌子好用?五款备受赞誉的单品推荐

开放式耳机设计不堵耳道&#xff0c;让用户听歌或打电话时还能听到周围的声音&#xff0c;这对喜欢户外运动的人很好。这种耳机戴着稳&#xff0c;舒服&#xff0c;也更安全。根据我自己的试戴体验&#xff0c;我挑出了几款不错的开放式耳机。接下来&#xff0c;让我们一起探讨…

【办公类-54-01】20240826每周安排文件夹制作

背景需求&#xff1a; 今天开始上班了&#xff0c;做开学前准备。我先整理电脑&#xff0c;然后把一些文件夹搭建好。 桌面上有一个超链接文件夹 作为通讯上报员&#xff0c;每周我都要保存每周的周计划安排表(包含每周五天活动内容和通讯文章&#xff09; 以上学期为例 每个…

来自DeepSeek:形式化证明的RL框架

今天为大家带来来自DeepSeek(DS)的一篇内容详实且思想完备的形式化证明强化学习框架。 因篇幅有限&#xff0c;文中的预训练及SFT阶段不做展开&#xff0c;仅对文中的RLPAF的核心观点浅述&#xff1a; 为了在证明步骤生成中过程性引入中间策略状态&#xff0c;同时保持全证明生…

案例:LVS-DR模式

一、LVS-DR数据包流向分析 &#xff08;1&#xff09;客户端发送请求到 Director Server&#xff08;负载均衡器&#xff09;&#xff0c;请求的数据报文&#xff08;源 IP 是 CIP,目标 IP 是 VIP&#xff09;到达内核空间。 &#xff08;2&#xff09;Director Server 和 Real…

0、LVGL PC模拟器CodeBlocks

本篇文章目录导航 ♠♠ LVGL PC模拟器 ♣♣♣♣ 一、LVGL简介 ♦♦♦♦♦♦♦♦ 1.1 配置要求&#xff08;LVGL V9版本&#xff09; ♣♣♣♣ 二、LVGL PC模拟器 ♦♦♦♦♦♦♦♦ 2.1 CodeBlocks安装 ♦♦♦♦♦♦♦♦ 2.2 CodeBlocks环境包下载 ♦♦♦♦♦♦♦♦ 2.3 CodeBl…

【前端基础篇】JavaScript之BOM介绍

文章目录 浏览器对象模型&#xff08;BOM&#xff09;介绍1. 什么是BOM&#xff1f;2. Window 对象2.1 弹出框2.1.1 警告框2.1.2 确认框2.1.3 提示框 2.2 定时事件2.2.1 延时器2.2.2 定时器 2.3 Window 对象其他常用属性与方法2.3.1 获取窗口尺寸2.3.2 打开新窗口与关闭窗口2.3…

企业级数据采集解决方案:三步骤搞定大数据抓取

面对浩瀚如海的互联网数据&#xff0c;如何才能高效、准确地完成企业级数据采集&#xff1f;本文将揭秘一种简化大数据抓取的三步骤策略&#xff0c;助力企业与开发者轻松应对数据挑战&#xff0c;实现数据价值最大化。 正文&#xff1a; 在数字化转型的浪潮中&#xff0c;大…

【C/C++进阶】——文件操作之文本文件与二进制文件指针读写

【文件】——操作文件 目录 一&#xff1a;文件的定义 二&#xff1a;文件名 三&#xff1a;文件类型 3.1&#xff1a;二进制文件 3.2&#xff1a;文本文件 四&#xff1a;文件的打开与关闭 4.1&#xff1a;文件指针 4.2&#xff1a;文件的打开与关闭 五&#xff1a;…

【Stable Diffusion】ComfyUI-插件-IPAdapter图片融合

哈喽大家好&#xff0c;这期来分享下如何利用IPAdapter实现两张图的融合 参考图1 参考图2 融合图 图片融合 1、工作流 将基础工作流中的【IPAdapter Unified Loader】节点换成【IPAdapter Unified Loader Community】 【IPAdapter】节点换成【IPAdapter advanced】 【IPAd…

C语言指针详解(1)

目录 一、什么是指针 1.1、定义 1.2、取地址操作符&#xff08;&&#xff09; 1.3、指针变量和解引用操作符&#xff08;*&#xff09; 二、指针变量类型的意义 三、const修饰指针 3.1、const修饰变量 3.2、const修饰指针变量 3.2.1、const放在*的左边 3.2.2、 con…

docker的安装+docker镜像的基本操作

一&#xff0e;docker的介绍 1、Docker 是什么&#xff1f; Docker 是⼀个开源的应⽤容器引擎&#xff0c;可以实现虚拟化&#xff0c;完全采⽤“沙 盒”机制&#xff0c;容器之间不会存在任何接⼝。 Docker 通过 Linux Container&#xff08;容器&#xff09;技术将任意…

中秋节送礼推荐,数码好物精选推荐

中秋节将至&#xff0c;想要为家人或朋友准备一份特别的礼物吗&#xff1f;不妨考虑南卡Runner Pro5骨传导耳机。这款耳机不仅在功能上表现出色&#xff0c;而且设计独特&#xff0c;非常适合作为节日赠品。 卓越的性能&#xff0c;完美的体验 南卡Runner Pro5凭借其卓越的性…

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——7.list(模拟实现)

1.前言 1.1list与vector的不同 区别&#xff1a;list的迭代器底层和其他两个迭代器底层有很大区别&#xff0c;因为list的链式结构决定了与它们两个的不一样 相同&#xff1a;迭代器用法大致一样&#xff0c;其他成员函数的使用也大致一样。 vector与list都是STL中非常重要的序…

关于安装hbase的问题(操作系统-windows)

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

快速学习“堆“排序(C语言数据结构)

前言&#xff1a; 堆的实现其实并不难&#xff0c;难的是要用堆实现排序&#xff0c;也就是堆的运用。 下面需要探究一下堆的排序是怎样的。 如何利用堆进行升序或者降序的排序。 "堆排序"&#xff1a; 原理&#xff1a; 例如&#xff1a;此时要将数组里的数组int a…

干货实用帖 | PARASOFT与JENKINS 插件集成

&#x1f4d6; 介绍&#xff1a; 本篇介绍如何使用Jenkins上的插件Parasoft Findings&#xff0c;应用到C/Ctest项目中。 ✅ 准备工作&#xff1a; Jenkins项目C/Ctest 10.4以上版本及有效的许可证 视频教学&#xff1a; Parasoft与Jenkins插件集成 安装插件&#xff1a; 首先…