当前位置: 首页 > news >正文

C++ 标准库 std::vector 的介绍

std::vector 是 C++ 标准库中的一个动态数组容器,它提供了多种成员函数来管理其内部存储的元素。以下是一些常用的 std::vector 成员函数的介绍:

构造函数和析构函数

  • vector(): 默认构造函数。
  • vector(size_type n): 构造一个包含 n 个元素的向量,每个元素都进行值初始化。
  • vector(size_type n, const value_type& val): 构造一个包含 n 个元素的向量,每个元素都被初始化为 val
  • vector(const vector& other): 复制构造函数。
  • vector(vector&& other): 移动构造函数。
  • ~vector(): 析构函数。

容量相关函数

  • size(): 返回向量中元素的数量。
  • capacity(): 返回当前分配的存储空间能够容纳的元素数量。
  • empty(): 检查向量是否为空。
  • reserve(size_type n): 为向量分配至少能够容纳 n 个元素的空间。
  • shrink_to_fit(): 释放不需要的内存以匹配当前大小。

元素访问

  • operator[]: 返回指定位置元素的引用。
  • at(size_type n): 返回指定位置元素的引用,并提供边界检查。
  • front(): 返回第一个元素的引用。
  • back(): 返回最后一个元素的引用。

修改器

  • assign(size_type n, const value_type& val): 将向量中的所有元素替换为 n 个 val
  • push_back(const value_type& val): 在向量的末尾添加一个元素。
  • pop_back(): 删除向量末尾的元素。
  • insert(const_iterator pos, const value_type& val): 在指定位置插入一个元素。
  • erase(const_iterator pos): 删除指定位置的元素。
  • erase(const_iterator first, const_iterator last): 删除指定范围内的元素。
  • clear(): 清空向量的所有元素。
  • swap(vector& other): 交换两个向量的数据。

迭代器

  • begin(): 返回指向向量第一个元素的迭代器。
  • end(): 返回指向向量最后一个元素之后位置的迭代器。
  • rbegin(): 返回指向向量最后一个元素的逆向迭代器。
  • rend(): 返回指向向量第一个元素之前位置的逆向迭代器。

非成员函数

  • std::swap(vector& a, vector& b): 交换两个向量的数据(非成员函数)。
  • operator==operator!=operator<operator<=operator>operator>=: 比较两个向量的内容。

这些函数提供了对 std::vector 的基本操作,使得 std::vector 成为 C++ 中非常灵活和强大的容器之一。使用这些函数时,应该注意它们可能带来的性能影响,尤其是在涉及大量元素的操作时。

尤其成员函数 swap

在 C++ 中,std::vector 提供了一个成员函数 swap,它可以用来交换两个 std::vector 容器的内容。这个函数是非常高效的,因为它在大多数情况下不需要实际复制元素,而是交换两个向量的内部数据结构,从而在常数时间内完成操作。

以下是 std::vector 的 swap 函数的原型:

void swap(vector& other);

这里是如何使用 swap 函数的一个例子:

#include <vector>
#include <iostream>int main() {std::vector<int> vec1 = {1, 2, 3, 4, 5};std::vector<int> vec2 = {10, 20, 30, 40, 50};// 交换 vec1 和 vec2 的内容vec1.swap(vec2);// 输出交换后的向量内容std::cout << "vec1: ";for (int num : vec1) {std::cout << num << ' ';}std::cout << "\nvec2: ";for (int num : vec2) {std::cout << num << ' ';}return 0;
}

在上面的例子中,vec1 和 vec2 的内容在调用 swap 后被交换。输出将会是:

vec1: 10 20 30 40 50
vec2: 1 2 3 4 5

