【STL模版库】vector介绍及使用 {构造函数,迭代器,容量相关接口,增删查改;动态二维数组}

news2025/1/10 10:48:43

一、vector的介绍

在这里插入图片描述

  1. vector是表示可变大小数组的序列容器。
  2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。
  3. vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因此存储空间比实际需要的空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。
  4. 与其它动态序列容器相比(deque, list and forward_list), vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。

二、vector的使用

vector和string的底层都是顺序表,且由于STL库函数的设计互通,因此使用也类似。

所以相关函数的使用细节可以参考文章:【STL模版库】string类:常用接口函数

下面的内容只做简介,不再做详细介绍。

2.1 构造函数

在这里插入图片描述


2.2 迭代器

在这里插入图片描述

在这里插入图片描述


2.3 容量相关接口

在这里插入图片描述

  • reserve只负责开辟空间,如果确定知道需要用多少空间,reserve可以缓解vector增容的代价缺陷问题。

  • resize在开空间的同时还会进行初始化,影响size。

  • 相同的代码在vs和g++下分别运行会发现,vs下capacity是按1.5倍增长的,g++是按2倍增长的。这个问题经常会考察,不要固化的认为,vector增容都是2倍,具体增长多少是根据具体的需求定义的。vs是PJ版本STL,g++是SGI版本STL。

在这里插入图片描述


2.4 增删查改

在这里插入图片描述

  • 下面重点介绍的find、sort和swap函数都是由算法模块实现的函数模版,并不是vector的成员接口。
  • 在使用前需要包含头文件<algorithm>,并展开std命名空间。

2.4.1 find

在这里插入图片描述

此函数模版的行为等效于:

template<class InputIterator, class T>
  InputIterator find (InputIterator first, InputIterator last, const T& val)
{
  while (first!=last) {
    if (*first==val) return first;
    ++first;
  }
  return last;
}
  • find仅仅是一个函数模版,会根据传入参数的不同类型实例化出适应各种类型的find函数。
  • 这里使用迭代器遍历容器,是因为迭代器是所有容器的通用遍历访问方法。
  • 使用引用传参避免发生拷贝构造,更高效。
  • 如果找到了,返回对应元素的迭代器;如果找不到,返回last;

其他查找函数

find_if

功能:返回范围中第一个满足指定条件的元素的迭代器

参数:共有3个,前两个参数是待查找的迭代器区间;最后一个参数是一个返回值为bool类型的一元函数指针,该函数用于条件判断。

同类函数:find_if_not,与find_if逻辑相反,参数和使用方法相同。

find_first_of

功能:在母序列中从前往后查找子序列,返回母序列中第一次出现子序列的首元素的迭代器

参数:共有5个,前两个参数是母序列迭代器区间;中间两个是子序列迭代器区间;最后一个参数是一个返回值为bool类型的二元函数指针,该函数用于条件判断。

同类函数:find_end,与find_first_of查找方向相反是从后往前查找,参数和使用方法相同。


2.4.2 sort

在这里插入图片描述

C++STL库中的sort接口底层采用快速排序实现。

#include <iostream>
#include <algorithm> //sort
#include <functional> //greater
using namespace std;

int main(){
	string s("hello412535");
    sort(s.begin(), s.end()); //第三个参数缺省默认排升序;
    //sort(s.begin(), s.end(), less<char>()); //也可以显示的传less也是排升序;
    for(auto e : v1)
    {
        cout << e << " ";
    }
    cout << endl;
    
	sort(s.begin(), s.end(), greater<char>()); //传greater是排降序;
    for(auto e : v1)
    {
        cout << e << " ";
    }
    cout << endl;
    return 0;
}

前两个参数同样是待排序的迭代器区间范围

第三个参数缺省默认升序,传less是升序排序,传greater是降序排序。

注意:

  • 这里的greater和less是类模版。
  • 传入的less<char>()和greater<char>()是实例化出的模版类定义的匿名对象。
  • 要使用greater类模版需要包<functional>头文件

2.4.3 swap

在这里插入图片描述

此函数模版的行为等效于:

template <class T> void swap ( T& a, T& b )
{
  T c(a); a=b; b=c;
}
  • 由此可见,算法模块中实现的swap函数模版,采用的是创建临时变量,赋值交换的方法。仅仅适用于内置类型,而对于自定义类型会进行1次拷贝构造和2次赋值拷贝。尤其针对需要进行深拷贝的对象,这种交换方式的效率极低。

  • 因此,对于需要进行交换操作的自定义类型一般会自己实现成员交换函数,只对成员变量进行浅交换即可。


三、动态二维数组

vector不仅可以存储内置类型,还可以用于存储自定义类型如:vector<string>和vector<vector<int>>

3.1 vector<string>

vector<char> 能否替代 string?

回答:不能

  1. string字符串由’\0’结尾,而vector<char>不会。
  2. string类重载了流插入<<和流提取>>运算符,能更加方便的进行输入输出。
  3. string类中还提供了操作字符串的专用接口,如operator+=、字符串比较大小、to_string等等。
  4. 因此vector<char> 不能替代 string
int main(){
    vector<string> strv;
    string str1("张三");
    strv.push_back(str1);
    strv.push_back(string("李四")); //[1]
    strv.push_back("王五"); //[2]
    for(const auto &name : strv) //[3]
    {
        cout << name << endl;
    }
}

解释:

  • [1] 定义匿名对象,匿名对象的生命周期只在当前行。
  • [2] 由于string类中定义了一个单参构造函数string (const char* s);,所以常量字符串"王五"可以进行隐式类型转换,构造临时string对象。
  • [2] 类型转换形成的临时对象具有常性,而void push_back (const value_type& val);的参数类型是常引用,因此这种写法可行。
  • [3] 范围for中的临时变量的类型建议写成引用,这是因为如果是普通变量会进行频繁地拷贝构造(尤其针对自定义类型),效率极低。如果循环中不做修改建议加const进行保护。

3.2 vector<vector<int>>

以题目【Leetcode.118】杨辉三角为例:

在这里插入图片描述

题解:

class Solution {
public:
    vector<vector<int>> generate(int numRows) {
        vector<vector<int>> vv; //使用vector定义二维数组vv,vv中的每个元素都是vector<int>
        vv.resize(numRows); //[1]
        for(size_t i = 0; i<vv.size(); ++i)
        {
            vv[i].resize(i+1); //[2]
            vv[i].front() = 1;
            vv[i].back() = 1;
        }
        for(size_t i = 2; i<vv.size(); ++i)
        {
            for(size_t j = 1; j<vv[i].size()-1; ++j)
            {
                vv[i][j] = vv[i-1][j] + vv[i-1][j-1]; //[3]
            }
        }
        return vv;
    }
};

解释:

  • [1] 为vector<vector>对象开空间并初始化。

  • [1] 这是resize的函数原型:void resize (size_type n, value_type val = value_type());

  • [1] 第二个参数用value_type类型的匿名对象做缺省值,相当于调默认构造生成临时对象。

  • [1] resize函数内利用临时对象拷贝构造生成新对象。

  • [1] 因此执行过这条resize语句之后的结构为:设numRows==5
    在这里插入图片描述

  • [2] 为每个vector元素开空间并初始化,然后将每行的第一列和最后一列置为1。

  • [3] vector<vector>动态二维数组的访问:先后调用两个operator[]的重载函数,实现了二维数组的访问遍历。
    在这里插入图片描述

  • [3] 还记得普通二维数组的访问方式吗?二维数组在内存中和一维数组一样是线性连续存储的,编译器会先将两个二维下标换算成一个一维下标,然后才能通过解引用访问。

  • 最后生成的二维数组结构图示
    在这里插入图片描述

  • 关于二维动态数组的深拷贝问题我会在下一节进行详解:【STL模版库】模拟实现vector类模版6.2

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

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

相关文章

Shell iptales防火墙设置

