vector利用swap()函数进行内存的释放

首先,vector与deque不同,其内存占用空间只会增长,不会减小。比如你首先分配了10,000个字节,然后erase掉后面9,999个,则虽然有效元素只有一个,但是内存占用仍为10,000个。所有空间在vector析构时回收。

1、释放内存:
   empty()是用来检测容器是否为空的,clear()可以清空所有元素。但是即使clear(),所占用的内存空间依然如故。如果你需要空间动态缩小,可以考虑使用deque。如果非要用vector,这里有一个办法:

    在《effective STL》和其实很多C++文章中都有指明,用clear()无法保证内存回收。但是swap技法可以。具体方法如下所示:
    vector<int> ivec;
    ivec.push_back(1);ivec.push_back(1);ivec.push_back(2);ivec.push_back(2);
    vector<int>().swap(ivec); //或者ivec.swap(vector<int>());

    vector<int>().swap(ivec); 或者如下所示 加一对大括号都可以,意思一样的:
    {
     std::vector<int> tmp;   
     ivec.swap(tmp);
    }     
    加一对大括号是可以让tmp退出{}的时候自动析构

2、修整空间
在一个应用中,可能会需要向一个vector中插入很多记录,比如说100000条,为了避免在插入过程中移动内存,咱实现向系统预订一段足够的连续的空间,例如
vector<int> ivec;
ivec.reserve(100000);
这个问题是解决了。
但是,如果后来这个vector不再需要存那么多的元素了,已经通过erase删除了。但是以前咱们预留的空间却无法被其他程序再度利用,这样会造成内存一定程度上的浪费。于是,我们利用目前的vector构造一个一模一样的vector,他并没有预留空间,于是以前预留的空间也被释放以作他用了:
ivec.swap(vector<int>(ivec)); // or vector<int>(ivec).swap(ivec)
或者如下所示 加一对大括号都可以,意思一样的:
    {
     std::vector<int> tmp = ivec;   
     ivec.swap(tmp);
    }     
    加一对大括号是可以让tmp退出{}的时候自动析构

     使用这种方法的前提是vector从前存储了大量数据,比如10000000,经过各种处理后,现在只有100条,那么向清空原来数据所占有的空间,就可以通过这种交换技术swap技法就是通过交换函数swap(),使得vector离开其自身的作用域,从而强制释放vector所占的内存空间。


#include "stdafx.h"
#include <vector>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
    vector <int> v1, v2;
    cout << "The number of elements in v1 = " << v1.size( ) << endl;
    cout << "The number of elements in v2 = " << v2.size( ) << endl;
    cout << v1.capacity() << endl;
    cout << v2.capacity() << endl;
    v1.push_back( 1 );
    v1.push_back( 2 );
    v1.push_back( 3 );
    v2.push_back( 10 );
    v2.push_back( 20 );
    cout << "The number of elements in v1 = " << v1.size( ) << endl;
    cout << "The number of elements in v2 = " << v2.size( ) << endl;
    cout << v1.capacity() << endl;
    cout << v2.capacity() << endl;
    cout << endl;
    v1.swap( v2 );
    cout << "The number of elements in v1 = " << v1.size( ) << endl;
    cout << "The number of elements in v2 = " << v2.size( ) << endl;

    cout << v1.capacity() << endl;
    cout << v2.capacity() << endl;

    
    return 0;
}

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

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

相关文章

SAP常用术语

SD 常用术语汇集 SD (Sales and Distribution) : 销售和分销 Sold-to-party : 下订单客户 Ship-to-party : 收货之客户 Bill-to-party : 仅指收发票之客户 Payer-to-party : 付款人 Customer Code : 客户代码 Sales Organization : 销售业务组织&#xff0c;指台达的某一事业部…

如何创建_如何创建自己的微信圈子?圈子创建运营指南

