【C++】vector释放内存之swap方法

2023-05-16

C++ vector 容器浅析
在容器vector中,其内存占用的空间是只增不减的,比如说首先分配了10,000个字节,然后erase掉后面9,999个,则虽然有效元素只有一个,但是内存占用仍为10,000个。所有内存空间在vector析构时回收。

一般,我们都会通过vector中成员函数clear进行一些清除操作,但它清除的是所有的元素,使vector的大小减少至0,却不能减小vector占用的内存。要避免vector持有它不再需要的内存,这就需要一种方法来使得它从曾经的容量减少至它现在需要的容量,这样减少容量的方法被称为“收缩到合适(shrink to fit)”。(节选自《Effective STL》)如果做到“收缩到合适”呢,就要全仰仗“Swap大侠”啦,即通过如下代码进行释放过剩的容量:

#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vec(100000, 0);  
for (int i = 0; i < 100000-2; ++i) vec.pop_back();  
cout << vec.capacity() <<endl;  
vector<int>(vec).swap(vec);  
cout << vec.capacity() << endl;
}

在这里插入图片描述
原理:
通过vector(vec)创建一个临时对象,调用复制拷贝函数,拷贝vec然后vector(vec).swap(vec); 交换临时对象与vec原来的vec为临时对象的大小,临时对象则为原来vec大小,临时对象失去作用域,析构释放原来vec的内存,实现内存回收。
在这里插入图片描述

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

