Vector容器介绍

一、引言

在C++标准库中,vector是一个非常重要的容器,它提供了动态数组的功能。与静态数组不同,vector可以在运行时动态地增加或减少其大小。这使得vector在处理不确定数量的数据时变得非常有用。vector容器保证了元素的连续存储,因此可以高效地通过索引访问元素,并且提供了丰富的成员函数来操作容器中的数据。

二、Vector的基本概念

vector是一个模板类,它可以存储任何类型的元素,包括基本数据类型和自定义类型。在使用vector之前,需要包含头文件<vector>。vector的声明方式如下:

cpp
std::vector<T> vec;
其中,T表示存储在vector中的元素的类型。例如,std::vector<int>表示一个存储整数的vector。

三、Vector的常用操作

初始化
vector可以通过多种方式进行初始化,包括默认初始化、使用给定大小和初始值的初始化、使用迭代器进行初始化等。例如:

cpp
std::vector<int> vec1; // 默认初始化,空vector  
std::vector<int> vec2(10); // 初始化为大小为10的空vector  
std::vector<int> vec3(10, 42); // 初始化为大小为10且每个元素值为42的vector  
std::array<int, 5> arr = {1, 2, 3, 4, 5};  
std::vector<int> vec4(arr.begin(), arr.end()); // 使用迭代器进行初始化
访问元素
vector提供了多种方式来访问其中的元素,包括通过索引访问、使用迭代器访问等。例如:

cpp
std::vector<int> vec = {1, 2, 3, 4, 5};  
int first = vec[0]; // 通过索引访问第一个元素  
int last = vec.back(); // 访问最后一个元素  
int front = vec.front(); // 访问第一个元素(另一种方式)  
  
std::vector<int>::iterator it = vec.begin(); // 获取指向第一个元素的迭代器  
int second = *(it + 1); // 使用迭代器访问第二个元素
修改元素
vector提供了成员函数来修改其中的元素,包括通过索引修改、使用迭代器修改等。例如:

cpp
std::vector<int> vec = {1, 2, 3, 4, 5};  
vec[0] = 100; // 通过索引修改第一个元素为100  
  
std::vector<int>::iterator it = vec.begin();  
*(it + 1) = 200; // 使用迭代器修改第二个元素为200
添加元素
vector提供了多种方式来添加元素,包括在尾部添加、在指定位置插入等。例如:

cpp
std::vector<int> vec = {1, 2, 3};  
vec.push_back(4); // 在尾部添加一个元素4  
vec.insert(vec.begin() + 1, 5); // 在第二个位置插入一个元素5(索引从0开始)
删除元素
vector也提供了删除元素的方式,包括删除指定位置的元素、删除一定范围内的元素等。例如:

cpp
std::vector<int> vec = {1, 2, 3, 4, 5};  
vec.erase(vec.begin() + 1); // 删除第二个元素(索引从0开始)  
vec.erase(vec.begin() + 1, vec.begin() + 3); // 删除从第二个元素到第三个元素(不包括第三个元素)范围内的元素
查询元素
vector提供了一些函数来查询元素的存在性和位置,例如find()函数(需要包含<algorithm>头文件)和count()函数等。但请注意,这些函数并不是vector的成员函数,而是标准库提供的算法。例如:

cpp
std::vector<int> vec = {1, 2, 3, 4, 5};  
auto it = std::find(vec.begin(), vec.end(), 3); // 查找元素3的位置(返回指向该元素的迭代器)  
if (it != vec.end()) {  
    // 找到了元素3  
    std::cout << "Found element 3 at index: " << std::distance(vec.begin(), it) << std::endl;  
} else {  
    // 没有找到元素3  
    std::cout << "Element 3 not found." << std::endl;  
}  
  
int count = std::count(vec.begin(), vec.end(), 2); // 统计元素2出现的次数(返回次数)  
std::cout << "Element 2 appears " << count << " times." << std::endl;
其他常用成员函数
vector还提供了其他一些常用的成员函数,例如size()(返回容器中的元素数量)、empty()(检查容器是否为空)、clear()(清除容器中的所有元素)等。例如:

cpp
std::vector<int> vec = {1, 2, 3, 4, 5};  
std::cout << "Size of vector: " << vec.size() << std::endl; // 输出容器中的元素数量  
if (vec.empty()) {  
    std::cout << "Vector is empty." << std::endl; // 检查容器是否为空(此例中不会输出)  
} else {  
    std::cout << "Vector is not empty." << std::endl; // 输出容器非空的信息(此例中会输出)  
}  
vec.clear(); // 清除容器中的所有元素(此后容器变为空)
四、Vector的性能特点

