《21天学通C++》(第十七章)STL 动态数组类(vector和deque)

std::vector的特点
1.在数组末尾添加元素所需的时间是固定的,删除亦是如此
2.在数组中间添加或删除元素所需的时间,和该元素后面的元素个数成正比
3.动态存储

1.实例化vector

实例化vector时,要指定该动态数组中存储的对象类型

std::vector<int> intArray;
std::vector<float> floatArray;

2.使用push_back()在末尾插入元素

std::vector<int> intArray; // 创建一个空的 intArray

    // 在末尾添加元素
    intArray.push_back(1);
    intArray.push_back(2);
    intArray.push_back(3);

3.列表初始化

std::vector<int> vec={1,3,5};

4.使用insert()在指定位置插入元素

插入单个元素

std::vector<int> vec = {1, 2, 4, 5};
auto it = vec.begin() + 2; // 指向索引2的位置,即元素4的迭代器
vec.insert(it, 3); // 在索引2的位置插入元素3,输出为1 2 3 4 5

插入多个相同元素

vec.insert(it, 2, 6); // 在it指向的位置之前插入两个6
//输出结果为1 2 6 6 4 5 

将另一个vector的元素插入

std::vector<int> anotherVec = {7, 8, 9};
vec.insert(it, anotherVec.begin(), anotherVec.end()); 
// 插入anotherVec中的所有元素,输出为1 2 7 8 9 4 5

5.使用数组语法访问vector中的元素

使用下标运算符[]和成员函数at()

下标运算符[]

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    // 访问第二个元素(索引为1)
    int secondElement = vec[1];
    std::cout <<secondElement<< std::endl;//输出为2
    system("pause");
    return 0;
}

使用成员函数at()

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    // 访问第二个元素(索引为1)
    int secondElement = vec.at(1);
    std::cout <<secondElement<< std::endl;//输出为2
    system("pause");
    return 0;
}

PS: 使用下标运算符。若索引超出了当前的元素范围,不会抛出异常,但成员函数at()会,会抛出 std::out_of_range异常,因为后者会在运行阶段检查容器的大小

6.使用指针语法(迭代器)访问vector中的元素

vec.begin()vec.end(),与vec.cbegin()vec.cend()的区别

  1. 可变性: begin() 和 end() 返回的迭代器允许修改元素,而 cbegin() 和 cend()
    返回的迭代器不允许修改,只能读取。
  2. 线程安全: 使用 cbegin() 和 cend() 在多线程环境中通常更安全,因为它们提供的是常量访问,不会改变容器的状态。
  3. const 正确性: 如果你在一个 const 容器对象上调用 begin() 或 end(),编译器会报错,因为这样违反了 const的约束。在这种情况下,你应该使用 cbegin() 或 cend()。
#include <iostream>
#include <vector>

int main() {
std::vector<int> vec = {1, 2, 3};

// 可变迭代器,允许修改元素
auto it = vec.begin();
*it = 10; // 合法

// 常量迭代器,不允许修改元素
auto cit = vec.cbegin();
// *cit = 20; // 非法,会导致编译错误

const std::vector<int> constVec = {1, 2, 3};
// auto it2 = constVec.begin(); // 非法,会导致编译错误
auto it2 = constVec.cbegin(); // 合法
system("pause");
return 0;
}

7.删除vector中的元素

使用pop_back() 将末尾的元素删除

#include <iostream>
#include <vector>

int main() {
std::vector<int> vec = {1, 2, 3};

auto it=vec.cbegin();
for(auto num:vec){
    std::cout<<num<<std::endl;
}

vec.pop_back();
for(auto num:vec){
    std::cout<<num<<std::endl;
}

system("pause");
return 0;
}

8.理解大小和容量

1.大小(size): std::vector 的大小指的是容器中实际存储的元素数量,使用size()函数获取。

2.容量(capacity) std::vector 的容量指的是容器当前分配的内存能够容纳的元素数量的最大值,使用capacity()函数获取。

#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec;

    // 初始时,大小为0,容量可能不为0
    std::cout << "Size: " << vec.size() << ", Capacity: " << vec.capacity() << std::endl;

    // 添加元素
    vec.push_back(1);
    vec.push_back(2);

    // 大小变为2,容量可能增加但大小不会改变
    std::cout << "After adding elements, Size: " << vec.size() << ", Capacity: " << vec.capacity() << std::endl;

    // 明确设置容量
    vec.reserve(100);

    // 容量至少为100,大小不变
    std::cout << "After reserving capacity, Size: " << vec.size() << ", Capacity: " << vec.capacity() << std::endl;

    system("pause");
    return 0;
}

