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

vector与list的简单介绍

1. 标准库中的vector类的介绍:

vector是表示大小可以变化的数组的序列容器。

就像数组一样,vector对其元素使用连续的存储位置,这意味着也可以使用指向其元素的常规指针上的偏移量来访问其元素,并且与数组中的元素一样高效。但与数组不同的是,它们的大小可以动态变化,它们的存储由容器自动处理。

在内部,vector使用动态分配的数组来存储其元素。当插入新元素时,可能需要重新分配此数组才能增大大小,这意味着分配一个新数组并将所有元素移动到该数组。就处理时间而言,这是一项相对昂贵的任务,因此,每次将元素添加到容器时,vector都不会重新分配。

相反,vector容器可能会分配一些额外的存储来适应可能的增长,因此容器的实际容量可能大于包含其元素(即其大小)严格需要的存储。库可以实施不同的增长策略,以平衡内存使用和重新分配之间的平衡,但无论如何,重新分配应该只在大小的对数增长间隔下发生,以便在vector末尾插入单个元素时可以提供摊销的恒定时间复杂度(参见push_back)。

因此,与数组相比,vector消耗更多的内存,以换取以有效的方式管理存储和动态增长的能力。

与其他动态序列容器(deques、lists 和 forward_lists)相比,vector非常有效地访问其元素(就像数组一样),并且相对有效地从其末端添加或删除元素。对于涉及在末尾以外的位置插入或删除元素的操作,它们的性能比其他操作差,并且迭代器和引用的一致性低于列表和forward_lists。

这么多话,简单的来说vector帮我们构建了c语言中的数组,但与c语言数组相比较而言,他的效率与使用起来远远大于数组。

本篇文章就不再详细向上篇文章string的介绍了,这里只给几个经常用到的几个功能的使用案例与其简单的实现;

构造函数

我们知道数组有分很多种

比如如下我们构建整形数组与字符数组: 

#include<iostream>
#include<vector>
using namespace std;
int main()
{vector<int> v;//整形数组vector<char> v;//字符数组vector<double> v;//小数数组return 0;
}

对于vector有多种构造 

我们挨个展示使用案例:

#include<iostream>
#include<vector>
using namespace std;
int main()
{vector<int> first;                                // 空vector<int> second(4, 100);                       // 4个100vector<int> third(second.begin(), second.end());  // 用second创建,里面存的值与second相同vector<int> fourth(third);                       // a copy of thirdint myints[] = { 16,2,77,29 };vector<int> fifth(myints, myints + sizeof(myints) / sizeof(int));//利用数组构造//挨个打印cout << "first:";for (auto e : first){cout << e << " ";}cout << endl;cout << "second:";for (auto e : second){cout << e << " ";}cout << endl;cout << "third:";for (auto e : third){cout << e << " ";}cout << endl;cout << "fourth:";for (auto e : fourth){cout << e << " ";}cout << endl;cout << "The contents of fifth are:";for (vector<int>::iterator it = fifth.begin(); it != fifth.end(); ++it)cout << ' ' << *it;cout << '\n';return 0;
}

迭代器:

vector的迭代器与string的迭代器完全相关,不太清楚的,可以去看我写的string那一篇,那一篇从原理详细讲解了迭代器;

就比如我们使用迭代器打印上面的second

#include<iostream>
#include<vector>
using namespace std;
int main()
{vector<int> second(4, 100);                       // 4个100vector<int>::iterator it = second.begin();while (it != second.end()){cout << *it << " ";it++;}return 0;
}

同样也有反向的,这里便于观察,我们将second换一组值 

#include<iostream>
#include<vector>
using namespace std;
int main()
{int myints[] = { 16,2,77,29 };vector<int> fifth(myints, myints + sizeof(myints) / sizeof(int));//利用数组构造vector<int>::reverse_iterator it = fifth.rbegin();while (it != fifth.rend()){cout << *it << " ";it++;}return 0;
}

最常用的几个:push_back,pop_back,size,empty,clear

#include<iostream>
#include<vector>
using namespace std;
int main()
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);cout << "添加完后vector:";for (auto& e : v){cout << e << " ";e++;}cout << endl;cout << "vector的大小:";cout << v.size() << endl;v.pop_back();cout << "后删完后vector:";for (auto& e : v){cout << e << " ";e++;}cout << endl;cout << "vector是否为空:";cout << v.empty() << endl;//为空返回true,反之falsecout << "clear后:";v.clear();//清空for (auto& e : v){cout << e << " ";e++;}cout << endl;return 0;
}

查找与修改

vector同样与string一样支持这些功能

就比如查找我们可以通过find查找特定的值,也可以通过直接下标operator[]任意访问

 find

#include<iostream>
#include<vector>
using namespace std;
int main()
{vector<int> t;t.push_back(1);t.push_back(2);t.push_back(3);t.pop_back();vector<int> ::iterator pos = find(t.begin(), t.end(), 2);cout << *pos << endl;
}

运行结果:             

 insert

