【C++】STL——vector的有关空间的函数介绍和使用、size和capacity函数、resize和reserve函数

news2024/11/27 22:37:52

文章目录

  • 1.vector的使用
  • 2.vector空间增长问题
    • (1)size 获取数据个数
    • (2)capacity 获取容量大小
    • (3)empty 判断是否为空
    • (4)resize 改变vector的size
    • (5)reserve 改变vector的capacity

1.vector的使用

  vector和含义、vector构造函数、vector迭代器

  vector完整介绍

2.vector空间增长问题

在这里插入图片描述

(1)size 获取数据个数

  size()函数用于返回容器中元素的个数。

  下面是一个使用std::vector的size()函数的例子:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> numbers; // 创建一个int类型的vector容器

    numbers.push_back(10); // 向容器中添加元素
    numbers.push_back(20);
    numbers.push_back(30);
    numbers.push_back(40);

    std::cout << "容器中元素的个数为:" << numbers.size() << std::endl;

    return 0;
}

//容器中元素的个数为:4

(2)capacity 获取容量大小

  vector容器的capacity()函数用于返回当前容器的容量,即底层数组能够容纳的最大元素数量。

  下面是一个使用std::vector的capacity()函数的例子:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> numbers; // 创建一个int类型的vector容器

    std::cout << "初始容器的容量为:" << numbers.capacity() << std::endl;

    numbers.push_back(10); // 向容器中添加元素
    numbers.push_back(20);
    numbers.push_back(30);
    numbers.push_back(40);

    std::cout << "添加四个元素后的容器的容量为:" << numbers.capacity() << std::endl;

    return 0;
}

//初始容器的容量为:0
//添加四个元素后的容器的容量为:4

  size()和capacity()有不同的地方:

  size()函数用于返回容器中当前存储的元素数量,即容器中的实际元素个数。

  capacity()函数用于返回容器底层实际分配的存储空间大小,即容器能够容纳的最大元素数量。
  

(3)empty 判断是否为空

  empty()函数用于检查vector容器是否为空,即是否没有任何元素。它返回一个布尔值,true表示容器为空,false表示容器非空。

  下面是一个使用empty()函数的例子:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> numbers; // 创建一个int类型的vector容器

    if (numbers.empty()) {
        std::cout << "容器为空" << std::endl;
    } else {
        std::cout << "容器非空" << std::endl;
    }

    numbers.push_back(10); // 向容器中添加元素

    if (numbers.empty()) {
        std::cout << "容器为空" << std::endl;
    } else {
        std::cout << "容器非空" << std::endl;
    }

    return 0;
}

//容器为空
//容器非空

(4)resize 改变vector的size

  resize()函数用于更改vector容器的大小,以容纳指定数量的元素。 当新的大小大于当前大小时,额外的元素将被默认构造或复制构造。当新的大小小于当前大小时,超出新大小的元素将会被删除。

  下面是一个使用resize()函数的例子:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> numbers; // 创建一个int类型的vector容器

    numbers.push_back(10); // 向容器中添加元素
    numbers.push_back(20);
    numbers.push_back(30);
    numbers.push_back(40);

    std::cout << "容器中元素的个数为:" << numbers.size() << std::endl;

	numbers.resize(10);

	std::cout << "resize后的容器中可放元素个数为:" << numbers.size() << std::endl;

    return 0;
}

//容器中元素的个数为:4
//resize后的容器中可放元素个数为:10

(5)reserve 改变vector的capacity

  reserve()函数用于为容器预留一定的存储空间,以便在之后添加元素时减少重新分配内存的次数。 它接受一个参数,即预留空间的大小。注意,预留的空间大小并不会直接改变vector的size。

  使用reserve()函数的目的是优化性能,当我们预知容器可能需要存储大量元素时,可以使用reserve()函数提前分配足够的内存空间,避免频繁的内存重新分配和数据复制。

  下面是一个简单的例子,用于说明reserve()函数的含义和概念:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> numbers; // 创建一个int类型的vector容器

    std::cout << "初始容器的容量为:" << numbers.capacity() << std::endl;

    numbers.push_back(10); // 向容器中添加元素
    numbers.push_back(20);
    numbers.push_back(30);
    numbers.push_back(40);

    std::cout << "添加四个元素后的容器的容量为:" << numbers.capacity() << std::endl;

    numbers.reserve(10);

    std::cout << "reserve后容器的容量为:" << numbers.capacity() << std::endl;

    return 0;
}