文章目录 Linux 防火墙1.Linux包过滤防火墙概述2.四表五链四表五链 3.规则链之间的匹配顺序主机型防火墙网络型防火墙 4.规则链内的匹配顺序 Linux 防火墙 1.Linux包过滤防火墙概述 Linux 系统的防火墙: IP信息包过滤系统&#xff0c;它实际上由两个组件netfilter 和 iptable…

029:Mapbox GL绘制铁路黑白交替的线段

第029个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中加载数据显示铁路标识的那种黑白交替的线段。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共94行)相关API参考:专栏目标示例效果 配置方式 1)…

湍流的数值模拟方法概述

湍流&#xff0c;又称紊流&#xff0c;是一种极其复杂、极不规则、极不稳定的三维流动。湍流场内充满着尺度大小不同的旋涡&#xff0c;大旋涡尺度可以与整个流畅区域相当&#xff0c;而小漩涡尺度往往只有流场尺度千分之一的数量级&#xff0c;最小尺度旋涡的尺度通过其耗散掉…

蓝桥杯--挖地雷

没有白走的路&#xff0c;每一步都算数&#x1f388;&#x1f388;&#x1f388; 题目&#xff1a; 已知有很多的地窖&#xff0c;每一个地窖中又藏着很多的地雷&#xff0c;每个地窖之间都存在着相连性&#xff0c;但是不是任意的地窖都是相连的&#xff0c;要求我们找出一次能…

技术干货 | 在 PostgreSQL 中设置查询超时

在 Navicat Monitor 3 监控工具中的查询分析器画面顶部&#xff0c;我们设置了一个图表&#xff0c;用以显示等待时间最长的查询&#xff1a; 能够标识出滞后的查询非常重要&#xff0c;因为它们可以让一切陷入瘫痪。 除了在标识出慢速查询并对其进行修复外&#xff0c;另一种…

【2023 · CANN训练营第一季】昇腾AI入门课(TensorFlow)第二章——TensorFlow模型迁移训练

1.AI模型开发基础知识入门 1.1具备Python编程经验 a.使用位置和关键字参数定义和调用函数 b.字典、列表、集合 (创建、访问和迭代) c.for循环&#xff0c; for具有多个迭代器变量的循环 (例如&#xff0c;for a,b in [(1,2),(3,4)]) d.if/else条件块和条件表达式 e.字符串格式…

Echarts绘制折线图,超简单,源码点击即可运行!【文末源码地址】

文章目录 前言Apache Echarts绘制基础折线图绘制带标记的折线图绘制多条折线图绘制带标签的折线图完整源码地址 前言 本文包含的代码仅为部分片段&#xff0c;完整源码有详细注释&#xff0c;可在文末领取&#xff01; 在当今数字化时代&#xff0c;数据可视化已成为一种必不…

day12 - 图像修复

在图像处理的过程中&#xff0c;经常会遇到图像存在多余的线条或者噪声的情况&#xff0c;对于这种情况我们会先对图像进行预处理&#xff0c;去除掉对图形内容有影响的噪声&#xff0c;在进行后续的处理。 本节实验我们介绍使用图像膨胀来处理图形的多余线条&#xff0c;进行…

web前端 --- CSS(03) -- 元素定位

元素定位&#xff1a;标签在页面中的位置问题 &#xff08;1&#xff09;分类 绝对定位&#xff1a;将需要的元素直接定位固定的位置 PS&#xff1a;绝对定位&#xff0c;必须指定一个相对点&#xff08;一般是父标签&#xff09;。相对的标签必须是相对定位或者绝对定位【重…

chatgpt赋能python:PythonSearchGroup-Python搜索小组

Python Search Group - Python搜索小组 如果你是一个Python程序员&#xff0c;或者对Python编程语言感兴趣&#xff0c;那么你一定听说过Python Search Group。Python Search Group是一个专注于Python搜索和搜索引擎的小组&#xff0c;他们致力于提供高效的Python搜索工具和搜…

【Netty】字节缓冲区 ByteBuf(七)(下)