【C++】vector释放内存之swap方法 的相关文章

  • Three.js 设置并读取相机外观向量

    而不是使用camera rotation或lookAt 函数旋转相机 我想将外观矢量直接传递给相机 是否可以直接设置相机外观矢量以及是否可以从相机读取外观矢量 相机没有 外观矢量 因此无法设置它 但是 您可以构造一个point通过将您的外观
  • 在 MATLAB 中用两个值替换向量值

    我必须创建一个以向量作为输入的函数v和三个标量a b and c 该函数替换了的每个元素v等于a有一个二元素数组 b c 例如 给定v 1 2 3 4 and a 2 b 5 c 5 输出将是 out 1 5 5 3 4 我的第一次尝试是尝
  • 方案中的多维向量?

    我之前问过一个关于方案中数组的问题 结果它们被称为向量 但在其他方面基本上与您期望的相同 有没有一种简单的方法可以在 PLT 方案中处理多维 arrays 向量 出于我的目的 我想要一个名为make multid vector或者其他的东西
  • 如何逐步绘制矢量路径? (拉斐尔.js)

    如何逐步动画化矢量路径 就像它被绘制一样 换句话说 慢慢地逐像素地显示路径 我在用着Rapha l js but如果您的答案不是特定于库的 例如可能有一些通用的编程模式可以完成此类事情 我对矢量动画相当陌生 欢迎 使用直线路径很容易做到 就
  • 交换单链表中的节点

    我正在尝试交换两个节点 例如 如果节点是a and b我正在传递指针 a 1 gt next and b 1 gt next这基本上是节点a and b void swap struct stack a struct stack b str
  • 为什么这些向量不相等?

    我创建了两个向量 并用push back填充另一个向量 用索引填充另一个向量 我希望这些是相等的 但事实并非如此 有人可以解释一下这是为什么吗 include
  • 如何在 switch 语句中将向量作为参数传递

    我对问题的谷歌搜索没有返回有用的结果和文档 switch没有告诉我如何做 所以我希望我能在这里得到答案 假设我有一个向量 cases lt c one two three 我想使用 switch 语句并将这些元素作为 switch 语句的参
  • 我应该如何格式化 .dat 文件以便制作 3D 矢量图?

    我正在为大学做这个编程任务 我们必须写一个c 计算 3D 空间中某些线圈的磁场矢量的程序 我已经成功编写了这个程序 并且我认为它运行得很好 不过 我想添加一个特殊的东西 这是我的试卷 所以它必须特别好 我想绘制出向量 我习惯打电话gnupl
  • 确定向量中是否存在元素的最有效方法

    我有几种算法取决于确定元素是否存在于向量中的效率 在我看来 这 in 这相当于is element 应该是最有效的 因为它只返回一个布尔值 在测试了几种方法之后 令我惊讶的是 这些方法是迄今为止效率最低的 以下是我的分析 随着向量大小的增加
  • R:根据元素长度从向量中删除元素

    如何根据字符串的字符数或长度从字符串向量中删除元素 df lt c asdf fweafewwf af aewfawefwef awefWEfawefawef gt df 1 asdf fweafewwf af aewfawefwef aw
  • 在 2D int 向量上使用 std::fill

    我试图将 2D 向量中所有元素的值设置为特定值 据我所知 不能像将 memset 用于数组那样将其用于向量 因此 我必须使用 std fill 将 2D 向量中的所有元素设置为特定值 但是 我知道如何对一维向量使用填充 如下所示 vecto
  • 如何在 C++ 中获取两个向量共有的字符?

    我正在尝试比较两个向量对象 并返回一个包含两个向量中出现的所有字符的向量 如果不编写一些非常复杂的手动方法 将第一个向量中的每个字符与第二个向量中的每个字符进行比较 并使用 if 将其添加到第三个向量 如果它们匹配 将返回 我将如何解决这个
  • 对 std::vector 进行排序但忽略某个数字

    我有一个std vector
  • std::vector 迭代器失效

    之前有几个关于这个问题的问题 我的理解是调用std vector erase只会使位于某个位置的迭代器无效after被擦除的元素 然而 擦除一个元素后 该位置的迭代器是否仍然有效 当然 前提是它不指向end 擦除后 我对向量如何实现的理解似
  • C++ 在 Vector 中使用不可分配的对象

    我想将对象列表存储在std vector 但对象包含引用且无法分配给 但是 我可以复制构造该对象 我能想到的唯一选择是使用指针来包装对象并在需要分配指针时重新设置指针 但这样做的语法会显着降低可读性 特别是在使用迭代器时 我更喜欢另一种选择
  • 访问结构向量

    我有一个结构 struct OutputStore int myINT string mySTRING 如果我创建一个 OutputStore 类型的数组 如下所示 OutputStore OutputFileData new Output
  • 用矩阵变换 3D 向量的方法

    我一直在阅读一些关于用矩阵转换 Vector3 的文章 并且正在努力深入研究数学并自己编码 而不是使用现有代码 无论出于何种原因 我的学校课程从未包含矩阵 所以我正在填补我的知识空白 值得庆幸的是 我认为我只需要一些简单的东西 背景是我正在
  • std::在 std::string 和 std::vector 之间移动

    我正在与 2 个图书馆合作 一个接受并返回std strings 而其他使用std vector
  • 查找按降序排序的向量中严格小于某个键的第一个元素

    据我了解 可以使用 find if STL 算法函数来完成此任务 如下所示 long long int k k key scanf lld k auto it find if begin v end v k auto e return e
  • GLM:如何转置向量?

    也许我只是在文档中遗漏了一些东西 但 GLM 似乎不可能对向量进行转置 我也没有看到 mat3x1 或 mat1x3 类型 另外 glm transpose 不适用于向量 我是否遗漏了某些内容 或者这只是 GLM 中缺少的功能 GLM 基于