swap 函数的几个应用场景包括:

  1. 快速“清除”向量:通过将向量与一个空的临时向量交换,可以快速“清除”向量的内容,而不需要逐个删除元素。

    std::vector<int>().swap(vec);
    

    这行代码将 vec 的内容交换到一个临时的空向量中,从而清空 vec

  2. 减少不必要的内存分配:如果你知道一个 std::vector 将要存储更多的元素,并且你想要避免因为元素增加而导致的多次内存分配,可以先创建一个足够大的临时向量,然后与原向量交换。

    std::vector<int> largeVec(size);
    vec.swap(largeVec);
    
  3. 在函数中返回大量数据:为了避免大量数据的复制,可以使用 swap 来返回一个局部向量。

    std::vector<int> getLargeData() {std::vector<int> localVec = /* ... 初始化 ... */;// ...return localVec; // 使用移动语义来避免复制
    }
    // 调用函数时
    std::vector<int> data = getLargeData();
    

        在 C++11 及以后的版本中,返回局部对象时,编译器会自动应用移动语义,从而避免复制。在这种情况下,即使不显式使用 swap,也能获得高效的性能。

相关文章:

C++ 标准库 std::vector 的介绍

std::vector 是 C 标准库中的一个动态数组容器&#xff0c;它提供了多种成员函数来管理其内部存储的元素。以下是一些常用的 std::vector 成员函数的介绍&#xff1a; 构造函数和析构函数 vector(): 默认构造函数。vector(size_type n): 构造一个包含 n 个元素的向量&#xf…...

鸿蒙开发-装饰器@Link问题

正常示例 class Parent {public count: number;constructor( count: number) {this.count count;} } Entry Component struct TestPage {State parent: Parent new Parent( 11)build() {Column() {SubComponent({ parent: this.parent })}.height(100%)} } Component struct…...

CTFhub靶场RCE学习

靶场 eval执行 <?php if (isset($_REQUEST[cmd])) {eval($_REQUEST["cmd"]); } else {highlight_file(__FILE__); } ?> PHP代码显示&#xff0c;要求将命令赋值给cmd然后执行 先查看一下根目录文件 ?cmdsystem("ls");&#xff01;切记最后的分…...

一文3000字从0到1带你进行Mock测试(建议收藏)

​什么是mock&#xff1f; ​mock测试是以可控的方式模拟真实的对象行为。程序员通常创造模拟对象来测试对象本身该具备的行为&#xff0c;很类似汽车设计者使用碰撞测试假人来模拟车辆碰撞中人的动态行为 为什么要使用Mock&#xff1f; 之所以使用mock测试&#xff0c;是因…...

数据结构 ——— 链式二叉树的销毁(释放)

目录 链式二叉树示意图 手搓一个链式二叉树 代码实现 示意图 手搓一个链式二叉树 代码演示&#xff1a; // 数据类型 typedef int BTDataType;// 二叉树节点的结构 typedef struct BinaryTreeNode {BTDataType data; //每个节点的数据struct BinaryTreeNode* left; //指向…...

log4j异常堆栈文件输出

目的&#xff1a;log4j异常堆栈关联到traceId一句话中&#xff0c;方便搜索 1、获取堆栈后一起打印 private void logException(Throwable t, ProceedingJoinPoint joinPoint) {if (this.printErrorStackSys) {StringWriter sw new StringWriter();PrintWriter pw new Print…...

在配置环境变量之后使用Maven报错 : mvn : 无法将“mvn”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

最近&#xff0c;我在 Windows 系统上安装和配置 Apache Maven 时遇到了一些问题&#xff0c;想在此记录下我的解决历程&#xff0c;希望对遇到类似问题的朋友有所帮助。 问题描述 我下载了 Maven 并按照常规步骤配置了相关的环境变量。然而&#xff0c;在 PowerShell 中输入…...

SpringSecurity源码中核心类

SpringSecurity源码 第一部分 核心类 SecurityBuilderHttpSecurityWebSecuritySecurityFilterChainFilterChainProxy SecurityBuilder是安全构架器&#xff0c;HttpSecurity和WebSecurity都是SecurityBuilder的实现类&#xff0c;HttpSecurity通过build()构建了一个Security…...

【JAVA】使用IDEA创建maven聚合项目

【JAVA】使用IDEA创建maven聚合项目 1.效果图 2.创建父模块项目 2.1删除父模块下面的src目录以及不需要的maven依赖 3创建子模块项目 3.1右击父模块项目选择Module… 3.2创建子模块 3.3删除子模块下不需要的maven依赖 4.子模块创建完成后引入SpringBoot依赖启动项目...

猿创征文|Inscode桌面IDE:打造高效开发新体验

