其他 vector 操作详解(四十)

介绍

除去向 vector 添加元素(如 push_back)之外,vector 还提供了许多其他操作,这些操作大多与 string 的操作类似。通过掌握这些操作,我们可以方便地查询、修改和比较 vector 中的元素,从而构建灵活、高效的数据结构。下表总结了 vector 支持的一些常见操作:

操作说明
v.empty()如果 v 不包含任何元素,则返回 true;否则返回 false。
v.size()返回 v 中元素的个数,其返回值类型为 vector::size_type。
v.push_back(t)将值为 t 的元素添加到 v 的尾端。
v[n]返回 v 中第 n 个位置上元素的引用,下标从 0 开始。
v1 = v2用 v2 中元素的副本替换 v1 中原有的所有元素。
v1 = {a, b, c, ...}使用列表中元素的副本替换 v1 中原有的所有元素。
v1 == v2 / v1 != v2当且仅当两个 vector 的元素个数相同且对应位置的元素都相等时,v1 和 v2 才相等。
<, <=, >, >=按字典顺序比较两个 vector,规则与 string 相似:若两个 vector 在对应位置的元素全部相同,则元素较少者视为较小;否则以第一对不相同元素的比较结果为准。

下面我们依次介绍这些操作及其使用方法。

1. 查询与修改 vector 中的元素

1.1 empty() 与 size()

  • empty()
    检查 vector 是否为空。若 vector 没有任何元素,则返回 true,否则返回 false。

  • size()
    返回 vector 中当前元素的个数。返回类型通常为 vector::size_type,一般为无符号整型。

示例:

#include <iostream>
#include <vector>
using std::vector;
using std::cout;
using std::endl;int main() {vector<int> v;  // 默认初始化为空 vectorif (v.empty())cout << "v is empty." << endl;v.push_back(10);v.push_back(20);cout << "v size: " << v.size() << endl;  // 输出 v 的元素个数return 0;
}

1.2 访问元素:下标运算符 []

使用下标运算符([])可以随机访问 vector 中指定位置的元素。注意,下标从 0 开始。例如:

#include <iostream>
#include <vector>
using std::vector;
using std::cout;
using std::endl;int main() {vector<int> v = { 1, 2, 3, 4, 5 };cout << "The third element is: " << v[2] << endl; // 输出 3// 修改元素v[2] = v[2] * v[2]; // 将第三个元素改为其平方cout << "After modification, the third element is: " << v[2] << endl;return 0;
}

注意:
使用下标运算符时必须确保下标在合法范围内。如果访问不存在的元素(例如对空 vector 或超出范围的索引进行操作),将产生未定义行为,这可能引发缓冲区溢出问题。

2. 遍历 vector 元素

2.1 使用范围 for 语句

范围 for 语句可以用来遍历 vector 中的所有元素。对于只读操作,直接使用 auto 即可;若需要修改元素,必须使用引用:

只读遍历
#include <iostream>
#include <vector>
using std::vector;
using std::cout;
using std::endl;int main() {vector<int> v = {1, 2, 3, 4, 5};// 输出每个元素for (auto i : v) {cout << i << " ";}cout << endl;return 0;
}
修改元素
#include <iostream>
#include <vector>
using std::vector;
using std::cout;
using std::endl;int main() {vector<int> v = {1, 2, 3, 4, 5};// 将 vector 中每个元素乘以自身for (auto &i : v) {  // 注意:必须使用引用i *= i;}// 输出修改后的元素for (auto i : v) {cout << i << " ";}cout << endl;return 0;
}

3. vector 对象的比较操作

vector 支持相等性和关系运算符,这些运算符的语义与 string 类似:

  • == 和 !=
    两个 vector 相等当且仅当它们的元素个数相同且对应位置的元素都相等。
  • <, <=, >, >=
    按字典顺序比较两个 vector。如果两个 vector 在对应位置上元素完全相同,则较短的 vector 被认为较小;如果存在第一对不相同的元素,则比较该对元素的大小。

示例:

#include <iostream>
#include <vector>
using std::vector;
using std::cout;
using std::endl;int main() {vector<int> v1 = {1, 2, 3};vector<int> v2 = {1, 2, 3};vector<int> v3 = {1, 2, 4};if (v1 == v2)cout << "v1 and v2 are equal." << endl;if (v1 < v3)cout << "v1 is less than v3." << endl;return 0;
}

4. 赋值和替换

vector 支持赋值操作符,用于将一个 vector 的内容替换为另一个 vector 的元素副本:

#include <iostream>
#include <vector>
using std::vector;
using std::cout;
using std::endl;int main() {vector<int> v1 = {1, 2, 3};vector<int> v2 = {4, 5, 6};v1 = v2;  // v1 的元素全部被替换为 v2 的元素cout << "After assignment, v1: ";for (auto i : v1)cout << i << " ";cout << endl;return 0;
}

此外,也可以使用列表初始化对 vector 进行赋值(C++11 起支持):