连续存储:vector保证元素在内存中的连续存储,这使得通过索引访问元素变得非常高效。同时,连续存储也有利于利用空间局部性原理提高缓存命中率。
动态扩容:当向vector中添加元素时,如果当前容量不足以容纳新元素,vector会自动进行扩容。扩容时,vector通常会分配更大的内存空间,并将原有元素复制到新分配的内存中。这个过程可能会导致一定的性能开销,因此在已知元素数量的情况下,预先指定vector的大小可以提高性能。然而,需要注意的是,频繁地扩容和复制操作可能会影响性能,特别是在处理大量数据时。为了避免这种情况,可以考虑使用其他容器(如list或deque),或者在插入大量元素之前预先调用reserve()函数来预留足够的空间。
随机访问迭代器:vector提供了随机访问迭代器,可以在常数时间内访问和修改容器中的任意元素。这使得vector在处理需要随机访问元素的问题时具有很高的效率。
插入和删除操作的开销:在vector的中间位置插入或删除元素可能会导致较大的性能开销,因为需要进行元素的移动操作。特别是在容器较大时,这种开销可能会更加明显。因此,在处理需要频繁插入和删除元素的问题时,可能需要考虑使用其他容器(如list或set)。然而,在尾部插入和删除元素的开销是常数时间复杂度的,这使得vector在处理这类问题时仍然具有很高的效率。
五、总结与展望

vector作为C++标准库中的一个重要容器,提供了动态数组的功能和丰富的操作接口。它具有连续存储、动态扩容、随机访问迭代器等特点,使得在处理不确定数量的数据时变得非常有用。然而,也需要注意到vector在某些情况下的性能开销,特别是在频繁扩容和中间插入删除元素时。在实际应用中,应根据问题的具体需求和性能要求选择合适的容器。随着C++标准库的不断发展和完善,我们可以期待更多高效、灵活的容器类被引入,以满足不同场景下的数据处理需求。

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

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

相关文章

浅谈 Linux 网络编程 - Server 端模型、sockaddr、sockaddr_in 结构体

文章目录 前言前置知识Server 端核心模型 【重点】相关函数 【重点】socket 函数bind 函数listen 函数accept 函数close 函数 sockaddr 数据结构 【重点】 前言 本文主要是对 Linux 网络编程中&#xff0c;Server 端的模型、相关函数 以及 sockaddr、sockaddr_in 结构体做介绍…

图片压缩上传实例

前台图片上传压缩是一种常见的需求&#xff0c;可以通过前端技术实现图片的压缩&#xff0c;减小图片的大小&#xff0c;提高页面加载速度。以下是一个前台图片上传压缩的实例&#xff1a; 首先&#xff0c;在前端页面中添加一个文件上传的input标签&#xff1a; <input ty…

黑马程序员——接口测试——day05——Request库、Cookie、Session、UnitTest框架

目录&#xff1a; Requests库 Requests库安装和简介设置http请求语法应用案例 案例1案例2案例3案例4Cookie Cookie简介CookieSession认证方式案例5-看演示&#xff0c;此代码不需实现Session Session简介Session自动管理Cookie案例6面试题Cookie和Session区别获取指定响应数据…

Codeforces Round 929 (Div. 3)

A. 全部负数处理到前面&#xff0c;全部都能变成正数 // Problem: A. Turtle Puzzle: Rearrange and Negate // Contest: Codeforces - Codeforces Round 929 (Div. 3) // URL: https://codeforces.com/contest/1933/problem/A // Memory Limit: 256 MB // Time Limit: 2000 …

300分钟吃透分布式缓存(拉钩教育总结)

开篇寄语 开篇寄语&#xff1a;缓存&#xff0c;你真的用对了吗&#xff1f; 你好&#xff0c;我是你的缓存老师陈波&#xff0c;可能大家对我的网名 fishermen 会更熟悉。 我是资深老码农一枚&#xff0c;经历了新浪微博从起步到当前月活数亿用户的大型互联网系统的技术演进…

Linux|centos7|yum和编译安装ImageMagick记录

一&#xff0c; yum安装imagemagick imagemagick这个软件是图像文件的处理神器&#xff0c;可以文字转图像以及图像的剪辑等等工作&#xff0c;也是配合人工智能工程的不可或缺的工具&#xff0c;具体的用处和特点就不在这里废话了&#xff0c;有兴趣的百度就行了 本次是在…

SpringBoot底层原理

SpringBoot底层原理 一 配置优先级 1.配置方式 Springboot中支持三种配置方式&#xff0c;分别为&#xff1a; application.propertiesapplication.ymlapplication.yaml 2.配置优先级 当存在多份配置文件时&#xff0c;配置文件会按照它们的优先级生效。 优先级从高到底…

