C++之std::vector

容器vector是一个可以改变大小的动态数组。

  1. 序列容器中的元素按严格的线性顺序排序。单个元素通过它们在此序列中的位置进行访问
  2. 动态数组允许直接访问序列中的任何元素,甚至通过指针算术,并在序列末尾提供相对快速的元素添加/删除。

如何定义和初始化动态数组vector

std::vector<int> nVec;//空数组

std::vector<int> nVec5(5, -1);//5个元素的数组,且初始化值为1

//列表初始化

std::vector<std::string> strVec{ "x", "y", "z" };

如何操作动态数组

  1. 往数组尾部添加元素: push_back(param);
  2. 插入元素

std::vector<int>::iterator itr = nVec.begin();

nVec.insert(itr,88);//在itr的位置插入元素88

nVec.insert(itr, 2, 99);//在itr的位置插入两个99

3、删除元素

//查找特定的迭代器

std::vector<int>::iterator iter = std::find(nVec.begin(),nVec.end(),5);

删除特定元素: erase(iter);// iter为迭代器

pop_back()//删除容器尾部数据

删除一段数据

std::vector<int>::iterator firstiter = std::find(nVec.begin(), nVec.end(), 3);

 std::vector<int>::iterator lastiter = std::find(nVec.begin(), nVec.end(), 6);

    //删除一段数据

nVec.erase(firstiter, lastiter);

  //删除所有元素

    //nVec.erase(nVec.begin(), nVec.end());

//nVec.clear();//清除所有元素

4、元素的访问

下标访问: nVec[index]

迭代器访问

5、动态数组赋值:

等号赋值;区间拷贝赋值assign;同一个值赋值(六个五)assign(6, 5);

动态数组内存管理

vector 的元数据存储在栈区,而实际的元素数组存储在堆区,并且数组的大小是根据需要动态改变的。在需要更多内存时,vector 会重新分配堆区内存,并将元素从旧内存复制到新内存中。这样可以实现 vector 的动态大小和灵活性。

  1. 动态调整内存,每一次调整多少,当数组的存储内存不足时候,就会扩张目前的一半内存(可能会和编译器有关,目前用的是vs验证)。
  2. 内存大小常用的属性函数。
  1. size;当前存储的数组大小。
  2. capacity;动态数组目前能在不扩张的情况最多能存的大小。一般capacity大于或者等于size;如果相等时候再增加数据的话,就需要扩展内存,capacity的大小也会随之变化,一般增加当前capacity的一半。
  3. resize(size_type count): 更改 vector 的大小,使其包含 count 个元素。如果count小于当前的size,则删除掉后面,如果count大于size则后面数据默认0;
  4. reserve(size_type count): 请求 vector 为至少 count 个元素预留存储空间。

动态数组优缺点

优点:支持随机储存,查询效率高;

缺点:在头部和中间插入删除元素需要移动内存,效率低;

使用场景:适用于元素结构简单,变化小,并且频繁随机访问但不需要对头部和中间元素进行添加删除操作的场景。

例子:

#include <iostream>

#include<vector>

#include<algorithm>

using namespace std;

int main()