#include <iostream>
#include <vector>
using std::vector;
using std::cout;
using std::endl;int main() {vector<int> v = {1, 2, 3};v = {7, 8, 9};  // 将 v 中的内容替换为 7, 8, 9 的副本cout << "After list-assignment, v: ";for (auto i : v)cout << i << " ";cout << endl;return 0;
}

5. 关于下标操作的警告

  • 下标运算符只能访问已存在的元素
    下标形式仅适用于访问或修改 vector 内已存在的元素,而不能用于添加元素。例如,下面的代码试图通过下标访问空 vector 的元素,将会导致错误:

    #include <vector>
    #include <iostream>
    using std::vector;
    using std::cout;
    using std::endl;int main() {vector<int> ivec;  // 空 vector// 下面的操作是错误的,因为 ivec 不包含任何元素cout << ivec[0];return 0;
    }
    
  • 添加元素必须使用 push_back 或类似成员函数
    正确的添加方式:

    for (int i = 0; i < 10; ++i)ivec.push_back(i);  // 依次添加元素
    

6. 总结

  • 常用操作:

    • empty()size() 用于检查 vector 是否为空及获取元素数量。
    • push_back(t) 用于在 vector 尾端添加一个新元素。
    • 下标运算符 v[n] 用于访问已存在的元素(注意:仅在保证索引合法时使用)。
    • 赋值操作符和列表初始化可用于替换 vector 中所有元素。
    • 相等性和关系运算符基于字典顺序比较 vector 中的元素。
  • 遍历与修改:

    • 使用范围 for 循环可以简洁地遍历 vector,但若在循环中修改容器大小(如 push_back),应避免使用范围 for。
    • 对于需要修改元素的操作,建议使用基于引用的范围 for。
  • 下标访问的注意事项:

    • 只能访问已存在的元素,不能用下标直接添加新元素。使用 push_back、insert 等成员函数来添加。

掌握 vector 的这些常用操作,不仅有助于更高效地管理动态数组,还能防止因错误访问元素而引起安全问题(例如缓冲区溢出)。希望这篇全面的讲解能帮助你在实际编程中熟练使用 vector。

参考资料

  • cppreference.com 关于 std::vector 的详细文档
  • 各大 C++ 编码规范(如 Google C++ Style Guide)中对容器操作的建议

通过对 vector 其他操作的全面解析,你可以更好地掌握如何查询、修改和比较 vector 中的元素,从而编写出既健壮又高效的 C++ 程序。

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

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

相关文章

【Leetcode 每日一题】368. 最大整除子集

问题背景 给你一个由 无重复 正整数组成的集合 n u m s nums nums&#xff0c;请你找出并返回其中最大的整除子集 a n s w e r answer answer&#xff0c;子集中每一元素对 ( a n s w e r [ i ] , a n s w e r [ j ] ) (answer[i], answer[j]) (answer[i],answer[j]) 都应当…

python基础-13-处理excel电子表格

文章目录 【README】【13】处理Excel电子表格【13.1】Excel文档【13.2】安装openpyxl模块【13.3】读取Excel文档【13.3.1】使用openpyxl模块打开excel文档【13.3.2】从工作簿取得工作表【13.3.3】从工作表sheet获取单元格cell【13.3.5】从表中获取行和列【13.3.6】工作簿、工作…

ABS函数c++

简介&#xff1a; abs 函数用于计算一个数的绝对值&#xff0c;在 C 中它继承自 C 语言的标准库&#xff0c;其历史可以追溯到早期的 C 语言发展历程&#xff0c;以下是详细介绍&#xff1a; 早期编程语言的需求 在计算机编程的早期阶段&#xff0c;处理数学运算就是一项基本…

闭环SOTA!北航DiffAD:基于扩散模型实现端到端自动驾驶「多任务闭环统一」

端到端自动驾驶目前是有望实现完全自动驾驶的一条有前景的途径。然而&#xff0c;现有的端到端自动驾驶系统通常采用主干网络与多任务头结合的方式&#xff0c;但是它们存在任务协调和系统复杂度高的问题。为此&#xff0c;本文提出了DiffAD&#xff0c;它统一了各种驾驶目标并…

整车CAN网络和CANoe

车载网络中主要包含有Can网络,Lin网络,FlexRay,Most,以太网。 500kbps:500波特率,表示的数据传输的速度。表示的是最大的网速传输速度。也就是每秒 500kb BodyCan车身Can InfoCan娱乐信息Can 车身CAN主要连接的是ESB电动安全带 ADB自适应远光灯等 PTCan动力Can 底盘Can

实战设计模式之迭代器模式

概述 与上一篇介绍的解释器模式一样&#xff0c;迭代器模式也是一种行为设计模式。它提供了一种方法来顺序访问一个聚合对象中的各个元素&#xff0c;而无需暴露该对象的内部表示。简而言之&#xff0c;迭代器模式允许我们遍历集合数据结构中的元素&#xff0c;而不必了解这些集…

JVM 垃圾回收器是如何判断一个对象是否要回收?

JVM 垃圾回收器&#xff08;Garbage Collector&#xff09;需要判断哪些对象是“垃圾”&#xff0c;即不再被程序使用的对象&#xff0c;以便回收它们占用的内存。JVM 主要使用以下两种方法来判断对象是否是垃圾&#xff1a; 1. 引用计数算法 (Reference Counting): 原理&…