//初始容器的容量为:0
//添加四个元素后的容器的容量为:4
//reserve后容器的容量为:10

注意:
  capacity的代码在vs和g++下分别运行会发现,vs下capacity是按1.5倍增长的,g++是按2倍增长的。 这个问题经常会考察,不要固化的认为,vector增容都是2倍,具体增长多少是根据具体的需求定义的。vs是PJ版本STL,g++是SGI版本STL。

总结:

  resize在开空间的同时还会进行初始化,影响size。

  reserve只负责开辟空间,如果确定知道需要用多少空间,reserve可以缓解vector增容的代价缺陷问题。

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

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

相关文章

Alvas.Audio v2019 Crack

Alvas.Audio v2019 Crack 该库使C#和VB.Net程序员能够创建执行&#xff08;包括混合声音信息&#xff09;、捕获、转换和编辑音频的应用程序。 阿尔瓦斯。音频是C#音乐库。网络程序员。 这使你能够生产。NET程序&#xff0c;例如Winforms/WPF/Windows服务/控制台录音机、Int…

❤️创意网页:使用CSS和HTML创建令人惊叹的3D立方体

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;简单好用又好看&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;欢迎踏入…

经典文献阅读之--SRIF-based LiDAR-IMU Localization(SRIF的LiDAR-IMU自动驾驶鲁棒定位)

0. 简介 对于车辆来说&#xff0c;我们更希望能够得到一个有效的定位系统&#xff0c;能够保证高精度的同时&#xff0c;拥有较高的鲁棒性&#xff0c;而《Robust SRIF-based LiDAR-IMU Localization for Autonomous Vehicles》就是这样一篇文章&#xff0c;在各种场景中实现了…

起名大师,支持多种取名方式,根据自己的喜好去选择

软件功能&#xff1a; 1.参考宝宝姓氏、性别、生辰八字、天格、地格辅助用户为宝宝取名。 2.一次可生产数千个好名字&#xff0c;您还可根据笔画数、拼音、五行等筛选喜欢的名字。 3.提供10余种方法供起名选择&#xff0c;比如指定取名&#xff0c;谐音取名&#xff0c;生日取…

【百度】判断ip地址是否合法

在LeetCode上没有看到这个题目&#xff0c;加上对String的API记得不清楚&#xff0c;导致这个题目没有写得很好&#xff0c;许愿面试官能够仁慈一点 一个合法的ip地址应该有&#xff1a; 三个点将字符串划分为4个数字数字的大小[0,255]&#xff0c;且数字不能为空 合理应用St…

mycat 垂直分库与水平分表使用详解

说明 在了解mycat的常用分片规则之前,有必要再对涉及到分片规则相关的几个配置文件做深入的了解,包括:schema.xml,server.xml,rule.xml等, 其中最核心的schema.xml文件是配置分片规则的入口文件,有必要对该配置文件中的关键参数做了解,且看下面这幅图,回顾下里面的配置…

【C++】二叉搜索树KV模型

最典型的一个场景&#xff0c;自动翻译软件&#xff0c;输入中文&#xff0c;输出对应的英文&#xff0c;输入英文&#xff0c;输出对应的中文。 可以用一颗搜索二叉树来实现这一功能。 K->key V->val 基础结构和普通搜索二叉树保持一致&#xff0c;只是成员多了一个_val…

关于Tab制表符,点击一次跳很多字符的问题解决

首先在出现问题的地方右键鼠标&#xff0c;出现后点击段落。 进入后点击左下角的制表位 进入后点击全部清除&#xff0c;然后确认&#xff0c;问题就解决了&#xff08;哪里有问题就处理哪里&#xff09;

天纵竞赛系统助力江苏省“苏小登杯”不动产登记技能竞赛暨首届全国赛省级选拔赛

7月14日&#xff0c;第四届江苏省“苏小登杯”不动产登记技能竞赛暨首届全国赛省级选拔赛在苏州广播电视总成功举办。天纵竞赛系统提供核心软件技术及其配套硬件支持。 本次竞赛由江苏全省13支队伍、52名一线不动产登记人员参加比赛&#xff0c;竞赛环节包括笔试、现场竞答、代…

性能测试 —— JMeter分布式测试及其详细步骤