原创&#xff1a;爱捣鼓的猿 袁小猴最近很多小伙伴在问微信圈子是什么&#xff0c;如何才能创建自己的微信圈子&#xff1f;于是小编花时间去研究了下&#xff0c;整理了一些微信圈子的规则&#xff0c;方便大家使用。一、微信圈子是什么&#xff0c;圈子入口&#xff1f;其实曾…

python爬虫淘宝评论_Python爬取淘宝店铺和评论

1 安装开发需要的一些库(1) 安装mysql 的驱动&#xff1a;在Windows上按winr输入cmd打开命令行&#xff0c;输入命令pip install pymysql&#xff0c;回车即可。(2) 安装自动化测试的驱动selenium&#xff1a;在命令行中输入pip install selenium回车。(3) 安装标签解析库pyque…

A20 网卡驱动分析

网卡芯片为realteak 8201 1. net_device结构体的分配和注册 1) "/drivers/net/ethernet/sun7i/sun7i_wemac.c" wemac_probe() ndev alloc_etherdev(sizeof(struct wemac_board_info)); 分配 ret register_netdev(ndev); …

安装用户debian7安装oracle11g

改章节笔者在北京游玩的时候突然想到的...这几周就有想写几篇关于安装用户的笔记&#xff0c;所以回家到之后就奋笔疾书的写出来发表了 apt-get install gcc g make binutils libc6 libc6-dev libstdc6 libstdc5 rpm gawk alien ksh lesstif2 libaio1 linux-headers elfutils…

python交互式编程客户端_【python】UDP网络编程:实现服务端与客户端的交互、简单的AI智能模式...

关于UDP网络编程UDP(user datagram protocol)的中文叫用户数据报协议&#xff0c;属于传输层。UDP是面向非连接的协议&#xff0c;它不与对方建立连接&#xff0c;而是直接把要发的数据发给对方。【UDP网络编程的特点】1&#xff0c;每个数据中都给出了完整的地址信息&#xff…

python tkinter pack 同一行_用python tkinter中的一行连接2个复选按钮

我有一个程序在画布中放置复选按钮&#xff0c;当选项(另一个复选按钮)被选中时。我有另一个选项(另一个复选按钮)来画线。为了画线&#xff0c;首先我应该选择checkbutton“draw a line”&#xff0c;然后单击放置在画布中的任何checkbutton&#xff0c;另一个单击画布上的任何…

各个层次的gcc警告

各个层次的gcc警告 从上到下覆盖 变量(代码)级:指定某个变量警告 int a __attribute__ ((unused)); 指定该变量为"未使用的".即使这个变量没有被使用,编译时也会忽略则个警告输出. 文件级:在源代码文件中诊断(忽略/警告) 语法: #pragma GCC diagnostic [er…

【转】C++ GetLastError() 返回值对应表

〖0〗-操作成功完成。〖1〗-功能错误。〖2〗-系统找不到指定的文件。〖3〗-系统找不到指定的路径。〖4〗-系统无法打开文件。〖5〗-拒绝访问。〖6〗-句柄无效。〖7〗-存储控制块被损坏。〖8〗-存储空间不足&#xff0c;无法处理此命令。〖9〗-存储控制块地址无效。〖10〗-环境错…

hdfs 多个文件合并_hadoop学习笔记3 hadoop程序将本地文件夹中多个文件,合并为一个文件并上传到hdfs中--梦飞翔的地方(梦翔天空)...

今天梦翔儿&#xff0c;成功实现hadoop编程&#xff0c;将本地文件夹中多个文件&#xff0c;合并为一个文件并上传到hdfs中直接上代码&#xff1a;PutMerge.javaimport java.io.IOException;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.fs.FSDataIn…

js 获取鼠标在画布的位置_云凤蝶如何打造媲美 sketch 的自由画布

在 Design Tools 中&#xff0c;组件间的对齐与吸附功能是否好用是决定其画布是否可以高效进行产品设计的关键因素。云凤蝶作为一款快速制作高品质中后台应用的 hpaPaaS 平台&#xff0c;同样拥有自由拖拽的可视化画布。那么在云凤蝶的自由画布中&#xff0c;对齐规则是怎样的&…