猿创征文&#xff5c;Inscode桌面IDE&#xff1a;打造高效开发新体验 引言 在当今快速发展的软件开发领域&#xff0c;一个高效、易用的集成开发环境&#xff08;IDE&#xff09;是每个开发者必不可少的工具。Inscode 桌面 IDE 作为一款新兴的开发工具&#xff0c;凭借其强大…...

概率论中的PMF、PDF和CDF

在概率论中&#xff0c;PMF&#xff08;概率质量函数&#xff09;、PDF&#xff08;概率密度函数&#xff09;和CDF&#xff08;累积分布函数&#xff09;是描述随机变量分布的三个重要概念。它们分别用于不同类型的随机变量&#xff0c;并帮助我们理解随机事件的概率特性。本文…...

Vue 简单入手

前端工程化&#xff08;Front-end Engineering&#xff09;指的是在前端开发中&#xff0c;通过一系列工具、流程和规范的整合&#xff0c;以提高开发效率、代码质量和可维护性的一种技术和实践方法。其核心目的是使得前端开发变得更高效、可扩展和可维护。 文章目录 一、Vue 项…...

Github配置ssh key原理及操作步骤

文章目录 配置SSH第一步&#xff1a;检查本地主机是否已经存在ssh key第二步&#xff1a;生成ssh key第三步&#xff1a;获取ssh key公钥内容第四步&#xff1a;Github账号上添加公钥第五步&#xff1a;验证是否设置成功验证原理 往github上push项目的时候&#xff0c;如果走ht…...

大循环引起CPU负载过高

一、问题背景 环境&#xff1a;jdk1.8 tomcat7 在一次发布时&#xff0c;cpu出现负载过高&#xff0c;其负载突破200%&#xff0c;并且响应时间也大幅度超时。 二、问题分析 【1】发布前做过压测&#xff0c;并没有发现cpu异常升高的现象&#xff0c;所以其可能与生产环境的请…...

[Java]微服务治理

注册中心原理 注册中心可以统一管理项目中的所有服务 服务治理中的三个角色分别是什么? 服务提供者: 暴露服务接口&#xff0c;供其它服务调用服务消费者: 调用其它服务提供的接口注册中心: 记录并监控微服务各实例状态&#xff0c;推送服务变更信息 消费者如何知道提供者的…...

深入解析C语言中的extern关键字:语法、工作原理与高级应用技巧

引言 在C语言中&#xff0c;extern 关键字是一个强大的工具&#xff0c;用于声明外部变量和函数&#xff0c;使得这些变量和函数可以在多个源文件之间共享。理解 extern 的工作原理和最佳实践对于编写模块化、可维护的代码至关重要。本文将深入探讨 extern 关键字的各个方面&a…...

元器件封装

元器件封装类型 为什么越来越多用贴片元件&#xff0c;而不是插件元件 为什么越来越多用贴片元件&#xff0c;而不是插件元件 1.体积小、质量小、容易保存和运输&#xff1b; 2.容易焊接和拆卸。抗震效果好。 贴片元件不用过孔&#xff0c;用锡少。直插元件最麻烦的就是拆卸&a…...

状态空间方程离散化(Matlab符号函数)卡尔曼

// 卡尔曼滤波(4)&#xff1a;扩展卡尔曼滤波 - 知乎 // // matlab 连续系统状态空间表达式的离散化&状态转移矩阵求解_matlab状态方程离散化-CSDN博客 // // // %https://blog.csdn.net/weixin_44051006/article/details/107007916 clear all; clc; syms R1 R2 C1 C…...

软件设计师-计算机网络

OSI网络模型 物理层&#xff0c;提供原始物理通路。数据交换的单位是二进制&#xff0c;bit,比特流&#xff0c;设备有中继器&#xff0c;集线器数据连输层&#xff0c;把原始不可靠的物理层链接变成无差错的数据通道&#xff0c;并解决多用户竞争问题。传送单位是帧&#xff…...

SpringBoot操作Elasticsearch

SpringBoot操作Elasticsearch SpringData框架简化Java代码连接ES的过程 官网&#xff1a;https://spring.io/projects/spring-data/ 以上列表中都是Spring Data支持连接的数据源 添加依赖 已经添加过了 <!--添加SpringDataES的依赖--><dependency><groupId&…...

