【C++ vector 类】

1. 标准库中的vector类

vector 类 的介绍:

注意:

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

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

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

a. vector 的构造函数

代码举例1

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> t;
}

代码举例2

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> t(10,2); 
    for (int i = 0; i < t.size(); i++)
    {
        cout << t[i] << " ";
    }
}

运行结果:

代码举例3

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> t(10,2); 
    vector<int>t1(t);
    for (int i = 0; i < t.size(); i++)
    {
        cout << t1[i] << " ";
    }
}

运行结果:

代码举例4

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> t(10,2); 
    vector<int>t1(t.begin(),t.end());
    for (int i = 0; i < t.size(); i++)
    {
        cout << t1[i] << " ";
    }
}

运行结果:

b. vector iterator 的使用

  • begin + end ( begin : 获取第一个数据位置的iterator/const_iterator,end : 获取最后一个数据的下一个位置的iterator/const_iterator )

画图分析

  • rbegin + rend (rbegin : 获取最后一个数据位置的reverse_iterator , rend : 获取第一个数据前一个位置的 reverse_iterator )

画图分析

c. vector 空间增长问题

代码举例 (resize)

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> t(10,2); 
    t.resize(5); 
    //缩容 , size 变小 , capacity 不变
    for (int i = 0; i < t.size(); i++)
    {
        cout << t[i] << " ";
    }
    cout << endl;
    t.resize(10); 
    //扩容 , size 变大 , 多余的默认赋值为 T(),这里是调用 int()
    // 注意 :在类的模板里面 ,允许内置类型也有自己的构造函数
    for (int i = 0; i < t.size(); i++)
    {
        cout << t[i] << " ";
    }
    cout << endl;
    t.resize(15, 5);
    //扩容 , size 变大 , 多余的赋值为 5
    for (int i = 0; i < t.size(); i++)
    {
        cout << t[i] << " ";
    }
}

运行结果:

d. vector 增删查改

代码举例1 (push_back)

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> t;
    t.push_back(10);
    t.push_back(5);
    t.push_back(3);
    for (int i = 0; i < t.size(); i++)
    {
        cout << t[i] << " ";
    }
}

运行结果:

代码举例2 (pop_back)

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> t;
    t.push_back(10);
    t.push_back(5);
    t.push_back(3);
    t.pop_back();
    for (int i = 0; i < t.size(); i++)
    {
        cout << t[i] << " ";
    }
}

运行结果:

代码举例3 (find) 

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> t;
    t.push_back(10);
    t.push_back(5);
    t.push_back(3);
    t.pop_back();
    vector<int> :: iterator pos = find(t.begin(), t.end(), 5);
    cout << *pos << endl;
}

运行结果:

代码举例4 (insert)

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> t;
    t.push_back(10);
    t.push_back(5);
    t.push_back(3);
    vector<int> :: iterator pos = find(t.begin(), t.end(), 5);
    t.insert(pos, 7);
    for (auto i : t)
    {
        cout << i << " ";
    }
}

运行结果:

代码举例5 (erase)

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> t;
    t.push_back(10);
    t.push_back(5);
    t.push_back(3);
    vector<int> :: iterator pos = find(t.begin(), t.end(), 5);
    t.erase(pos);
    for (auto i : t)
    {
        cout << i << " ";
    }
}

运行结果:

代码举例6 (swap)

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> t;
    t.push_back(10);
    t.push_back(5);
    t.push_back(3);
    vector<int> t1(5,7);
    t.swap(t1);
    for (auto i : t)
    {
        cout << i << " ";
    }
    cout << endl;
    for (auto i : t1)
    {
        cout << i << " ";
    }
}

运行结果:

2. 迭代器失效

a. 概念

迭代器失效,实际就是迭代器底层对应指针所指向的空间被销毁了,而使用一块已经被释放的空间,造成的后果是程序崩溃(即如果继续使用已经失效的迭代器, 程序可能会崩溃)

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

1.  会引起其底层空间改变的操作(扩容),都有可能是迭代器失效

 如:push_back ,resize , reserve , insert

画图分析

具体详情配合看 vector 的实现

