C++ 入门14:STL 容器之向量(vector)

往期回顾:

C++ 入门11:虚函数和多态-CSDN博客

C++ 入门12:模板(Template)-CSDN博客

C++ 入门13:异常处理-CSDN博客


C++ 入门14:STL 容器之向量(vector) 

一、前言

在前面文章的学习中,我们学习了类和对象的基础知识、构造函数、拷贝构造函数、静态成员、常量成员、运算符重载、友元函数、友元类、继承和派生类、虚函数和多态、模板以及异常处理。今天,我们将学习 C++ 标准模板库(STL)中的一种重要容器——向量(vector)。向量是一种动态数组,可以方便地进行元素的添加和删除操作。这是STL里非常常用的一种,需要好好掌握。

二、STL 容器之向量(vector)

2.1、 什么是向量?

向量(Vector)是C++标准模板库(Standard Template Library, STL)中一个非常核心且广泛使用的容器类。它提供了一种能够存储同一类型元素的动态数组的实现。

向量在底层通常是通过一个连续的内存块来存储元素,但与传统的静态数组不同,向量的大小(即它能存储的元素数量)是可以动态变化的。这意味着,随着程序运行的需要,向量可以自动地增加其容量以容纳更多的元素,或者减少其占用的内存空间(尽管减少容量通常不会自动发生,除非通过特定的成员函数如shrink_to_fit来请求)。

2.2、向量的主要特点

  1. 动态数组:向量提供了类似数组的顺序访问功能,但允许在运行时动态地改变其大小。这意味着你可以像使用数组一样通过索引来访问向量中的元素,但无需在编译时指定数组的大小。

  2. 自动内存管理:当你向向量中添加元素时,如果当前分配的存储空间不足以容纳新元素,向量会自动重新分配一块更大的内存区域,并将现有元素以及新元素复制到新的内存位置。同样,当元素被移除时,虽然向量的实际大小会减小,但底层内存不会自动减少,除非特别请求。

  3. 提供丰富的成员函数:向量提供了许多成员函数来支持各种操作,如push_back用于在向量末尾添加一个元素,pop_back用于移除向量末尾的元素,size返回当前向量的元素个数,capacity返回当前向量分配的存储空间大小等。

  4. 高效访问:由于向量在内存中连续存储元素,因此通过索引访问向量中的元素是非常高效的,时间复杂度为O(1)。

  5. 模板支持:向量是模板类,因此它可以存储任何类型的元素。你只需在声明向量时指定元素的类型即可。

2.3、向量的使用场景

1、当需要存储一个元素集合,并且这个集合的大小可能会在运行时改变时。

2、当需要频繁访问集合中的元素,且对访问速度有较高要求时(因为向量提供了高效的随机访问)。
3、当想要自动管理内存,避免手动处理动态数组时可能遇到的内存泄漏等问题。

2.4、向量的基本操作

(1)引入头文件

在使用向量之前,需要引入头文件 <vector>

#include <vector>

(2)创建向量

我们可以使用不同的方式来创建向量。

#include <iostream>
#include <vector>
using namespace std;int main() {vector<int> vec1; // 创建一个空的向量vector<int> vec2(10); // 创建一个包含10个元素的向量,每个元素的值为0vector<int> vec3(10, 5); // 创建一个包含10个元素的向量,每个元素的值为5vector<int> vec4 = {1, 2, 3, 4, 5}; // 使用列表初始化向量return 0;
}

2.5、向量的常用成员函数

(1)添加元素

使用 push_back 函数在向量的末尾添加元素。

vector<int> vec;
vec.push_back(10);
vec.push_back(20);
vec.push_back(30);

(2)访问元素

使用 at 函数或下标运算符 [] 访问向量中的元素。

cout << "Element at index 0: " << vec.at(0) << endl;
cout << "Element at index 1: " << vec[1] << endl;

(3)修改元素

直接使用下标运算符 [] 修改向量中的元素。

vec[0] = 100;
cout << "Modified element at index 0: " << vec[0] << endl;

(4)删除元素

使用 pop_back 函数删除向量末尾的元素。

vec.pop_back();
cout << "After pop_back, size of vec: " << vec.size() << endl;

(5)获取向量的大小

使用 size 函数获取向量中的元素个数。        

cout << "Size of vec: " << vec.size() << endl;

(6)检查向量是否为空

使用 empty 函数检查向量是否为空。

if (vec.empty()) {cout << "vec is empty" << endl;
} else {cout << "vec is not empty" << endl;
}

2.6、 向量的迭代器

向量提供了一种灵活的方式来访问其元素——迭代器。迭代器是一种对象,它可以用来遍历容器中的元素。

(1)获取迭代器

使用 begin 函数获取指向向量第一个元素的迭代器,使用 end 函数获取指向向量最后一个元素的下一个位置的迭代器。

