二维vector,clear()操作请慎重,当心遇到vector subscript out of range问题

2023-05-16

问题

今天想要用vector实现二维数组的功能,尝试了把二维vector.谁知道刚上手就遇到了雷.

代码的形式大致如下:

vector<vector<int>>vv(3);
vv.clear();
for (int i = 0; i < 3; i++)
	vv[i].push_back(0);

因为要重复使用该二维vector,所以进行了清空操作.然而却遇到了问题:vector subscript out of range

原因

后来在单步调试时发现了,clear()会让二维vector的size变成0,之前声明的3个一维数组的结构遭到破坏.(但可以看到它的capacity容量还是之前的值,这个后面会讲到).

执行到for的头部时,自动窗口如下:

如何解决

对上述代码做下改变:

vector<vector<int>>vv(3);
vv.clear();
vv.resize(3); 
for (int i = 0; i < 3; i++)  
   vv[i].push_back(0);

相当于把外层的vector的长度又恢复到了之前的值.

同样是执行到for的头部时,自动窗口如下:

 size和capacity的辨析:

vector的size和capacity的辨析:

《C++ primer》中说size指容器当前拥有的元素个数,而capacity则指容器在必须分配新存储空间之前可以存储的元素个数(和内存大小相关)。可以大概拿乐高积木里的小人儿(size)和这些人住的院子(capacity)来做类比:

- 当放若干个小人儿时,我们同时也会搭容纳他们的院子.院子的容量>=小人儿的个数.

- 当vector进行clear操作时,就好像把小人儿从院子里都拿出去了,这时候size为0,而capacity院子的大小不会改变。

- resize相当于把小人的个数size给定下来了,如果此时院子的容量能容纳这些小人儿的话,capacity不会改变.但倘若容量不够了,则capacity会增加.但vector中capacity并非按照size的量来设计的.它一般会变为原来空间的2倍.

可能不是特别妥帖,欢迎大家讨论.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二维vector,clear()操作请慎重,当心遇到vector subscript out of range问题 的相关文章

随机推荐

  • 修改spring Boot启动时的默认图案Banner

    一 修改Banner spring Boot启动的时候会有一个默认的启动图案 如下图 39 39 39 39 96 39 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • Java线程池自学手册Executor的使用

    准备做一个系列文章 xff0c 将零散的知识整理起来分享给大家 xff0c 希望给大家的工作和学习带来帮助 目录 1 Executor 2 ExecutorService 3 Executors 4 ThreadPoolExecutor 5
  • 常用开发资源整理(更新日:2017/4/26)

    说明 xff1a 为了方便 xff0c 今后将工作中用到一些常用的资源链接进行整理 xff0c 初衷是想发些各版本的冷资源 xff0c 免得在需要的时候花大量时间寻找 一 开发语言 1 Spring各版本压缩包下载 http repo sp
  • 博客地址迁移www.xiangquba.cn

    大家好 xff0c 非常感谢大家一直以来对我的关注 xff0c 博客有一年时间没有更新了 xff0c 其实我并没有停止分享 xff0c 只是这一年时间并没有在csdn上更新 xff0c 原因是因为起初csdn有一个自己给csdn发送短信绑定
  • FreeRTOS 任务函数里面的死循环

    任务函数是一个无限循环且不带返回值的函数 任务必须是死循环 xff0c 否则任务将经过 LR 返回 xff0c 如果 LR 指向了非法内存就会产生HardFault Handler xff0c 而 FreeRTOS 指向一个死循环 xff0
  • 使用libcurl异步发送http请求

    在工作中需要完成一个工具 xff0c 该工具主要的用途就是向指定的服务器和端口发送http请求 xff0c 为了提高性能 xff0c 采用多线程的方式进行 xff0c 同时采用libcurl的异步形式 代码如下 xff0c 在其中添加一些注
  • 【Kubernetes】K8S实践感受HPA的功能

    1 确保metrics server安装好 span class token punctuation span root 64 jdmaster span class token punctuation span span class to
  • 拓扑结构与IP地址划分

    拓扑结构 分为总线型 星型和环形 环形要比星型的可靠性更高 公司的网络拓扑结构是星型 中心是交换机 IP发展 第一阶段 分为A E类 第二阶段 子网划分 第三阶段 无类域间路由 现在多采用这一种 不仅满足大网分小 也满足子网合成超网 无类域
  • 多网卡udp绑定问题

    在多网卡机器上 udp包 协议会自动根据路由最优选择从哪个网卡发数据包出去 即使你在此之前把改socket绑定到了另一个网卡上 参考文章 https blog csdn net Scarlett OHara article details
  • QIODevice::readyRead()

    void QIODevice readyRead This signal is emitted once every time new data is available for reading from the device 每次当新数据
  • 论文投稿参考——如何撰写和发表SCI论文

    如何撰写和发表SCI论文 汪景秀 提要 对从事基础研究的科学工作者 能否在SCI收录的杂志发表论文 是能否进入学术前沿 在国际公认的同一个平台上参与学术竞争 做出原创性贡献的一个基本标志 那么怎样的论文才是合格的 xff1f 本文提出一些建
  • Win7电脑遇到蓝屏,并报错:IRQL NOT LESS OR EQUAL

    这一阵电脑老是蓝屏 xff0c 重启后window和360都检测到之前发生过蓝屏 xff0c 但是都不能够修复成功 一开始直接在百度上搜电脑蓝屏 xff0c 也没啥大的收获 直到有次注意到蓝屏时还有错误类型 xff1a IRQL NOT L
  • VS使用收获总结

    诊断工具在调试 gt 窗口 gt 显示诊断工具 报CL exe问题 可能是IDE的问题 比如写一个最简单的hello world代码来进行检验 可以在查找时使用正则表达式 xff0c 比如想要搜索 行尾为 61 1 xff1b 的文本 可以
  • 进程间的mutex

    设两个进程共用一个临界资源的互斥信号量mutex 61 1 xff0c 当mutex xff1d xff0d 1时表示 一个进程进入了临界区 xff0c 另一个进程等待 没有一个进程进入临界区 两个进程都进入临界区 两个进程都在等待 互斥信
  • 128种chatGPT可以为人类做的事情

    1 充当英语翻译 充当英语翻译员 拼写纠正员和改进员 xff0c 我会用任何语言与你交谈 xff0c 你会检测语言 xff0c 翻译它并用我的文本的更正和 改进版本用英语回答 2 充当词典 充当英英词典 xff0c 对于给出的英文单词 xf
  • thing_10

    Choose Your Tools with Care Modern applications are very rarely built from scratch They are assembled using existing too
  • Distinguish Business Exceptions from Technical 21

    Distinguish Business Exceptions from Technical There are basically two reasons that things go wrong at runtime technical
  • Do Lots of Deliberate Practice 22

    Do Lots of Deliberate Practice Deliberate practice is not simply performing a task If you ask yourself Why am I performi
  • 只抓 5 件事,让管理更有效

    管理的第一性原理 效率 效益 环境的巨大不确定性带来前所未有的挑战 练好基本功 xff1a 提升管理质量 5件事 xff1a 计划 组织 控制 领导 人员配备 计划的意义 集中资源 注意力管理 协同 让计划滚动起来 控制 xff1a 计划
  • 二维vector,clear()操作请慎重,当心遇到vector subscript out of range问题

    问题 今天想要用vector实现二维数组的功能 尝试了把二维vector 谁知道刚上手就遇到了雷 代码的形式大致如下 vector lt vector lt int gt gt vv 3 vv clear for int i 61 0 i