2.  指定位置元素的删除操作

如:erase

画图分析

具体详情配合看 vector 的实现

注意:

  1. vs 对于迭代器失效检查很严格,如使用了 erase 之后,之前的迭代器就不允许使用,只有重新给迭代器赋值,才可以继续使用
  2. Linux下,g++编译器对迭代器失效的检测并不是非常严格,处理也没有vs下极端

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第一代高通S7和S7 Pro音频平台:超旗舰性能,全面革新音频体验

以下文章来源于高通中国 如今&#xff0c;音频内容与形式日渐丰富&#xff0c;可满足人们放松心情、提升自我、获取资讯等需求。得益于手机、手表、耳机、车载音箱等智能设备的广泛应用&#xff0c;音频内容可以更快速触达用户。从《音频产品使用现状调研报告2023》中发现&…

【Selenium】selenium介绍及工作原理

一、Selenium介绍 用于Web应用程序测试的工具&#xff0c;Selenium是开源并且免费的&#xff0c;覆盖IE、Chrome、FireFox、Safari等主流浏览器&#xff0c;通过在不同浏览器中运行自动化测试。支持Java、Python、Net、Perl等编程语言进行自动化测试脚本编写。 官网地址&…

OpenCV学习笔记(五)——图片的缩放、旋转、平移、裁剪以及翻转操作

目录 图像的缩放 图像的平移 图像的旋转 图像的裁剪 图像的翻转 图像的缩放 OpenCV中使用cv2.resize()函数进行缩放&#xff0c;格式为&#xff1a; resize_imagecv2.resize(image,(new_w,new_h),插值选项) 其中image代表的是需要缩放的对象&#xff0c;(new_w,new_h)表…

前端框架的发展历史介绍

前端框架的发展历史是Web技术进步的一个重要方面。从最初的简单HTML页面到现在的复杂单页应用程序&#xff08;SPA&#xff09;&#xff0c;前端框架和库的发展极大地推动了Web应用程序的构建方式。以下是一些关键的前端框架和库&#xff0c;以及它们的发布年份、创建者和主要特…

C语言实战——扫雷游戏

目录 1. 扫雷游戏分析和设计2.扫雷游戏的代码实现 1. 扫雷游戏分析和设计 1.1扫雷游戏的功能说明 使用控制台实现经典的扫雷游戏游戏可以通过菜单实现继续玩或者退出游戏扫雷的棋盘是9*9的格子默认随机布置10个雷可以排查雷 如果位置不是雷&#xff0c;就显示周围有几个雷 如果…

GO语言接入支付宝

GO语言接入支付宝 今天就go语言接入支付宝写一个教程 使用如下库&#xff0c;各种接口较为齐全 "github.com/smartwalle/alipay/v3"先简单介绍下加密&#xff1a; 试想&#xff0c;当用户向支付宝付款时&#xff0c;若不进行任何加密&#xff0c;那么黑客就可以任…

java数据结构与算法刷题-----LeetCode216. 组合总和 III

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 解题思路 此题是77题的扩展题&#xff0c;仅仅加了一个条件而已&…

竞争对手背后的人力资源管理软件真相大公开!

一款合适的人力资源管理软件能够帮助企业提升效率&#xff0c;增强团队凝聚力&#xff0c;提升企业竞争力。本期为您盘点的不能错过的人力资源管理软件有&#xff1a;Zoho People人力资源管理系统&#xff0c;Cornerstone OnDemand&#xff0c;Kronos Workforce Ready&#xff…

MySQL-锁:共享锁(读)、排他锁(写)、表锁、行锁、意向锁、间隙锁,锁升级

MySQL-锁&#xff1a;共享锁&#xff08;读&#xff09;、排他锁&#xff08;写&#xff09;、表锁、行锁、意向锁、间隙锁 共享锁&#xff08;读锁&#xff09;、排他锁表锁行锁意向锁间隙锁锁升级 MySQL数据库中的锁是控制并发访问的重要机制&#xff0c;它们确保数据的一致性…

7. 交叉开发环境设置

