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

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/594550.html

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

相关文章

leetCode81. 搜索旋转排序数组 II

leetCode81. 搜索旋转排序数组 II 题目思路 可以二分后的具体思路见我的上篇博客 搜索旋转排序数组 代码 class Solution { public:bool search(vector<int>& nums, int target) {if(nums.empty()) return false;int R nums.size() - 1;while(R > 0 &&…

LLMs:《Better Faster Large Language Models via Multi-token Prediction》翻译与解读

LLMs&#xff1a;《Better & Faster Large Language Models via Multi-token Prediction》翻译与解读 目录 《Better & Faster Large Language Models via Multi-token Prediction》翻译与解读 Abstract 2、Method方法 Memory-efficient implementation 高效内存实…

LabVIEW数据库访问技术

LabVIEW数据库访问技术 在当前的信息化时代&#xff0c;数据管理与分析在各个领域中起着重要的作用。特别是在工业、科研等领域&#xff0c;对于数据的快速准确获取、处理和分析需求日益增加。LabVIEW作为一种图形化编程语言&#xff0c;以其直观、高效的特点&#xff0c;在自…

【数据分析】这些年我发过的微信朋友圈

TencentRecordAnalysisV1.0.3.zip 蓝奏云&#xff1a;链接:链接TencentRecordAnalysis (lanzoub.com)密码:9hww 朋友圈还是以本行业岩土、工作相关的内容居多。 对于一个不怎么发圈的人来说&#xff0c;这几天有点反常&#xff0c;这几天大概是我成功的开发了几个失败的GPT应用…

打造亚马逊爆款秘诀:流量、排名与自养号测评的完美结合

亚马逊是一个产品为王的平台&#xff0c;只要我们的产品好&#xff0c;就会有更多的流量&#xff0c;有流量还怕我们的产品卖不出去&#xff1f;身为新手我们店无流量该怎么办&#xff0c;今天教给你们五个获取流量的方法。 1.自然检索 那是我们常说的自然流量&#xff0c;通…

DBCHM 数据库 CHM 文档生成工具

介绍 DBCHM 是一款数据库文档生成工具&#xff01; 该工具从最初支持chm文档格式开始&#xff0c;通过开源&#xff0c;集思广益&#xff0c;不断改进&#xff0c;又陆续支持word、excel、pdf、html、xml、markdown等文档格式的导出。 支持的数据库 SqlServerMySQLOraclePos…

拥抱新质生产力,助力新型工业化!CMM电子展暨IARS机器人展5月东莞盛大起航

2024年5月15-17日&#xff0c;东浩兰生会展集团旗下CMM电子展&#xff06;IARS机器人展将在广东现代国际展览中心&#xff08;东莞厚街&#xff09;举办。展会面积达50000平方米&#xff0c;展示品牌700余个&#xff0c;同期论坛峰会30余场&#xff0c;预计专业观众超50000人次…

肆拾玖坊商业模式分析,新品牌如何采用合伙人模式起盘

坐标&#xff1a;厦门&#xff0c;我是易创客运营肖琳 深耕社交新零售行业10年&#xff0c;主要提供新零售系统工具及顶层商业模式设计、全案策划运营陪跑等。 比茅台盈利模式还牛逼的肆拾玖坊&#xff0c;所有男人都逃不出它的圈套&#xff01;只靠49个男人&#xff0c;用一套…

软考信息系统项目管理师论文突然单独考,其实影响没有想象的大

五一假期的前一天&#xff0c;辽宁省软考办发布了一则通知&#xff0c;安排了辽宁省的软考批次安排&#xff0c;从标题看不出来有用的信息&#xff0c;但是干货是埋在正文中的。我先把辽宁软考办的全文给你附上如下&#xff0c;具体的解读后面我会一一道来。 敲重点来了&#x…

笔记13-OSError: [Errno 24] Too many open files

文章目录 参考文献失败尝试系列查看发现&#xff0c;似乎是因为线程数有限制 修改配置先查查看 增加文件数限制&#xff0c;然后使用命令运行&#xff08;成功&#xff09; 参考文献 Linux 最大可以打开多少文件描述符&#xff1f; OSError: [Errno 24] Too many open files错…

解决在C#中方向键对控件焦点的控制

不要犹豫直接把下面这个程序复制进去就好了&#xff0c;不用担心0个引用&#xff0c;哈哈&#xff0c;可以的 public partial class MainForm : Form {public MainForm(){InitializeComponent();}protected override bool ProcessDialogKey(Keys keyData){// 检查是否是方向键…

基于springboot实现实习管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现实习管理系统演示 摘要 近年来&#xff0c;信息化管理行业的不断兴起&#xff0c;使得人们的日常生活越来越离不开计算机和互联网技术。首先&#xff0c;根据收集到的用户需求分析&#xff0c;对设计系统有一个初步的认识与了解&#xff0c;确定实习管理系统…

【PX4-AutoPilot教程-TIPS】Matlab使用ROS Toolbox编译MAVROS2消息报错缺少geographic_msgs消息

Matlab使用ROS Toolbox编译MAVROS2消息报错缺少geographic_msgs消息的解决方法 问题描述解决方法 环境&#xff1a; MATLAB : R2022b ROS Toolbox : 1.6 Windows &#xff1a;Windows 10 22H2 ROS &#xff1a;ROS2 Foxy 问题描述 在使用Matlab的ROS Toolbox工具箱编译与…

JAVA基础之Swing窗体的几种布局

1、边框布局BorderLayout 特点&#xff1a;5个方位&#xff08;东&#xff08;East&#xff09;南&#xff08;north&#xff09;西(west)北(south)中(center)&#xff09; 是一种简单的布局策略。 使用时&#xff0c;应将其看成一个“组件”。 同样&#xff0c;首先应通…

VMware worksation 17 简易安装Centos8.2、Redhat8.2、Ubuntu16.04

系列文章目录 文章目录 系列文章目录前言一、VMware worksation 17 安装二、安装Centos8.2三、安装RHEL8.2四、安装Ubuntu16.04总结 前言 傻瓜式按照Linux系统&#xff0c;如果觉得简单&#xff0c;可以自定义设置&#xff0c;特别是配置一下磁盘空间大小&#xff0c;对以后排…

通过DataGrip将mysql表结构信息转存excel 复制select结果的insert插入语句

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的专栏 总结 | 提效 | 拓展&#xff0c;在这个系列专栏中记录了博主在学习期间总结的大块知识点&#xff0c;以及日常工作中遇到的各种技术点 ┗|&#xff40;O′|┛ &#x1f306; 内容速览 1 查询表结构信息&#xff0c;并…

我希望未来10年,人工智能可以帮我解决这4件小事

生活在一线大城市的我&#xff0c;现在几乎整天被大数据、人工智能、机器学习、智慧生活的词汇环绕立体包围着&#xff0c;让我时刻感觉到&#xff0c;再过10年&#xff0c;我们五一假期真的可以摆脱现在擦肩接踵的旅游盛况了。但我其实要求倒是没这么高&#xff0c;我真心希望…

AnaTraf 网络流量分析仪 - 网络性能检测与诊断(NPMD)

目录 网络流量回溯分析,快速定位故障 实时监控,洞察网络运行状况 性能分析,优化网络应用 即插即用,无需复杂配置 了解更多 近年来&#xff0c;随着互联网技术的不断发展,网络已经成为企业运营的基础设施。然而,复杂多变的网络环境也给企业的网络管理带来了新的挑战。如何快…

一部手机就能实现24小时AI实景自动无人直播:商业推广拓客进击的全新推广利器

随着科技的迅猛发展&#xff0c;AI实景自动无人直播软件正逐渐成为商家拓展业务的重要工具。其智能讲解、一键开播以及智能回复功能&#xff0c;使得商家能够高效地进行推广活动&#xff0c;而手机拍摄真实场景和自行搭建场景的灵活性&#xff0c;则赋予了直播画面更好的呈现效…
最新文章