#include<iostream>
#include<vector>
using namespace std;
int main()
{vector<int> t;t.push_back(1);t.push_back(2);t.push_back(3);vector<int> ::iterator pos = find(t.begin(), t.end(), 2);t.insert(pos,10);for (auto& e : t){cout << e << " ";e++;}
}

运行结果:             

 erase

#include<iostream>
#include<vector>
using namespace std;
int main()
{vector<int> t;t.push_back(1);t.push_back(2);t.push_back(3);vector<int> ::iterator pos = find(t.begin(), t.end(), 2);t.erase(pos);for (auto& e : t){cout << e << " ";e++;}
}

运行结果:             

 swap

#include<iostream>
#include<vector>
using namespace std;
int main()
{vector<int> t;t.push_back(1);t.push_back(2);t.push_back(3);vector<int> ::iterator pos = find(t.begin(), t.end(), 2);vector<int> v(5, 7);//5个7swap(t, v);cout << "换后的t:" << "  ";for (auto& e : t){cout << e << " ";e++;}cout << endl;cout << "换后的v:" << "  ";for (auto& e : v){cout << e << " ";e++;}cout << endl;
}

运行结果:

operator[] 

#include<iostream>
#include<vector>
using namespace std;
int main()
{vector<int> t;t.push_back(1);t.push_back(2);t.push_back(3);vector<int> ::iterator pos = find(t.begin(), t.end(), 2);cout << t[2];
}

运行代码:

 其实到这里vector常用的功能已经说完了,

list对于官方的介绍其实很简单,其实就是一句话就可以概括,带头的双向循环链表;

用法与vector差不多完完全全一样,这里就不在多介绍了,给大家推荐一篇好的文章把

STL详解(五)—— list的介绍及使用_stl的list-CSDN博客

STL详解(六)—— list的模拟实现_stl list 作为参数-CSDN博客

如果要自己实现vector与list的模拟实现,需要注意的一点就是深拷贝的问题;

接下来我会再写几篇文章介绍string与vector与list一些特殊的小点帮助理解;

就比如说string的''\0''问题,string的capacity大小设计的特点,空间增长的特点,迭代器失效。

Vector 最大 最小值 索引 位置,扩容的特点......

相关文章:

vector与list的简单介绍

1. 标准库中的vector类的介绍&#xff1a; vector是表示大小可以变化的数组的序列容器。 就像数组一样&#xff0c;vector对其元素使用连续的存储位置&#xff0c;这意味着也可以使用指向其元素的常规指针上的偏移量来访问其元素&#xff0c;并且与数组中的元素一样高效。但与数…...

四种线程池的使用,优缺点分析

池化思想&#xff1a;线程池、字符串常量池、数据库连接池 提高资源的利用率 下面是手动创建线程和执行任务过程&#xff0c;可见挺麻烦的&#xff0c;而且线程利用率不高。 手动创建线程对象执行任务执行完毕&#xff0c;释放线程对象 线程池的优点&#xff1a; 提高线程的…...

什么是 BEM 规范

BEM&#xff08;Block, Element, Modifier&#xff09;是一种 CSS 命名规范&#xff0c;旨在提高代码的可读性和可维护性。BEM 规范通过明确的命名规则来定义组件和组件的各个部分&#xff0c;使开发者能够更容易地理解和维护代码。 BEM 命名规范的基本概念 Block&#xff08…...

【Node.JS】入门

文章目录 Node.js的入门涉及对其基本概念、特点、安装、以及基本使用方法的了解。以下是对Node.js入门的详细介绍&#xff1a; 一、Node.js基本概念和特点 定义&#xff1a;Node.js是一个基于Chrome V8引擎的JavaScript运行环境&#xff0c;它使得JavaScript能够运行在服务器…...

Amazon SageMaker 机器学习之旅的助推器

一、前言 在当今的数字化时代&#xff0c;人工智能和机器学习已经成为推动社会进步的重要引擎。亚马逊云科技在 2023 re:Invent 全球大会上&#xff0c;宣布推出五项 Amazon SageMaker 新功能&#xff1a; Amazon SageMaker HyperPod 通过为大规模分布式训练提供专用的基础架构…...

TransMIL:基于Transformer的多实例学习

MIL是弱监督分类问题的有力工具。然而&#xff0c;目前的MIL方法通常基于iid假设&#xff0c;忽略了不同实例之间的相关性。为了解决这个问题&#xff0c;作者提出了一个新的框架&#xff0c;称为相关性MIL&#xff0c;并提供了收敛性的证明。基于此框架&#xff0c;还设计了一…...

3.用户程序与驱动交互

驱动程序请使用第二章https://blog.csdn.net/chenhequanlalala/article/details/140034424 用户app与驱动交互最常见的做法是insmod驱动后&#xff0c;生成一个设备节点&#xff0c;app通过open&#xff0c;read等系统调用去操作这个设备节点&#xff0c;这里先用mknode命令调…...