GCC 使用摘记

1. 几个子程序和说明cc1C 的实际编译程序cc1plusC 的实际编译程序collect2在不使用 GNU连接程序的系统上&#xff0c;用来产生特定的全局初始化代码crt0.o为每个系统定制的初始化和结束代码libgcc默认连接的 gcc 例程库libstdc默认连接的 g 例程库 2. 几个重要的和 GCC 协同工作…

不愿意和别人打交道_如果你的交际能力很差,不喜欢与人打交道,这3种职业最适合你...

现在给个飞速发展的社会&#xff0c;在我们日常生活中交际表达能力非常的重要&#xff0c;但是还是有一部分人比较内向&#xff0c;不善于表达自己的内心&#xff0c;也不喜欢和别人接触&#xff0c;那么这一类人从事哪些行业比较合适呢&#xff1f;下面我就跟大家讨论一下。性…

python组合函数_Python---函数---参数组合

# 参数组合# 在Python中定义函数&#xff0c;可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数# 这5中都可以组合使用# 参数定义的顺序必须是&#xff1a;必选参数、默认参数、可变参数、命名关键字参数和关键字参数# 比如定义一个函数&#xff0c;包含上述若干…

Linux下TI omap芯片 MUX 配置分析(以AM335X芯片为例)

在移植内核的时候&#xff0c;通常会遇到引脚复用&#xff08;MUX&#xff09;的配置问题。在现在的Linux内核中&#xff0c;对于TI的ARM芯片&#xff0c;早已经有了比较通用的MUX配置框架。这对于许多TI的芯片都是通用的&#xff0c;这次看AM335X的代码顺手写一下分析&#xf…

python生成验证码_python之验证码生成(gvcode与captcha)

今天向大家总结一下python在做项目时用到的验证码生成工具&#xff1a;gvcode与captchagvcode全称&#xff1a;graphic-verification-code安装&#xff1a;pip install gvcode使用&#xff1a;import gvcodes, v gvcode.generate() #序列解包s.show() #显示生成的验证码图片pr…

设计模式 学习笔记(2)单一职责原则、开放封闭原则、依赖倒转原则

&#xff08;3&#xff09;单一职责原则 单一职责原则&#xff08;SRP&#xff09;&#xff0c;就一个类而言&#xff0c;应该仅有一个引起它变化的原因。例如&#xff0c;我们在写一个窗体应用程序&#xff0c;一般都会生成一个Form这样的类&#xff0c;于是我们就把各种各样的…

是网关吗_智能家居网关功能这么多,你都知道吗?

在科技发达的今天&#xff0c;我们的生活也开始趋向于智能化&#xff0c;智能家居已经迎来了新时代。电动窗帘、扫地机器人、电视、空调等电器都能智联wifi&#xff0c;可是使用的时候得一个个去控制&#xff0c;数量多的话懒癌们肯定嫌麻烦的。所以很多聪明的人都选择安装智能…

eventfd以及epoll原理分析

这两天公司代码中用到了epoll。然后在跟同事闲扯的过程中发现了Linux中有eventfd。两者虽然名字看起来差不多&#xff0c;但是相关性倒是不多。为了弄明白这两个东西到底在内核上是怎么实现的&#xff0c;这两天将内核这两个部分的相关代码看了下&#xff0c;也终于明白了这两个…

一个数据包大小是多少k_算法交流: 6046 数据包的调度机制 【2.6基本算法之动态规划】...

【题目描述】 6046 数据包的调度机制 By OIer14wa随着 Internet的迅猛发展,多媒体技术和电子商务应用日益广泛,Internet上的服务质量(QoS,Qualityof Service)问题已越来越受到重视。网络中采用的数据包调度机制与网络的服务质量 QoS 有着密切的关系。研究表明传统的基于队列的调…