随机推荐

  • 关于softmax损失函数的推导

    关于softmax损失函数的推导 某人问我softamx损失函数的推导 索性就写一下 定义softmax损失函数的输入为 X N C 和 Y N C 其中N代表输入的数据的个数 C代表类别的个数 X指的是神经网络的输出 Y代表的是0 1矩阵
  • 手把手教你数据恢复编程(二)基础知识篇

    好了 接上一篇 xff0c 本篇 xff0c 我们将详细讲解NTFS文件系统的一些重要的数据结构 xff0c 闲话少叙 xff0c 咱们开讲 NTFS文件系统 一 NTFS简介 NTFS xff08 New Technology File
  • 数字图像基本处理算法

    数字图像基本处理算法 xizero00 常熟理工学院 xff08 CIT xff09 计算机科学与工程学院 下一代互联网实验室 NGIL Lab Email xizero00 64 163 com 由于SIFT算法需要用到很多算法 xff0
  • PyOpenPose编译与使用

    PyOpenPose编译 前言 PyOpenPose是一个OpenPose的python绑定 xff0c 你可以使用python来实现人体的姿态估计 用上python的openpose xff0c 想想就有点小激动呢 哈哈 PyOpenPo
  • torch系列:如何在torch内使用tensorboard

    torch也是可以使用tensorboard的 xff0c 通过安装crayon就可以 下面以ubuntu下的安装为例进行讲解 其实安装的过程还是会碰到不少曲折的过程的 主要为 安装crayon会提示找不到libssl so文件 xff0c
  • mask rcnn使用指南

    做姿态估计的小伙伴们肯定经常用检测器 xff0c 为了方便大家 xff0c 这里给出一个很方便的教程 让大家快速上手 xff0c 不用再纠结配置环境 xff01 欢迎加入我们的姿态估计群 xff1a 970029323 xff08 xff1
  • UML中的泛化、实现、依赖、关联、聚合、组合6种关系

    在UML中经常见到几种关系 xff1a 泛化 xff08 Generalization xff09 实现 xff08 Realization xff09 依赖 xff08 Dependency xff09 关联 xff08 Associat
  • RTOS系统与Linux系统的区别

    RTOS是实时操作系统 Linux是时分系统 xff0c 不过可以通过配置内核改成实时系统 实时操作系统 英文称Real Time Operating System xff0c 简称RTOS 1 实时操作系统定义 实时操作系统 xff08
  • 【Pytorch】学习笔记2023/2/28

    参考文献 Pytorch学习笔记 张贤同学 深度学习百科及面试资源 飞桨
  • k8s-kubernetes--网络策略、flannel网络插件和calico网络插件

    文章目录 一 k8s网络通信1 网络策略2 service和iptables的关系 二 pod间通信1 同节点之间的通信2 不同节点的pod之间的通信需要网络插件支持 详解 1 Flannel vxlan模式跨主机通信原理 2 vxlan模
  • 【Python】可视化figure

    1 Tensorboard静态显示 span class token keyword import span torch span class token keyword import span torch span class token
  • 【Python】绘制双Y轴折线与散点图

    span class token keyword import span matplotlib span class token punctuation span pyplot span class token keyword as spa
  • 【World】插入公式

    1创建样式 公式 2调整段落格式 行间距最小值 xff1a 防止公式显示不全 3根据纸张制作制表符 公式20字符左右 xff0c 居中对齐 标号40字符左右 xff0c 右对齐 确定 4在需要公式的一行 xff0c 点击创建的样式 xff0
  • 【Python】matplotlib替代cv画虚线矩形框

    span class token keyword import span cv2 span class token keyword as span cv span class token keyword import span matplo
  • 【造轮子】最小权完备匹配算法

    1 C 43 43 编程方法 矩阵方法 span class token macro property span class token directive hash span span class token directive keyw
  • 【LeetCode】两数之和

    1 两数之和 1 My solution span class token keyword class span span class token class name Solution span span class token punc
  • 【LeetCode】两数相加

    1 主要是链表先创建下一个对象 xff0c 再转移 xff0c 而不是先转移到空指针再赋值 t span class token operator 61 span span class token keyword new span span
  • 【算法】kalman运动状态估计不准确的思考

    前言 在仿真实验多目标跟踪时 xff0c 我采用了Kalman做跟踪 xff0c 在运动状态估计时位置可以很 准确 的估计 xff0c 但是速度与方向就偏差很大 xff0c 最近看到了一篇文献详细的介绍了原因 xff0c 之前考虑到时间间隔
  • 【LeetCode】无重复字符的最长子串

    尝试1 思路清晰但是耗时 span class token keyword class span span class token class name Solution span span class token punctuation
  • 【C++】vector释放内存之swap方法

    C 43 43 vector 容器浅析 在容器vector中 xff0c 其内存占用的空间是只增不减的 xff0c 比如说首先分配了10 000个字节 xff0c 然后erase掉后面9 999个 xff0c 则虽然有效元素只有一个 xff