【C++】vector

`vector` 是一种容器,广泛存在于多种编程语言中,如 C++、Rust、Java 等。它是一种动态数组,可以存储任意类型的元素,并且可以根据需要自动调整大小。下面我将详细介绍 `vector` 的概念和使用方法,主要以 C++ 中的 `std::vector` 为例。

### 1. 概念

- **动态数组**:与静态数组不同,`vector` 可以在运行时改变其大小。当添加或移除元素时,`vector` 会根据需要自动调整内部存储。
- **连续内存**:`vector` 内部的元素是存储在一块连续的内存区域中的,这使得随机访问非常高效(O(1) 时间复杂度)。
- **随机访问**:由于元素存储在连续的内存块中,可以通过索引快速访问任何一个元素。
- **迭代器支持**:`vector` 支持标准库迭代器,可以方便地遍历元素。
- **容量与大小**:`vector` 有两个重要的属性,`size()` 表示当前已存储的元素数量,`capacity()` 表示分配的内存空间可以容纳的元素数量。容量通常大于或等于大小,以避免频繁的内存重新分配。

### 2. 基本操作

- **创建和初始化**:
  - 默认构造函数:`std::vector<int> vec;`
  - 初始化列表:`std::vector<int> vec = {1, 2, 3, 4};`
  - 指定大小和初始值:`std::vector<int> vec(5, 10); // 创建一个包含5个10的vector`

- **添加元素**:
  - `push_back(value)`:在 `vector` 的末尾添加一个元素。
  - `emplace_back(args...)`:直接在 `vector` 末尾构造一个新元素,避免了不必要的拷贝或移动。

- **移除元素**:
  - `pop_back()`:移除 `vector` 末尾的元素。
  - `erase(position)` 或 `erase(start, end)`:移除指定位置或范围内的元素。

- **访问元素**:
  - `operator[]`:通过索引访问元素,例如 `vec[0]`。
  - `at(index)`:安全地通过索引访问元素,如果索引超出范围则抛出 `out_of_range` 异常。
  - `front()` 和 `back()`:分别获取第一个和最后一个元素。

- **修改容量**:
  - `reserve(new_capacity)`:预先分配至少 `new_capacity` 大小的内存,不改变 `size()`。
  - `resize(new_size, value)`:调整 `vector` 的大小,用 `value` 填充新增加的元素。

- **清空**:
  - `clear()`:移除所有元素,但不会释放分配的内存,`capacity()` 不变。

- **交换**:
  - `swap(other_vector)`:与另一个 `vector` 交换内容。

- **比较**:
  - `==`, `!=`, `<`, `<=`, `>`, `>=`:用于比较两个 `vector` 的内容。

### 3. 性能考虑

- **插入和删除**:在 `vector` 的末端进行插入和删除操作的时间复杂度为 O(1),但在中间或开头进行这些操作的时间复杂度为 O(n),因为需要移动后续的元素。
- **内存管理**:`vector` 会在需要更多空间时自动增加容量,这可能会导致内存重新分配。为了优化性能,可以在创建 `vector` 时使用 `reserve` 函数来预先分配足够的内存。

### 4. 容器适配器

`vector` 还可以作为其他容器的基础,比如 `stack`(栈)、`queue`(队列)等,通过限制 `vector` 的某些接口来实现特定的数据结构。

### 5. 注意事项

- **线程安全**:C++ 标准库中的 `std::vector` 不是线程安全的,如果多个线程同时访问同一个 `vector`,需要自行实现同步机制。
- **异常安全性**:大多数 `vector` 的操作提供基本的异常保证,即如果操作抛出异常,`vector` 的状态不会被破坏,但是任何已经完成的操作仍然有效。

以上是对 `vector` 的基本介绍,具体到不同的编程语言,`vector` 的实现细节可能会有所不同。如果你有针对特定语言或者更深入的问题,欢迎继续提问。

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

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

相关文章

Vue3学习宝典

1.ref函数调用的方式生成响应式数据&#xff0c;可以传复杂和简单数据类型 <script setup> // reactive接收一个对象类型的数据 import { reactive } from vue;// ref用函数调用的方式生成响应式数据&#xff0c;可以传复杂和简单数据类型 import { ref } from vue // 简…

C++(4个类型转换)

1. C语言中的类型转换 1. 隐式 类型转换&#xff1a; 具有相近的类型才能进行互相转换&#xff0c;如&#xff1a;int,char,double都表示数值。 2. 强制类型转换&#xff1a;能隐式类型转换就能强制类型转换&#xff0c;隐式类型之间的转换类型强相关&#xff0c;强制类型转换…

《DSL-FIQA》论文翻译

《DSL-FIQA: Assessing Facial Image Quality Via Dual-Set Degradation Learning and Landmark-Guided Transformer》 原文链接&#xff1a;DSL-FIQA: Assessing Facial Image Quality via Dual-Set Degradation Learning and Landmark-Guided Transformer | IEEE Conference…

mac终端自定义命令打开vscode

1.打开终端配置文件 open -e ~/.bash_profile终端安装了zsh&#xff0c;那么配置文件是.zshrc&#xff08;打开zsh配置&#xff0c;这里举&#x1f330;使用zsh&#xff09; sudo open -e ~/.zshrc 2.在zshrc配置文件中添加新的脚本&#xff08;这里的code就是快捷命令可以进…

vue基础之6:计算属性、姓名案例、简写计算属性

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

Qt桌面应用开发 第十天(综合项目二 翻金币)