嵌入式交叉编译工具 ​ 交叉编译工具是为了使在上位机中编译的文件能够在不同平台的目标机中执行&#xff0c;搭建交叉编译环境是嵌入式开发的第一步&#xff0c;也是关键的一步。不同的体系结构、不同的操作系统&#xff0c;甚至是不同版本的内核&#xff0c;都会用到不同的交…

onlyoffice监听https

修改onlyoffice 在开始将您的ONLYOFFICE Docs切换到HTTPS协议之前&#xff0c;您需要创建一个安全证书和证书私钥。将它们放到安装ONLYOFFICE Docs的计算机上的一个文件夹中。 获得证书后&#xff0c;请执行以下步骤&#xff1a; 所有命令都应以管理员权限执行。要以管理员身份…

每日学习笔记:C++ 11的Tuple

#include <tuple> Tuple介绍(不定数的值组--可理解为pair的升级版) 定义 创建 取值 初始化 获取tuple元素个数、获取tuple某元素类型、将2个tuple类型串接为1个新tuple类型

MySQL--explain执行计划详解

什么是执行计划&#xff1f; SQL的执行计划&#xff0c;通俗来说就是SQL的执行情况&#xff0c;一条SQL语句扫描哪些表&#xff0c;那个子查询先执行&#xff0c;是否用到了索引等等&#xff0c;只有当我们知道了这些情况之后才知道&#xff0c;才可以更好的去优化SQL&#xf…

族群争霸休闲养成小游戏

​游戏概述&#xff1a; 在一个由自然力量支配的幻想世界中&#xff0c;狼族与羊族的战争永无止境。 人族在两者之间寻求和平&#xff0c;建立起坚固的城墙&#xff0c;同时捕捉狼与羊来增强自身实力。 神族则在幕后观察&#xff0c;偶尔以神技介入战场&#xff0c;影响战局…

harmonyos arkts 开发商品页面

1.结果展示 2. 实现分层组件 1.1 实现搜索栏 1.2 代码 这段代码是一个构建搜索框组件的方法&#xff0c;具体功能包括&#xff1a; - 创建一个Search组件&#xff0c;设置初始值为this.keyword&#xff0c;placeholder为请输入书名... - 添加一个搜索按钮&#xff0c;并设置…

k8s应用综合实例

k8s应用综合实例 目录 k8s应用综合实例 目录 原文链接 推荐文章 实验环境 实验软件 本节实战 预期 原理 高可用 稳定性 避免单点故障 使用 PDB 健康检查 服务质量 QoS QoS类型 资源回收策略 滚动更新 失败原因 零宕机 HPA 安全性 持久化 Ingress FAQ …

【项目笔记】java微服务:黑马头条(day01)

文章目录 环境搭建、SpringCloud微服务(注册发现、服务调用、网关)1)课程对比2)项目概述2.1)能让你收获什么2.2)项目课程大纲2.3)项目概述2.4)项目术语2.5)业务说明 3)技术栈4)nacos环境搭建4.1)虚拟机镜像准备4.2)nacos安装 5)初始工程搭建5.1)环境准备5.2)主体结构 6)登录6.1…

scipy一维卷积函数convolve1d

文章目录 基本原理convolve1d函数实战 基本原理 卷积是一种积分变换方法&#xff0c;可理解为滑动平均的推广&#xff0c;在连续函数和数列上的定义分别为 f ( t ) ∗ g ( t ) ∫ f ( τ ) g ( t − τ ) d τ x ( n ) ∗ h ( n ) ∑ x ( i ) h ( n − i ) f(t)*g(t) \int …

第二课 情感认知模型

一、学习目标 1.学习各种思想的情感模型 2.了解通过情感诱发方法所建立的情感模型 二、情感模型 想要进行情感计算&#xff0c;首先步骤就是对情感建模&#xff0c;要分析理解情感的产生&#xff0c;从而才能让计算机理解情感。由于情感是感性的&#xff0c;所以现有的情感模…

贪心算法(蓝桥杯 C++ 题目 代表 注解)

介绍&#xff1a; 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在每一步选择中都采取当前状态下最好或最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望最终能够得到全局最好或最优的结果的算法。它通常用来解决一些最优化问题&#xff0c;如最小生…