Linux中df和du命令

当涉及到在Linux系统中管理磁盘空间时&#xff0c;df和du命令是非常有用的工具。除了基本用法外&#xff0c;它们还具有一些高级用法&#xff0c;可以提供更详细和定制化的磁盘信息。下面是Linux中df和du命令的十个常用的高级用法&#xff0c;附带相应的代码和输出。 df -i - 显…

欧盟网络安全产业分析

文章目录 前言一、欧盟网络安全战略历程二、欧盟网络安全政策法规2.1 《电子识别和信任服务条例》2.2 《支付服务指令(第二版)》2.3 NIS 指令系列三.欧盟主要的网络安全机构3.1 ENISA3.2 欧盟委员会3.3 欧洲数据保护委员会3.4 欧盟成员国自设的网络安全机构四、欧盟网络安全…

蓝桥杯-灌溉

参考了大佬的解题思路&#xff0c;先遍历一次花园&#xff0c;找到所有的水源坐标&#xff0c;把它们存入 “水源坐标清单” 数组内&#xff0c;再读取数组里的水源坐标进行扩散。 #include <iostream> using namespace std; int main() {int n,m,t,r,c,k,ans0,list_i0;…

c# aes加密解密私钥公钥通钥

using System.Security.Cryptography; using System.Text; namespace EncryptTest { internal class Program { static void Main(string[] args) { Console.WriteLine("Hello, World!"); string 密 EncryptAESBASE64("你…

(每日持续更新)jdk api之OutputStreamWriter基础、应用、实战

博主18年的互联网软件开发经验&#xff0c;从一名程序员小白逐步成为了一名架构师&#xff0c;我想通过平台将经验分享给大家&#xff0c;因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验&#xff0c;晚上进行用心精简、整理、总结、定稿&…

c++ for 循环语句

循环语句 在C中&#xff0c;有几种循环语句可用于重复执行一段代码&#xff0c;直到满足指定条件为止&#xff0c;主要有 for 循环、while 循环、do-while 循环三种循环语句。三者区别&#xff1a; 循环类型特点for 循环1. 适用于已知循环次数的情况&#xff0c;循环次数事先…

教师资格证相关

文章目录&#xff1a; 一&#xff1a;考试时间 二&#xff1a;考试科目 三&#xff1a;相关网站 四&#xff1a;相关 一&#xff1a;考试时间 教资 笔试 面试笔试报名笔试考试笔试公布面试报名面试时间面试公布上半年1月14日3月12日4月15日4月…

推荐系统经典模型YouTubeDNN代码

文章目录 前言数据预处理部分模型训练预测部分总结与问答 前言 上一篇讲到过YouTubeDNN论文部分内容&#xff0c;但是没有代码部分。最近网上教学视频里看到一段关于YouTubeDNN召回算法的代码&#xff0c;现在我分享一下给大家参考看一下&#xff0c;并附上一些我对代码的理解…

一张图读懂人工智能

一、生成人工智能的概念和应用&#xff0c;以及如何使用大型语言模型进行聊天和创造原创内容。这项技术将会对人类和企业产生深远影响。 计算机获得学习、思考和交流的能力&#xff0c;被称为生成人工智能。生成人工智能可以立即获得人类所有知识的总和&#xff0c;并回答任何…

go语言基础 -- map的定义与使用

map的定义与使用 map声明基础语法map的基本使用map的遍历map切片map排序 map声明基础语法 // map的声明 var xxx_map map[key_type]value_typemap的key可以是基本数据类型&#xff0c;channel&#xff0c;接口&#xff0c;结构体&#xff0c;数组&#xff0c;但不能是slice&am…

leetcode刷题(剑指offer) 47.全排列Ⅱ

47.全排列Ⅱ 给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序 返回所有不重复的全排列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,2] 输出&#xff1a; [[1,1,2],[1,2,1],[2,1,1]]示例 2&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[…

c#委托、lambda、事件

Lambda Lambda表达式是一种匿名函数&#xff0c;Lambda表达式通常以箭头“>”分隔左侧的输入和右侧的输出。 (parameter_list) > { statement_block } parameter_list 是由一个或多个参数组成的逗号分隔列表&#xff0c;每个参数都包括类型和名称&#xff0c;可以为空。…

综合实战(volume and Compose)

"让我&#xff0c;重获新生~" MySQL 灾难恢复 熟练掌握挂载卷的使用&#xff0c;将Mysql的业务数据存储在 外部。 实战思想: 使用 MySQL 5.7 的镜像创建容器并创建一个普通数据卷 "mysql-data"用来保存容器中产生的数据。我们需要容器连接到Mysql服务&a…