{

    std::vector<int> nVec;//空数组

    std::vector<int> nVec5(5, -1);//5个元素的数组,且初始化值为1

   

    //列表初始化

    std::vector<std::string> strVec{ "x", "y", "z" };

    for (int i=3;i<15;i++)

    {

        nVec.push_back(i);//压入元素到尾端

    }

    nVec.shrink_to_fit(); //缩小容器大小适应当前

    cout << "压入元素的数据:" << endl;

    for (int i = 0; i < nVec.size(); i++)

        cout << nVec[i] << " ";

    cout <<"容器预留大小:"<< nVec.capacity()<<endl;

   

    std::vector<int>::iterator itr = nVec.begin();

    nVec.insert(itr,88);//itr的位置插入元素88

    itr = nVec.end();

    nVec.insert(itr, 2, 99);//itr的位置插入两个99

    cout << "插入元素的数据:" << endl;

    for (int i = 0; i < nVec.size(); i++)

        cout << nVec[i] << " ";

    cout << "容器预留大小:" << nVec.capacity() << endl;

   

    //删除元素

    std::vector<int>::iterator iter = std::find(nVec.begin(), nVec.end(), 5);

    nVec.erase(iter);// iter为迭代器

    std::vector<int>::iterator firstiter = std::find(nVec.begin(), nVec.end(), 3);

    std::vector<int>::iterator lastiter = std::find(nVec.begin(), nVec.end(), 6);

    //删除一段数据

    nVec.erase(firstiter, lastiter);

    //删除所有元素

    //nVec.erase(nVec.begin(), nVec.end());

    //nVec.clear();//清除所有元素

    nVec.pop_back();

    cout << "删除元素的数据:" << endl;

    for (int i = 0; i < nVec.size(); i++)

        cout << nVec[i] << " ";

    cout << "容器预留大小:" << nVec.capacity() << endl;

    //赋值操作

    std::vector<int> vector;

    vector = nVec;

    cout << "等号赋值数据:" << endl;

    for (int i = 0; i < vector.size(); i++)

        cout << vector[i] << " ";

    cout << "容器预留大小:" << nVec.capacity() << endl;

    vector.assign(nVec.begin() + 1, nVec.end() - 1);

    cout << "区间拷贝赋值数据:" << endl;

    for (int i = 0; i < vector.size(); i++)

        cout << vector[i] << " ";

    cout << "容器预留大小:" << nVec.capacity() << endl;

  

    /*

    vector.assign(6, 5);//六个5

    cout << "同一个数值赋值数据:" << endl;

    for (int i = 0; i < vector.size(); i++)

        cout << vector[i] << " ";

    cout << "容器预留大小:" << nVec.capacity() << endl;

    */

    /*

    vector.resize(2);

    cout << "resize数据:" << endl;

    for (int i = 0; i < vector.size(); i++)

        cout << vector[i] << " ";

    cout << "容器预留大小:" << nVec.capacity() << endl;

    */

    vector.reserve(20);

    cout << "reserve数据:" << endl;

    for (int i = 0; i < vector.size(); i++)

        cout << vector[i] << " ";

    cout << "容器预留大小:" << nVec.capacity() << endl;

    getchar();

}

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

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

相关文章

【喜讯】优积科技CEO刘其东当选第十届杨浦区科协常委委员!

2023年09月21日&#xff0c;上海市杨浦区科学技术协会第十次代表大会于杨浦区人民政府机关2号楼四楼礼堂隆重召开&#xff01;公司CEO刘其东、COO周兴文、CPO胡艳玲、PM何壮志等来自全区各界的近三百名科技工作者代表参加会议。 大会现场 上海市杨浦区委书记薛侃&#xff0c;上…

CVE CNVD CNNVD

CVE 英文全称是“Common Vulnerabilities & Exposures” 通用漏洞披露。CVE就好像是一个字典表&#xff0c;为广泛认同的信息安全漏洞或者已经暴露出来的弱点给出一个公共的名称。使用一个共同的名字&#xff0c;可以帮助用户在各自独立的各种漏洞数据库中和漏洞评估工具中…

Flutter中高级JSON处理:使用json_serializable进行深入定制

Flutter中高级JSON处理 使用json_serializable库进行深入定制 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at: https://jclee95.blog.csdn.netEmail: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/article/details/1363…

针对KZG承诺和高效laconic OT的extractable witness encryption

1. 引言 2024年以太坊基金会等成员论文 Extractable Witness Encryption for KZG Commitments and Efficient Laconic OT&#xff0c;开源代码实现见&#xff1a; https://github.com/rot256/research-we-kzg&#xff08;Rust&#xff09; 在该论文中&#xff0c;提供了一种…

OpenAI划时代大模型——文本生成视频模型Sora作品欣赏(八)

Sora介绍 Sora是一个能以文本描述生成视频的人工智能模型&#xff0c;由美国人工智能研究机构OpenAI开发。 Sora这一名称源于日文“空”&#xff08;そら sora&#xff09;&#xff0c;即天空之意&#xff0c;以示其无限的创造潜力。其背后的技术是在OpenAI的文本到图像生成模…

5G-A,未来已来

目前&#xff0c;全国首个5G-A规模组网示范完成。这项由北京联通携手华为共同打造的示范项目&#xff0c;实现了北京市中心金融街、历史建筑长话大楼、大型综合性体育场北京工人体育场三个重点场景的连片覆盖。 实际路测结果显示&#xff0c;5G-A用户下行峰值速率达到10Gbps&am…

了解docker与k8s

随着 k8s 作为容器编排解决方案变得越来越流行&#xff0c;有些人开始拿 Docker 和 k8s 进行对比&#xff0c;不禁问道&#xff1a;Docker 不香吗&#xff1f; k8s 是 kubernetes 的缩写&#xff0c;8 代表中间的八个字符。 其实 Docker 和 k8s 并非直接的竞争对手两者相互依存…

安装使用zookeeper