9.STL deque类

也是一个STL动态数组类,但支持在数组的开头和末尾插入和删除元素,即提供双端队列的功能。记得添加头文件<deque>

添加元素:

  • push_back():在后端添加一个元素。
  • push_front():在前端添加一个元素。

删除元素:

  • pop_back():删除后端的元素。
  • pop_front():删除前端的元素。
#include <iostream>
#include <deque>

int main() {
    std::deque<int> dq;

    // 在后端添加元素
    dq.push_back(10);
    dq.push_back(20);

    // 在前端添加元素
    dq.push_front(5);

    // 访问并打印所有元素
    for (int num : dq) {
        std::cout << num << " ";
    }
    std::cout << std::endl; // 输出 "5 10 20"

    // 删除前端元素
    dq.pop_front();

    // 删除后端元素
    dq.pop_back();

    // 再次访问并打印所有元素
    for (int num : dq) {
        std::cout << num << " ";
    }
    std::cout << std::endl; // 输出 "10"
    system("pause");
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UE和three.js的区别

UE&#xff08;Unreal Engine&#xff09;和three.js都是用于创建3D图形的软件平台&#xff0c;但它们在功能、目标和应用场景方面存在一些差异。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 功能 UE 是一款功能全面的3D游戏引擎&…

03-单片机商业项目编程,从零搭建低功耗系统设计

一、本文内容 上一节《02-单片机商业项目编程&#xff0c;从零搭建低功耗系统设计-CSDN博客》引出了伪时间片的概念&#xff0c;这也是再低功耗系统设计中必须使用的程序设计逻辑&#xff0c;本文着重来讲解如何利用伪时间片来设计伪多任务&#xff0c;以及伪时间片多任务内核设…

力扣刷题第1天:消失的数字

大家好啊&#xff0c;从今天开始将会和大家一起刷题&#xff0c;从今天开始小生也会开辟新的专栏。&#x1f61c;&#x1f61c;&#x1f61c; 目录 第一部分&#xff1a;题目描述 第二部分&#xff1a;题目分析 第三部分&#xff1a;解决方法 3.1 思路一&#xff1a;先排序…

私人健身教练预约管理小程序开发源码现成案例(小程序+APP+H5 源码部署)

一、私人健身教练预约管理系统-环境介绍 1.1 私人健身教练预约管理系统-运行环境 开发语言&#xff1a;PHP 数据库&#xff1a;MySQL 系统架构&#xff1a;TP 后端&#xff1a;SpringBoot 前端&#xff1a;Vue 2. 私人健身教练预约管理系统-系统介绍。 2.1私人健身教练预约管…

手机传输助手有哪些?如何快速互传文件?

手机已经成为我们生活和工作中不可或缺的一部分&#xff0c;而手机传输助手&#xff0c;作为一种帮助我们在不同设备之间快速、方便地共享文件的工具&#xff0c;其重要性不言而喻。无论是在工作中需要将文件从电脑传输到手机&#xff0c;还是在生活中想要与朋友分享美好的瞬间…

FFmpeg常用命令详解与实战指南

下载地址&#xff1a;Releases BtbN/FFmpeg-Builds (github.com) 1. 获取视频信息 使用FFmpeg获取视频信息是最基本的操作之一。你可以使用-i选项指定输入文件&#xff0c;然后使用FFmpeg内置的分析器来获取视频的各种信息&#xff0c;包括视频编解码器、音频编解码器、分辨…

2.外卖点餐系统(Java项目 springboot)

目录 0.系统的受众说明 1.系统功能设计 2.系统结构设计 3.数据库设计 3.1实体ER图 3.2数据表 4.系统实现 4.1用户功能模块 4.2管理员功能模块 4.3商家功能模块 4.4用户前台功能模块 4.5骑手功能模块 5.相关说明 新鲜运行起来的项目&#xff1a;如需要源码数据库…

封装一个可以最小化和展开的弹窗组件

gl-dialog 大概思路&#xff1a; 在弹窗组件内部引入gl-dialog-collapse&#xff0c;这个组件主要用于存储已经被最小化的弹窗&#xff08;基础数据&#xff09; 弹窗内部的数据如何在父组件拿到是通过作用域插槽来实现的 gl-dialog接收一个tempData这个数据会在内部被记录下来…

IDEA远程连接Docker服务

1.确保你的服务器已经安装docker docker安装步骤可查看&#xff1a;CentOS 9 (stream) 安装 Docker 2.安装完docker后开启远程连接 默认配置下&#xff0c;Docker daemon只能响应来自本地Host的客户端请求。如果要允许远程客户端请求&#xff0c;需要在配置文件中打开TCP监听…

【数据结构】栈(Stack)和队列(Queue)

文章目录 栈一、栈的概念及结构二、栈的特点三、栈的实现1.初始化栈2.判断栈空3.入栈4.出栈5.取栈顶元素6.栈的元素个数7.销毁 队列一、队列的概念及结构二、队列的特点三、队列的实现1.初始化2.入队3.出队4.判断队空5.取队头元素6.取队尾元素 总结 栈 一、栈的概念及结构 栈…

k8s 理论知识基本介绍

目录 一 k8s 理论前言 &#xff08;一&#xff09;微服务是什么 1&#xff0c;应用场景 2&#xff0c;API 是什么 &#xff08;二&#xff09;&#xff0c;微服务 如何做版本迭代 1. Docker镜像构建 2. 版本标记 3. Docker Registry 4. 环境一致性 5. 滚动更新…

26 | 备库为什么会延迟好几个小时?

在官方的 5.6 版本之前,MySQL 只支持单线程复制,由此在主库并发高、TPS 高时就会出现严重的主备延迟问题。 coordinator 就是原来的 sql_thread, 不过现在它不再直接更新数据了,只负责读取中转日志和分发事务。真正更新日志的,变成了 worker 线程。而 work 线程的个数,就是…

今日刷三题(day12):兑换零钱(一)+最长回文子串+编辑距离(一)

题目一&#xff1a;兑换零钱&#xff08;一&#xff09; 题目描述&#xff1a; 给定数组coins&#xff0c;coins中所有的值都为正整数且不重复。每个值代表一种面值的货币&#xff0c;每种面值的货币可以使用任意张&#xff0c;再给定一个aim&#xff0c;代表要找的钱数&…

单位圆内的正交向量多项式,第一部分:由Zernike多项式的梯度导出的基组

clear all; close all; clc; %% I1=double(imread(E:\zhenlmailcom-E8E745\华为家庭存\image\imgs\right\0.bmp)); I2=double(imread(E:\zhenlmailcom-E8E745\华为家庭存储\.法\image\imgs\right\1.bmp)); I3=double(imread(E:\zhenlmailcom-E8E745\华为家庭存储\.p\image\imgs…

学习torchmd分子动力学模拟

TorchMD打算提供一种简单易用的API&#xff0c;用于使用PyTorch进行分子动力学。这使研究人员能够更快地进行力场开发研究&#xff0c;并以PyTorch的简单性和强大性将神经网络潜力无缝集成到动力学中。 TorchMD使用与经典MD代码&#xff08;如ACEMD&#xff09;一致的化学单位&…

实在Agent智能体:引领智能自动化新纪元

在数字化转型的浪潮中&#xff0c;实在智能科技有限公司凭借其前沿技术&#xff0c;推出了实在Agent智能体——一款革命性的超自动化智能体。它不仅代表了人工智能技术的新高度&#xff0c;更预示着未来工作方式的变革。 什么是实在Agent智能体&#xff1f; 实在Agent智能体是…

《Fundamentals of Power Electronics》——状态空间平均法

文献中出现了许多交流变换器建模技术&#xff0c;包括电流注入法、电路平均法和状态空间平均法。尽管给定方法的支持者可能更喜欢用特定形式表示最终结果&#xff0c;但几乎所有方法的最终结果都是等效的。所有人都会赞同&#xff0c;平均和小信号线性化是PWM变换器建模的关键步…

云动态摘要 2024-05-06

给您带来云厂商的最新动态&#xff0c;最新产品资讯和最新优惠更新。 最新优惠与活动 [免费试用]即刻畅享自研SaaS产品 腾讯云 2024-04-25 涵盖办公协同、营销拓客、上云安全保障、数据分析处理等多场景 云服务器ECS试用产品续用 阿里云 2024-04-14 云服务器ECS试用产品续用…

用得助全媒体呼叫中心,让AI落到实处帮品牌做营销

怎么让人工智能落到实处的帮助到我们&#xff1f;我们今天来讲讲中关村科金得助全媒体呼叫中心是怎么让AI帮品牌。 这次聊的案例是知名的护肤品牌&#xff0c;该品牌在中国功能性护肤品市场占有率达到20.5%&#xff0c;这么高的市场占有率客户的咨询量也是非常庞大的&#xff0…

MAC M1 配置 Git SSH

背景 换了新笔记本&#xff0c;本地想要克隆github 上的项目需要配置ssh 公钥到自己的github账户中&#xff0c;否则使用ssh 地址克隆会报错&#xff0c;如下。 gitgithub.com: Permission denied (publickey). fatal: Could not read from remote repository.操作 1. 生成s…
最新文章