尽量不写一行if...elseif...写出高质量可持续迭代的项目代码

背景 无论是前端代码还是后端代码&#xff0c;都存在着定位困难&#xff0c;不好抽离&#xff0c;改造困难的问题&#xff0c;造成代码开发越来越慢&#xff0c;此外因为代码耦合较高&#xff0c;总是出现改了一处地方&#xff0c;然后影响其他地方&#xff0c;要么就是要修改…...

xcrun: error: unable to find utility “simctl“, not a developer tool or in PATH

目录 前言 一、问题详情 二、解决方案 1.确认Xcode已安装 2.安装Xcode命令行工具 3.指定正确的开发者目录 4. 确认命令行工具路径 5. 更新PATH环境变量 前言 今天使用cocoapods更新私有库的时候&#xff0c;遇到了"xcrun: error: unable to find utility &…...

【linux高级IO(一)】理解五种IO模型

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux高级IO 1. 前言2. 重谈对…...

前端引用vue/element/echarts资源等引用方法Blob下载HTML

前端引用下载vue/element/echarts资源等引用方法 功能需求 需求是在HTML页面中集成Vue.js、Element Plus&#xff08;Element UI的Vue 3版本&#xff09;、ECharts等前端资源&#xff0c;使用Blob下载HTML。 解决方案概述 直接访问线上CDN地址&#xff1a;简单直接&#xff0c…...

昇思MindSpore学习笔记2-01 LLM原理和实践 --基于 MindSpore 实现 BERT 对话情绪识别

摘要&#xff1a; 通过识别BERT对话情绪状态的实例&#xff0c;展现在昇思MindSpore AI框架中大语言模型的原理和实际使用方法、步骤。 一、环境配置 %%capture captured_output # 实验环境已经预装了mindspore2.2.14&#xff0c;如需更换mindspore版本&#xff0c;可更改下…...

uniapp实现图片懒加载 封装组件

想要的效果就是窗口滑动到哪里&#xff0c;哪里的图片进行展示 主要原理使用IntersectionObserver <template><view><image error"HandlerError" :style"imgStyle" :src"imageSrc" :id"randomId" :mode"mode&quo…...

持续交付:自动化测试与发布流程的变革

目录 前言1. 持续交付的概念1.1 持续交付的定义1.2 持续交付的核心原则 2. 持续交付的优势2.1 提高交付速度2.2 提高软件质量2.3 降低发布风险2.4 提高团队协作 3. 实施持续交付的步骤3.1 构建自动化测试体系3.1.1 单元测试3.1.2 集成测试3.1.3 功能测试3.1.4 性能测试 3.2 构建…...

VBA常用的字符串内置函数

前言 在VBA程序中&#xff0c;常用的内置函数可以按照功能分为字符串函数、数字函数、转换函数等等&#xff0c;本节主要会介绍常用的字符串的内置函数&#xff0c;包括Len()、Left()、Mid()、Right()、Split()、String()、StrConV()等。 本节的练习数据表以下表为例&#xff…...

大数据面试题之Spark(7)

目录 Spark实现wordcount Spark Streaming怎么实现数据持久化保存? Spark SQL读取文件&#xff0c;内存不够使用&#xff0c;如何处理? Spark的lazy体现在哪里? Spark中的并行度等于什么 Spark运行时并行度的设署 Spark SQL的数据倾斜 Spark的exactly-once Spark的…...

AI绘画 Stable Diffusion图像的脸部细节控制——采样器全解析

大家好&#xff0c;我是画画的小强 我们在运用AI绘画 Stable Diffusion 这一功能强大的AI绘图工具时&#xff0c;我们往往会发现自己对提示词的使用还不够充分。在这种情形下&#xff0c;我们应当如何调整自己的策略&#xff0c;以便更加精确、全面地塑造出理想的人物形象呢&a…...

liunx离线安装Firefox

在Linux系统中离线安装Firefox浏览器&#xff0c;您需要先从Mozilla的官方网站下载Firefox的安装包&#xff0c;然后通过终端进行安装。以下是详细的步骤&#xff1a; 准备工作 下载Firefox安装包&#xff1a; 首先&#xff0c;在一台可以上网的电脑上访问Firefox官方下载页面…...

UNet进行病理图像分割

数据集链接&#xff1a;https://pan.baidu.com/s/1IBe_P0AyHgZC39NqzOxZhA?pwdnztc 提取码&#xff1a;nztc UNet模型 import torch import torch.nn as nnclass conv_block(nn.Module):def __init__(self, ch_in, ch_out):super(conv_block, self).__init__()self.conv nn…...

初二数学基础差从哪开始补?附深度解析!

有时候&#xff0c;当你推不开一扇门的时候&#xff0c;不要着急&#xff0c;试着反方向拉一下&#xff0c;或者横向拉一下。下面是小偏整理的初二数学基础差从哪开始补2021年&#xff0c;感谢您的每一次阅读。   初二数学基础差从哪开始补2021年   第一个问题是很多同学都…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...