vector<int> vec = {10, 20, 30, 40, 50};// 使用迭代器遍历向量
for (vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {cout << "Element: " << *it << endl;
}

(2)使用范围循环

C++11 引入了范围循环,可以更简洁地遍历向量。

for (int val : vec) {cout << "Element: " << val << endl;
}

2.7、 向量的高级操作

(1)插入元素

使用 insert 函数在向量的指定位置插入元素。

vector<int> vec = {10, 20, 30};
vec.insert(vec.begin() + 1, 15); // 在第二个位置插入15
for (int val : vec) {cout << "Element: " << val << endl;
}

(2)清空向量

使用 clear 函数清空向量中的所有元素。

vector<int> vec = {10, 20, 30, 40, 50};
vec.clear(); // 清空向量
cout << "After clear, size of vec: " << vec.size() << endl;

2.8、向量与动态数组的区别

向量和动态数组(如 new[] 分配的数组)有一些相似之处,但也有重要的区别:

自动管理内存

向量会自动管理内存,当向量大小增加时,会自动分配更多的内存。而动态数组需要手动管理内存。
方便的操作向量提供了丰富的成员函数,如 push_backinserterase 等,而动态数组需要手动实现这些操作。
安全性向量提供边界检查,如 at 函数可以抛出异常,而动态数组没有边界检查,可能导致未定义行为。

以上就是 C++ 标准模板库中的向量(vector)的基础知识点了。包括向量的基本操作、迭代器的使用以及一些高级操作。向量是 C++ 中非常常用的一种容器,它提供了动态调整大小的功能,非常适合需要频繁修改大小的场景。基本上在开发中都会用到的,大家多看看,一定要掌握。

都看到这里了,点个赞再走呗朋友~

加油吧,预祝大家变得更强!

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

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

相关文章

使用Python进行车牌识别

哈喽,大家好,我是木头左! 1. 车牌识别的重要性 车牌识别是计算机视觉领域的一个重要应用,它可以自动识别车辆的车牌号码。在交通管理、停车场管理、道路监控等领域,车牌识别技术具有广泛的应用前景。本文将介绍如何使用Python进行车牌识别,帮助读者掌握这一技能。 2. 车…

打开磁盘格式为NTFS的磁盘 ntfs磁盘无法打开 移动硬盘出现ntfs怎么打不开了的原因和解决方案

在日常的工作和生活中&#xff0c;移动硬盘作为我们存储和传输数据的重要工具&#xff0c;发挥着不可替代的作用。然而&#xff0c;有时候我们会遇到这样一个问题&#xff1a;移动硬盘突然显示NTFS格式&#xff0c;并且无法正常打开。面对这种情况&#xff0c;我们往往感到束手…

【Android】高端的UI,往往只需要最朴素的控件组成

【Android】高端的UI&#xff0c;往往只需要最朴素的控件组成 Android 作为全球最流行的移动操作系统之一&#xff0c;提供了一套丰富的 UI 控件&#xff0c;使开发者能够构建功能强大、交互性强的应用。本博客系列将探讨 Android UI 控件的功能&#xff0c;介绍最常见的六种控…

实战:Linux下静默安装DM达梦数据库

官方文档参考&#xff1a;安装前准备 | 达梦技术文档 静默安装DM达梦数据库&#xff0c;提前编写好安装脚本、下载好软件、配置好服务器的内核参数信息。 一、安装前的准备 1.操作系统环境检测 #查看服务器操作系统版本和型号 cat /etc/system-release cat /etc/os-releas…

【系统架构设计师】十一、系统架构设计(层次架构风格|MVC|面向服务的架构风格|ESB)

目录 五、层次架构风格 5.1 两层C/S架构 5.2 三层C/S架构 5.3 三层B/S架构 5.4 MVC架构 5.5 MVP架构 5.6 MVVM架构 六、面向服务的架构风格 6.1 SOA特征 6.2 Web Service 6.2.1 关键技术 6.2.2 WEB Service 6.3 企业服务总线ESB 相关推荐 历年真题练习 五、层次…

【MAUI】生命周期

.NET Multi-platform App UI (.NET MAUI) 应用通常有四种执行状态&#xff1a;“未运行”、“运行中”、“已停用”和“已停止”。 当应用从未运行状态转换为运行状态、从运行状态转换为已停用状态、从已停用状态转换为已停止状态、从已停止状态转换为运行状态&#xff0c;以及…

Java并发编程之如何正确的停止线程

在Java线程状态转换中&#xff0c;我们知道&#xff0c;线程最终的命运是Terminated&#xff0c;当然&#xff0c;也有永不停止一直干活的线程&#xff08;除非断电&#xff09;。线程的停止&#xff0c;正常来说是线程运行到结束&#xff0c;但也有程序出错或是用户关闭程序等…

new mars3d.graphic.FixedRoute({的position长度超过一百条浏览器会卡死的解决方案

问题场景描述&#xff1a; FixedRoute的position数据已经很精细时&#xff0c;会导致卡死的问题 解决方案&#xff1a; 1. 数据已经很精细时&#xff0c;可以不用autoSurfaceHeight来计算&#xff0c;如果非要用&#xff0c;可以加个minDistance: 200参数。 fixedRoute.auto…

ChatGPT 深度解析:技术驱动的智能对话

在当今科技飞速发展的时代&#xff0c;ChatGPT 无疑成为了最耀眼的明星之一。它以其令人惊叹的智能对话能力&#xff0c;引发了全球范围内的广泛关注和热议。 ChatGPT 背后的技术堪称精妙绝伦。它基于深度学习算法&#xff0c;通过对海量数据的学习和分析&#xff0c;从而能够理…

BasicSR项目(通用图像超分、修复、增强工具库)介绍

项目地址&#xff1a;https://github.com/XPixelGroup/BasicSR 文档地址&#xff1a;https://github.com/XPixelGroup/BasicSR-docs/releases BasicSR 是一个开源项目&#xff0c;旨在提供一个方便易用的图像、视频的超分、复原、增强的工具箱。BasicSR 代码库从2018年4月20日…

【Memcached】Memcached的工作原理

目录 ​编辑 第2章&#xff1a;Memcached工作原理 2.1 数据存储与访问 2.2 分布式架构 2.3 数据过期机制 第2章&#xff1a;Memcached工作原理 2.1 数据存储与访问 Memcached是一种键值存储系统&#xff0c;其中数据以键值对的形式存储。键是用于定位数据的唯一标识符&am…

MySQL架构详解

MySQL是一个广泛使用的开源关系数据库管理系统&#xff0c;以其可靠性、性能和易用性而闻名。了解MySQL的架构对于优化数据库性能、设计高效的数据库系统以及进行有效的数据库管理至关重要。本文将详细介绍MySQL的架构&#xff0c;包括其主要组件和功能。 1. 连接器&#xff0…

libyaml库的交叉编译

目录 1.Ubuntu环境中安装libyaml库 2.交叉编译 3.success 1.Ubuntu环境中安装libyaml库 官方地址&#xff1a;https://pyyaml.org/wiki/LibYAML 下载路径&#xff1a;http://pyyaml.org/download/libyaml/yaml-0.2.5.tar.gz 2.交叉编译 官方的下载路径为/usr/local下&am…

【unity实战】使用unity制作一个红点系统

前言 注意&#xff0c;本文是本人的学习笔记记录&#xff0c;这里先记录基本的代码&#xff0c;后面用到了再回来进行实现和整理 素材 https://assetstore.unity.com/packages/2d/gui/icons/2d-simple-ui-pack-218050 框架&#xff1a; RedPointSystem.cs using System.…

PHP全功能微信投票迷你平台系统小程序源码

&#x1f525;让决策变得超简单&#xff01;&#x1f389; &#x1f680;【一键创建&#xff0c;秒速启动】 嘿小伙伴们&#xff0c;你还在为组织投票而手忙脚乱吗&#xff1f;来试试这款全功能投票迷你微信小程序吧&#xff01;只需轻轻一点&#xff0c;无论是班级选举、社团…

Java创建对象除了new还有别的什么方式?

通过反射创建对象&#xff1a;通过 Java 的反射机制可以在运行时动态地创建对象。可以使用 Class 类的 newInstance() 方法或者通过 Constructor 类来创建对象 public class MyClass { public MyClass() { // Constructor } } public class Main { public…

初学者指南:如何搭建和配置 Nginx 服务器

初学者指南&#xff1a;如何搭建和配置 Nginx 服务器 Nginx 是一个高性能的 HTTP 和反向代理服务器&#xff0c;也是一个 IMAP/POP3/SMTP 代理服务器。本文将详细介绍如何在 Linux 上安装、配置和管理 Nginx 服务器。 一、安装 Nginx Nginx 可以安装在多种操作系统上&#x…

c# 依赖注入-服务的生命周期

在 C# 中&#xff0c;依赖注入服务的生命周期指的是在应用程序中管理和控制依赖项注入服务对象的生命周期的方式。常见的生命周期包括瞬态&#xff08;transient&#xff09;、作用域&#xff08;scoped&#xff09;和单例&#xff08;singleton&#xff09;三种。 瞬态&#…

【postgresql】pg_dump备份数据库

pg_dump 介绍 pg_dump 是一个用于备份 PostgreSQL 数据库的实用工具。它可以将数据库的内容导出为一个 SQL 脚本文件或其他格式的文件&#xff0c;以便在需要时进行恢复或迁移。 基本用法 pg_dump [选项] [数据库名] 命令选项 -h 或 --host&#xff1a;指定数据库服务器的主…

2024年大数据高频面试题(上篇)

文章目录 HDFS读流程和写流程HDFS读数据流程NameNode和Secondary NameNode工作机制FsimageEdits文件Seen_txidnamenode工作机制HA NameNode如何工作ZKFCHealthMonitorActiveStandbyElectorJouranlNode集群DataNode工作机制DataNode数据损坏压缩MapReduce工作流程MapTask工作流R…