即插即用系列 | TGRS 2026 | CGTA:曲率引导标记注意力!线性复杂度全局建模,几何结构保真与长程关联双突破 | 代码分享

0. 前言 本文介绍了CGTA曲率引导标记注意力模块&#xff0c;其通过曲率感知的标记选择策略与全局稀疏注意力机制&#xff0c;首次在遥感图像超分辨率领域实现对细长曲线结构与重复纹理的高保真重建&#xff0c;有效破解了传统注意力机制在处理曲线拓扑时容易产生锯齿边缘与结构…...

TransCAD新手必看:如何用表格链接快速创建矩阵OD并生成期望线(附详细步骤图)

TransCAD实战指南&#xff1a;从表格链接到期望线可视化的全流程解析 引言 在交通规划与空间分析领域&#xff0c;TransCAD作为一款专业的GIS软件&#xff0c;其强大的数据处理和可视化能力一直备受推崇。对于初学者而言&#xff0c;掌握表格链接创建矩阵OD并生成期望线的技巧&…...

【实验原理深度解析】弗兰克-赫兹实验:如何用电子“碰撞”揭示原子能级的秘密

1. 电子与原子的"对话"&#xff1a;弗兰克-赫兹实验的设计哲学 想象你站在一个漆黑的房间里&#xff0c;向对面墙壁投掷网球。如果墙壁是实心的&#xff0c;球会直接弹回&#xff1b;但如果墙上有一排高度不同的窗口&#xff0c;球只有达到特定速度才能穿过对应高度的…...

YimMenu完全指南:GTA5免费辅助工具从入门到精通

YimMenu完全指南&#xff1a;GTA5免费辅助工具从入门到精通 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMenu …...

ClickHouse连接避坑指南:Python开发者常遇到的5个问题及解决方案

ClickHouse连接避坑指南&#xff1a;Python开发者常遇到的5个问题及解决方案 当Python开发者初次尝试与ClickHouse建立连接时&#xff0c;往往会遇到各种意料之外的障碍。这些看似简单的连接问题&#xff0c;实际上可能隐藏着深层次的配置陷阱或性能瓶颈。本文将深入剖析五个最…...

从检测到分析:手机位置热力图生成与行为模式挖掘扩展方案

从检测到分析&#xff1a;手机位置热力图生成与行为模式挖掘扩展方案 1. 引言&#xff1a;从“看见”到“看懂” 想象一下&#xff0c;你在一间大型会议室里&#xff0c;墙上挂着十几个监控摄像头。传统的监控系统能告诉你“画面里有手机”&#xff0c;但仅此而已。你无法知道…...

大模型部署成本优化:面向测试从业者的云服务省钱技巧

随着大模型在自动化测试、缺陷智能分析、测试用例生成等领域的应用日益深入&#xff0c;其部署与调用成本已成为测试团队必须面对的核心挑战。高昂的GPU算力费用、未被充分利用的资源以及复杂的定价模型&#xff0c;都可能使技术创新的预算捉襟见肘。一、理解成本构成&#xff…...

一站式融合赋能,企业级私有化视频会议系统EasyDSS助力企业培训全流程闭环管理

传统企业培训往往面临诸多痛点&#xff0c;线下培训受地域、时间限制&#xff0c;直播培训错过即无&#xff0c;核心内容无法有效沉淀&#xff0c;会议、直播、点播多平台切换&#xff0c;操作繁琐效率低&#xff0c;EasyDSS企业级私有化视频会议系统&#xff0c;打破单一功能局…...

比特币钱包密码与助记词恢复实战指南:6大核心模块掌握btcrecover全功能

比特币钱包密码与助记词恢复实战指南&#xff1a;6大核心模块掌握btcrecover全功能 【免费下载链接】btcrecover An open source Bitcoin wallet password and seed recovery tool designed for the case where you already know most of your password/seed, but need assista…...

如何通过自动化硬件适配技术突破Hackintosh配置瓶颈:OpCore Simplify技术深度解析

如何通过自动化硬件适配技术突破Hackintosh配置瓶颈&#xff1a;OpCore Simplify技术深度解析 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 在开源系…...