先去官网下载zookeeper&#xff1a;Apache ZooKeeper 直接进入bin目录&#xff0c;使用powerShell打开。 输入: ./zkServer.cmd 命令&#xff0c;启动zookeeper。 zookeeper一般需要配合Dubbo一起使用&#xff0c;作为注册中心使用&#xff0c;可以参考另一篇博客&#xf…

300分钟吃透分布式缓存-17讲:如何理解、选择并使用Redis的核心数据类型?

Redis 数据类型 首先&#xff0c;来看一下 Redis 的核心数据类型。Redis 有 8 种核心数据类型&#xff0c;分别是 &#xff1a; & string 字符串类型&#xff1b; & list 列表类型&#xff1b; & set 集合类型&#xff1b; & sorted set 有序集合类型&…

基于springboot+vue的大学城水电管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

2024数字中国创新大赛·数据要素赛道“能源大数据应用赛”正式上线!参赛指南请查收

近日&#xff0c;由国网福建电力承办的2024数字中国创新大赛能源大数据应用赛正式上线发布。赛事按照数字中国建设、能源革命的战略要求&#xff0c;围绕能源数据要素x、能源数字技术、能源商业模式等热点设置赛题&#xff0c;诚邀社会各界为加快建成新型电力系统出谋划策&…

uniapp的扩展组件uni-popup 弹出层自动打开

我的需求是在页面加载完之后自动打开弹窗&#xff0c;自动打开只能写在onReady 或 mounted 生命周期内&#xff0c;这是这个组件的规定&#xff1a; 如果想在页面渲染完毕后就打开 uni-popup &#xff0c;请在 onReady 或 mounted 生命周期内调用&#xff0c;确保组件渲染完毕…

flutter 加密安全

前言&#xff1a;数据安全 数据的加密解密操作在 日常网络交互中经常会用到&#xff0c;现在密码的安全主要在于 秘钥的安全&#xff0c;如论 DES 3DES AES 还是 RSA, 秘钥的算法&#xff08;计算秘钥不固定&#xff09; 和 保存&#xff0c;都决定了你的数据安全&#xff1b;…

【k8s配置与存储--持久化存储(HostPath、EmptyDir、NFS)】

1、HostPath 持久化存储 1.1 持久卷 HostPath&#xff08;节点上的文件或目录挂载到Pod上&#xff09; 将节点上的文件或目录挂载到Pod上&#xff0c;此时该目录会变成持久化存储目录&#xff0c;即使Pod被删除后重启&#xff0c;也可以重新加载到该目录&#xff0c;该目录下…

vue-router4 (三) 路由导航的2种方法

const routes:Array<RouteRecordRaw> [{path:"/", //路径name:"Login", //路由名称component:()>import("../components/login.vue") //组件名&#xff0c;此处懒加载方式},{path:"/reg",name:"Reg",compone…

Vue 3, TypeScript 和 Element UI Plus:前端开发的高级技巧与最佳实践

Vue 3、TypeScript 和 Element UI Plus 结合使用时&#xff0c;可以提供一个强大且灵活的前端开发环境。以下是一些高级用法和技巧&#xff0c;帮助你更有效地使用这些技术&#xff1a; 1. Vue 3 高级特性 Composition API 使用 setup 函数: Vue 3 引入了 Composition API&am…

【CSS常见的选择器】介绍

CSS常见的选择器 CSS CSS CSS (Cascading Style Sheets)用于定义网页样式&#xff0c;包括字体、颜色、布局等&#xff0c;在CSS中&#xff0c;选择器用于指定哪些元素将被应用样式&#xff0c;以下是一些常见的CSS选择器&#xff1a; 元素选择器&#xff08;Type Selector&am…

数据结构(C语言)代码实现(十)——链队列循环队列

目录 参考资料 链队列的实现 LinkQueue.h LinkQueue.cpp 测试函数test.cpp 测试结果 循环队列的实现&#xff08;最小操作子集&#xff09; 完整代码 测试结果 参考资料 数据结构严蔚敏版 链队列的实现 LinkQueue.h #pragma once #include <cstdio> #incl…

Vue自定义指令directives

1. 使用<script setup> <template><input v-focus"11111" /><input v-obj"{ id: 1, name: 这里是name }" /> </template> <script setup> //定义一个变量vFocus //命名方法使得DOM元素中可以用v-focus来显示 let vFo…

uniapp:使用DCloud的uni-push推送消息通知(在线模式)java实现

uniapp:使用DCloud的uni-push推送消息通知&#xff08;在线模式&#xff09;java实现 1.背景 今天开发app的时候遇到一个需求&#xff1a; 业务在出发特定条件的时候向对应的客户端推送消息通知。 为什么选择在线模式&#xff0c;因为我们使用的是德邦类似的手持终端&#xf…