文章目录 前言一、实现原理二、ByteBuf 的使用案例三、ByteBuf 的3种使用模式3.1 堆缓冲模式3.2 直接缓冲区模式3.3 复合缓冲区模式 总结 前言 回顾Netty系列文章&#xff1a; Netty 概述&#xff08;一&#xff09;Netty 架构设计&#xff08;二&#xff09;Netty Channel 概…

鸿蒙Hi3861问题解决-DevEco VSCode无法跳转

一、问题描述 使用Windows和Ubuntu混合编译下载&#xff0c;在windows下搭建VSCodeDevEco Device Tool环境。通过SSH远程Ubuntu系统进行代码修改与编译。 在VSCode中&#xff0c;Ctrl左键&#xff0c;无法跳转。按住Ctrl键&#xff0c;鼠标移到函数上&#xff0c;也不会有任何反…

Flink+hadoop部署及Demo

Hadoop集群高可用部署 下载hadoop包地址 https://dlcdn.apache.org/hadoop/common/hadoop-3.2.4/hadoop-3.2.4.tar.gz 上传并解压到3台服务器 配置3台主机的hosts和免密登录 1.修改.bash_profile vi .bash_profile # HADOOP_HOME export HADOOP_HOME/apps/svr/hadoop-3.2.…

一分钟掌握技术术语:API(接口)|电商平台API接口展示示例

很多产品经理在项目开发过程中经常听到&#xff1a;你调我这个接口就好了&#xff1b;这个功能你写个接口给我&#xff1b;有什么不懂的就看下API接口文档。 开发经常说的接口是什么意思呢&#xff1f;术语解释&#xff1a;API&#xff08;Application Programming Interface&a…

GPT虚拟直播Demo系列(一)|GPT接入直播间实现主播与观众互动

摘要 ChatGPT和元宇宙都是当前数字化领域中非常热门的技术和应用。结合两者的优势和特点&#xff0c;可以探索出更多的应用场景和商业模式。例如&#xff0c;在元宇宙中使用ChatGPT进行自然语言交互&#xff0c;可以为用户提供更加智能化、个性化的服务和支持&#xff1b;在Ch…

成功拿到B站测开岗年薪50W+offer,面经分享

一面 首先&#xff0c;自我介绍&#xff0c;我介绍了自己的技术栈和项目。 技术栈提到过Spring、Redis、Kafka、Docker、K8s、大数据。 项目提到过接口和UI自动化。 我有个大数据平台项目&#xff0c;问了比较多&#xff0c;聊着聊着&#xff0c;提到自己研究过Selenium、T…

Vue3:组件基础(上)

Vue3&#xff1a;组件基础&#xff08;上&#xff09; Date: April 11, 2023 Sum: vite的基本使用、组件化开发思想、vue组件的构成、组件的基本使用、封装组件的案例 单页面应用程序 什么是单页面应用程序 单页面应用程序&#xff08;英文名&#xff1a;Single Page Applic…

【网络安全篇】如何当着面试官的面优雅地装逼!

从胡子的长度和忧郁的眼神我察觉到&#xff0c;面前坐着的这位面试官应该有点东西。 浑身上下流露着打过CTF的气场。我像以往一样&#xff0c;准备花3分钟的时间进行自我介绍。 在此期间&#xff0c;面试官面无表情但很有耐心的听着我balabala。 我按照原定计划顺利地介绍(吹…

国内行业垂直型SaaS公司有哪些?发展前景如何?

01 国内行业垂直型SaaS公司有哪些&#xff1f; 根据艾瑞咨询测算&#xff0c;2021年中国企业级应用软件市场规模达到2592亿元&#xff0c;SaaS在其中占比达到28.1%。 在企业数字化转型的全景图中&#xff0c;SaaS扮演着应用场景层面的关键作用&#xff0c;往往是企业特定环节数…

什么是护网?护网怎么参加?

一、什么是护网行动&#xff1f; 护网行动是以公安部牵头的&#xff0c;用以评估企事业单位的网络安全的活动。 具体实践中。公安部会组织攻防两方&#xff0c;进攻方会在一个月内对防守方发动网络攻击&#xff0c;检测出防守方&#xff08;企事业单位&#xff09;存在的安全…