性能测试概要 性能测试是软件测试中的一种&#xff0c;它可以衡量系统的稳定性、扩展性、可靠性、速度和资源使用。它可以发现性能瓶颈&#xff0c;确保能满足业务需求。很多系统都需要做性能测试&#xff0c;如Web应用、数据库和操作系统等。 性能测试种类非常多&#xff0c…

windows操作小技巧1:文件批操作更改类型

今日更新一个Windows操作小技巧: 日常生活中我们有批量操作更改文件后缀名&#xff08;类型&#xff09;的需要&#xff1a; 比如这有五个.txt文本文件&#xff0c;我要想将其批量改为.html该如何操作呢&#xff1f; 首先新建文本文档&#xff1a; 其次在新建的文本文档输入以…

B 端软件:常见知识梳理

前言 我一直从事企业级软件研发工作&#xff0c;也就是我们通常称之为 B 端软件。近年来&#xff0c;我的工作重心主要在研发低代码平台和 aPaaS 平台&#xff0c;这使我对 B 端软件有了更深入的理解。 和 B 端软件对应的就是我们熟悉的 C 端软件&#xff0c;我们手机中安装的那…

VsCode添加Vue模版代码片段

文章目录 VsCode添加Vue模版代码片段1. 复制一段已有要制作模板的Vue代码&#xff0c;比如&#xff1a;2. 粘贴到下方链接的工具网站&#xff0c;可自动生成模板代码的片段3. VsCode中设置代码片段3-1 打开菜单&#xff1a;首选项-用户片段3-2 出现如下的搜索栏&#xff0c;搜索…

简易注册中心监控NAS断电断网

日常使用NAS过程中&#xff0c;偶尔会出现家里断电或者断网的情况&#xff0c;NAS自带网络断开的通知功能&#xff0c;但需要是恢复网络链接后才会通知&#xff0c;而此时都恢复了&#xff0c;再通知也就没那么重要&#xff0c;还有断电情况下也是需要回家才能知道&#xff0c;…

opencv -12 图像运算之按 《位或》 运算(图像融合图像修复和去除)

位或运算 或运算的规则是&#xff0c;当参与或运算的两个逻辑值中有一个为真时&#xff0c;结果就为真。其逻辑关系可以类比为如图 所示的并联电路&#xff0c;两个开关中只要有任意一个闭合时&#xff0c;灯就会亮。 3-5 对参与或运算的算子的不同情况进行了说明&#xff0c;…

浅谈设计模式之工厂模式

0 工厂模式的介绍 工厂模式属于创建型模式&#xff0c;是Java中最常见的设计模式之一。工厂模式提供了一种将对象的实例化过程封装在工厂类的方式&#xff0c;通过工厂模式可以屏蔽掉对象的创建过程&#xff0c;对外提供了一种统一的接口来创建不同类型的对象。 优点&#xf…

数据结构01-线性结构-链表栈队列-队列篇

文章目录 参考&#xff1a;总结大纲要求线性结构-队列QQ号码解密 参考&#xff1a; 总结 本系列为C数据结构系列&#xff0c;会介绍 线性结构&#xff0c;简单树&#xff0c;特殊树&#xff0c;简单图等。本文为线性结构部分。 大纲要求 线性结构 【 3 】链表&#xff1a;单…

在线版PS就选这5个!能免费使用

虽然AdobePhotoshop作为专业的图形编辑工具为设计师带来了很多便利&#xff0c;但是它下载繁琐&#xff0c;费用昂贵的特性也让很多设计师望而却步。本文精心整理了5款能作为在线PS使用的设计工具&#xff0c;不仅能减轻操作设备的内存负担&#xff0c;而且可以免费使用&#x…

Java阶段五Day07

Java阶段五Day07 文章目录 Java阶段五Day07问题解析dubbo和nacos Dubbo负载均衡负载均衡介绍准备一个负载均衡的环境Dubbo负载均衡策略配置负载均衡的方式dubbo配置负载均衡优先级微服务阶段性架构 Spring Boot Starter自定义配置准备一个starter案例项目Spring框架版本迭代案例…

K8S安全风险及防护建议

Kubernetes&#xff08;K8S&#xff09;是一个可移植、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;方便进行声明式配置和自动化。一个Kubernetes集群通常包含跨多台计算机运行的控制平面和多个工作节点&#xff08;node&#xff09;&#xff0c;控…