目录 1.主场景搭建 1.1重载绘制事件&#xff0c;绘制背景图和标题图片 1.2设置窗口标题&#xff0c;大小&#xff0c;图片 1.3退出按钮对应关闭窗口&#xff0c;连接信号 2.开始按钮创建 2.1封装MyPushButton类 2.2加载按钮上的图片 3.开始按钮跳跃效果 3.1按钮向上跳…

【从零开始的LeetCode-算法】35. 搜索插入位置

给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2示例 2: 输入: …

掌上单片机实验室 — RT - Thread+ROS2 浅尝(26)

前面化解了Micro_ROS通讯问题&#xff0c;并在 RT-Thread Studio 环境下&#xff0c;使用Micro_ROS软件包中的例程&#xff0c;实现了STM32F411CE核心板和ROS2主机的通讯。之后还尝试修改例程 micro_ros_sub_twist.c &#xff0c;实现了接收 turtle_teleop_key 所发出的 turtle…

展现运动类型

同样&#xff0c;我们通过函数的方式将运动类型插入我们的HTML代码中 _renderWorkout(workout) {let html <li class"workout workout-${workout.type}" data-id"${workout.id}"><h2 class"workout__title">${workout.description}…

vscode 怎么下载 vsix 文件?

参考&#xff1a;https://marketplace.visualstudio.com/items?itemNameMarsCode.marscode-extension 更好的办法&#xff1a;直接去相关插件的 github repo 下载老版本 https://github.com/VSCodeVim/Vim/releases?page5 或者&#xff0c;去 open-vsx.org 下载老版本 点击这…

python 练习题

目录 1&#xff0c;输入三个整数&#xff0c;按升序输出 2&#xff0c;输入年份及1-12月份&#xff0c;判断月份属于大月&#xff0c;小月&#xff0c;闰月&#xff0c;平月&#xff0c;并输出本月天数 3&#xff0c;输入一个整数&#xff0c;显示其所有是素数因子 4&#…

我的第一个创作纪念日 —— 梦开始的地方

前言 时光荏苒&#xff0c;转眼间&#xff0c;我已经在CSDN这片技术沃土上耕耘了365天 今天&#xff0c;我迎来了自己在CSDN的第1个创作纪念日&#xff0c;这个特殊的日子不仅是对我过去努力的肯定&#xff0c;更是对未来持续创作的激励 机缘 回想起初次接触CSDN&#xff0c;那…

Rook入门:打造云原生Ceph存储的全面学习路径(上)

文章目录 一.Rook简介二.Rook与Ceph架构2.1 Rook结构体系2.2 Rook包含组件2.3 Rook与kubernetes结合的架构图如下2.4 ceph特点2.5 ceph架构2.6 ceph组件 三.Rook部署Ceph集群3.1 部署条件3.2 获取rook最新版本3.3 rook资源文件目录结构3.4 部署Rook/CRD/Ceph集群3.5 查看rook部…

【Gitlab】CICD使用minio作为分布式缓存

1、安装minio 下载适合自己系统版本的安装文件https://dl.min.io/server/minio/release/windows-amd64/ yum install xxx.rpm 2、配置/etc/profile export MINIO_ACCESS_KEYroot [ui登录账号] export MINIO_SECRET_KEYminioDev001 [ui登录密码] export MINIO_OPTS"…

奇数求和ᅟᅠ

奇数求和 C语言代码C 代码Java代码Python代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 计算非负整数 m 到 n&#xff08;包括m 和 n &#xff09;之间的所有奇数的和&#xff0c;其中&#xff0c;m 不大于 n&#xff0c;且n 不大于30…

Django 视图层

from django.shortcuts import render, HttpResponse, redirectfrom django.http import JsonResponse1. render: 渲染模板 def index(request):print(reverse(index))return render(request, "index.html")return render(request, index.html, context{name: lisi})…

手机实时提取SIM卡打电话的信令声音-蓝牙电话如何适配eSIM卡的手机

手机实时提取SIM卡打电话的信令声音 --蓝牙电话如何适配eSIM卡的手机 一、前言 蓝牙电话的海外战略中&#xff0c;由于海外智能手机市场中政策的差异性&#xff0c;对内置eSIM卡的手机进行支持是非常合理的需求。Android系列手机中&#xff0c;无论是更换通信运营商&#xf…

python3 + selenium 中用PIL获取全屏幕截图

获取当前屏幕截图非常简单&#xff0c;需要import PIL.ImageGrab。调用grab函数即可得到Image对象&#xff0c;显示图片如图所示。 高版本的PIL中的grab函数还提供有一些参数。要查看当前PIL包的版本&#xff0c;可以import然后查看其__version__属性。 如果是较高版本的PIL…

SpringBoot3 + Vue3 由浅入深的交互 基础交互教学2

目录 一、这篇文章是基础交互教学系列的续作 二、发送请求时&#xff0c;携带发送的数据json格式的参数&#xff1a;data 三、携带token请求头&#xff0c;进行JWT校验 四、实现throw抛出异常&#xff0c;并交互显示在前端的界面 一、这篇文章是基础交互教学系列的续作 大…

UIE与ERNIE-Layout:智能视频问答任务初探

内容来自百度飞桨ai社区UIE与ERNIE-Layout&#xff1a;智能视频问答任务初探&#xff1a; 如有侵权&#xff0c;请联系删除 1 环境准备 In [2] # 安装依赖库 !pip install paddlenlp --upgrade !pip install paddleocr --upgrade !pip install paddlespeech --upgrade In …