kali——httrack

目录 前言 使用教程 前言 HTTrack 是一款运行于 Kali Linux 系统中的开源网站镜像工具&#xff0c;它能将网站的页面、图片、链接等资源完整地下载到本地&#xff0c;构建出一个和原网站结构相似的离线副本。 使用教程 apt install httrack //安装httrack工具 httrac…

kotlin函数类型

一 函数类型定义 1 定义 函数类型就是 (Int, Int) -> Int 函数类型其实就是将函数的 “参数类型” 和 “返回值类型” 抽象出来 2 示例 &#xff1a; (Int, Int) -> Int 表示接收两个 Int 参数并返回 Int 的函数类型&#xff1b; (String) -> Unit 表示接收 Strin…

C# Winform 入门(9)之如何封装并调用dll

封装dll 首先创建 .Net平台 类库 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace _09.Encapsulation_dll {public class Program{/// <summary>/// 求两个double类型的数值的和/// &l…

前后端分离下,Spring Boot 请求从发起到响应的完整执行流程

以下是前后端分离架构下&#xff0c;Spring Boot 请求从发起到响应的完整执行流程&#xff0c;结合你提出的所有问题&#xff0c;按真实执行顺序和职责链条重新整理所有核心概念、结构、关键类、数据转换点和典型代码示例&#xff1a; 一、前端发起请求&#xff08;步骤1-2&…

基于sklearn实现文本摘要思考

和各位小伙伴分享一下使用sklearn进行文本摘要的思考。 第一版本 原理 提取式文本摘要的基本原理是&#xff1a; 将文本分割成句子 计算每个句子的重要性(权重) 选择权重最高的几个句子组成摘要 常用的句子权重计算方法&#xff1a; TF-IDF&#xff1a;基于词频-逆文档频…

OpenHarmony子系统开发 - DFX(三)

OpenHarmony子系统开发 - DFX&#xff08;三&#xff09; 五、HiTraceMeter开发指导 HiTraceMeter概述 简介 HiTraceMeter在OpenHarmony中&#xff0c;为开发者提供业务流程调用链跟踪的维测接口。通过使用该接口所提供的功能&#xff0c;可以帮助开发者迅速获取指定业务流…

2025年 能够有效提升AI的生成质量和逻辑严谨性 的通用型系统提示

以下是三个经过精心设计的通用型系统提示&#xff08;System Prompt&#xff09;&#xff0c;能够有效提升AI的生成质量和逻辑严谨性&#xff0c;适用于各类对话、分析和创作场景&#xff1a; Prompt 1 - 专家级分步验证模式 你是一个具备跨领域知识整合能力的超级AI&#xff…

python爬虫:小程序逆向实战教程

根据我之前发表的文章&#xff0c;我们进行延伸实战https://blog.csdn.net/weixin_64809364/article/details/146981598?spm1001.2014.3001.5501 1. 想要爬取什么小程序&#xff0c;我们进行搜索 2. 找到我们vx小程序的文件地址&#xff0c;我们就可以进行破解 破解步骤强看…

C语言变长数组(VLA)详解:灵活处理动态数据的利器

引言 在C语言中&#xff0c;传统的数组大小必须在编译时确定&#xff0c;这限制了程序处理动态数据的灵活性。C99标准引入的变长数组&#xff08;Variable-Length Array, VLA&#xff09; 打破了这一限制&#xff0c;允许数组长度在运行时动态确定。本文将深入解析VLA的语法、…

串口数据转换为IP数据

串口数据转换为IP数据是一种常见的通信技术,用于将传统的串行设备(如传感器、控制器等)接入现代的IP网络。以下是详细介绍: 1. 转换原理 串口数据转换为IP数据的过程涉及硬件和软件的结合,核心是将串行数据封装为TCP/IP或UDP/IP数据包,通过网络传输。具体步骤如下: 硬…

client-go如何监听自定义资源

如何使用 client-go 监听自定义资源 在 Kubernetes 中使用 client-go 监听自定义资源&#xff08;Custom Resource&#xff0c;简称 CR&#xff09;需要借助 Dynamic Client 或 Custom Informer&#xff0c;因为 client-go 的标准 Clientset 只支持内置资源&#xff08;如 Pod…

C++软件开发架构

文章目录 1.全局消息通信MsgHandler.h单元测试(QTest)MsgHandlerUnitTest.hMsgHandlerUnitTest.cpp 2.实例间通信InstMsgHandler.h单元测试InstMsgHandlerUnitTest.hInstMsgHandlerUnitTest.cpp 1.全局消息通信 1. 适用于类与类单个对象实例之间的通信&#xff0c;多个对象需要…

AI Agent设计模式一:Chain

概念 &#xff1a;线性任务流设计 ✅ 优点&#xff1a;逻辑清晰易调试&#xff0c;适合线性处理流程❌ 缺点&#xff1a;缺乏动态分支能力 from typing import TypedDictfrom langgraph.graph import StateGraph, END# 定义后续用到的一些变量 class CustomState(TypedDict):p…