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

news2024/11/22 14:57:25

一、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/544445.html

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

相关文章

DMGI:Unsupervised Attributed Multiplex Network Embedding

[1911.06750] Unsupervised Attributed Multiplex Network Embedding (arxiv.org) 目录 Abstract 1 Introduction 2 DGI 3 Deep Multiplex Graph Infomax: DMGI 特定关系类型的节点嵌入 Joint Modeling and Consensus Regularization Extension to Semi-Supervised Lea…

在线视频(海康,大华等摄像头)平台

项目下载地址 http://www.gxcode.top/code 功能&#xff1a; 1.接入设备 2.设备使用 3.国标级联 4.推流列表 5.拉流代理 6.电子地图 7.节点管理 8.云端录像 9.不间断录像 一.项目运行图 二.代码截图 1.在线视频前端 2.在线视频服务平台 3.在线视频录像服务平台

大型医学影像PACS系统源码 VC + MSSQL

PACS系统可以覆盖医院现有放射、CT、MR、核医学、超声、内镜、病理、心电等绝大部分DICOM和非DICOM检查设备&#xff0c;支持从科室级、全院级、集团医院级乃至到区域PACS的平滑扩展&#xff0c;能够与医院HIS、集成平台的有效集成和融合&#xff0c;帮助医院实现了全院医学影像…

软件测试技术课程:软件测试流程

软件测试流程如下&#xff1a; 测试计划测试设计测试执行 单元测试集成测试确认测试系统测试验收测试回归测试验证活动 测试计划 测试计划由测试负责人来编写&#xff0c;用于确定各个测试阶段的目标和策略。这个过程将输出测试计划&#xff0c;明确要完成的测试活动&#x…

linux内核篇-进程间通信(信号,管道,共享内存,socket)

信号机制 在linux操作系统中&#xff0c;为了响应各种各样的事件&#xff0c;也定义了很多信号。我们可以通过kill -l命令&#xff0c;查看所有的信号 # kill -l1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP6) SIGABRT 7) SIGBUS …

【大数据模型】LeonardoAi让心中所想跃然纸上

汝之观览&#xff0c;吾之幸也&#xff01; 本文主要聊聊LeonardoAi绘图工具 一、注册Discord账号 不管LeonardoAi还是midjourney&#xff0c;都需要注册一个Discord账号&#xff0c;Discord是一个社区软件&#xff0c;在这里可以进行讨论和交流使用心得 LeonardoAi官网地址 …

RabbitMQ集群安装

RabbitMQ集群安装 1.前言 OS: CentOS Linux release 7.9.2009 (Core) 机器: IPnodecpu内存存储10.106.1.241max-rabbitmg-018 核16 G100 G10.106.1.242max-rabbitmg-028 核16 G100 G10.106.1.243max-rabbitmg-038 核16 G100 G 因为操作系统版本是 centos7&#xff0c;所以…

chatgpt赋能Python-python3_5_3怎么保存

Python 3.5.3 保存指南 如果你正在使用Python 3.5.3&#xff0c;你可能会发现你需要保存你的代码和文件。在这篇SEO文章中&#xff0c;我们将介绍如何在Python 3.5.3中保存你的代码和文件。 保存Python代码 当你编写Python代码时&#xff0c;你需要将它们保存在文件中。为了…

【原】nodejs全局安装和本地安装的区别

来微信支付有2年多了&#xff0c;从2年前的互联网模式转变为O2O模式&#xff0c;主要的场景是跟线下的商户去打交道&#xff0c;不像以往的互联网模式&#xff0c;有产品经理提需求&#xff0c;我们帮忙去解决问题。 转型后是这样的&#xff0c;团队成员更多需要去寻找业务的方…

c++网上学习资源

背景 在网上学习或者参考的C资源。 相对其他语言来说&#xff0c;C 算是难度比较高的了&#xff0c;这一点无法否认。但是如果能有一些好的网站&#xff0c;则会让 C 的学习事半功倍。 那就来介绍几个最常用的&#xff08;最好的&#xff09;吧&#xff0c;包含了参考手册、教…

html - 多媒体标签(video)、音频标签(audio)

video 语法&#xff1a; <video src"文件地址" controls"controls" </video> 常见的属性 属性 值 描 述 autoplay autoplay 视频就绪自动播放&#xff08;谷歌浏览器需要添加muted来解决自动放的问题 controls controls …

腾讯云轻量应用服务器怎么搭建网站?超详细建站流程

腾讯云轻量应用服务器怎么搭建网站&#xff1f;太简单了&#xff0c;轻量服务器选择宝塔Linux镜像&#xff0c;然后在宝塔面板上添加站点&#xff0c;以WordPress建站为例&#xff0c;腾讯云服务器网来详细说下腾讯云轻量应用服务器搭建网站全流程&#xff0c;包括轻量服务器配…

函数栈帧的创建与销毁(反汇编万字讲解)

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C语言学习分享⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多C语言知识   &#x1f51d;&#x1f51d; 这里写目录标题 1. 前言&#x1f6…

AI为文档图像安全注入新力量

Hello大家好。我是Dream。 随着人工智能和大数据技术的快速发展&#xff0c;人们对于文档图像安全的关注度越来越高。尤其是在当下&#xff0c;AIGC取得了里程碑式的成绩&#xff0c;引发了市场广泛热烈的兴趣&#xff0c;扩散模型在内的关键技术取得突破&#xff0c;技术可用性…

链表的相关OJ题解析

目录 ⭐一、移除链表元素 ⭐二、反转链表 ⭐三、求链表中间节点 ⭐四、求链表倒数第k个节点 ⭐ 五、合并两个有序链表 ⭐六、链表的回文结构 ⭐ 七、相交链表 ⭐八、环形链表 ⭐九、链表入环的第一个节点 ⭐一、移除链表元素 链接&#xff1a; 移除链表元素 思路一…

浅尝css函数

文章目录 一、attr二、calc三、cubic-bezire四、conic-gradient五、counter六、hsl七、linear-gradient八、radial-gradient九、max/min十、var 一、attr 返回元素的属性值attr() 理论上能用于所有的 CSS 属性&#xff0c;但目前支持的仅有伪元素的 content 属性&#xff0c;其…

【网络工程师人手必备的常用网络命令合集,整理收藏!】

在计算机网络中经常要对网络进行管理&#xff0c;测试&#xff0c;这时就要用到网络命令。今天就为大家整理了一些网络工程师必备的一些常用网络命令合集&#xff0c;建议收藏后观看哦&#xff01; ping命令 ping是个使用频率极高的实用程序&#xff0c;主要用于确定网络的连…

Linux Shell if 使用参考

if 参考 与许多其他语言一样&#xff0c;PowerShell 提供了用于在脚本中有条件地执行代码的语句。 其中一个语句是 If 语句。 今天&#xff0c;我们将深入探讨 PowerShell 中最基本的命令之一。 案例使用解释&#xff0c;以下是部署virtualbox使用if参考解释 if 判断检查系统…

创新灵感来源于用户实践,TDengine 首次公开四项专利申请

好消息&#xff01;好消息&#xff01; 美国专利局来电 TDengine又有一个新专利证书下来啦&#xff01; 这一专利名为 “一种时序数据库表结构改变处理方法” 做技术创新我们真的是认真的~ 话不多说&#xff0c;给大家上图展示一下 我们都知道&#xff0c;在当下这样一个…

前端性能测试Lighthouse的使用

Lighthouse是一个开源项目&#xff0c;提高网页的质量&#xff0c;生成的测试报告会提供优化方案&#xff0c;以来提高网页的性能。重点就是关注优化建议 官方介绍Lighthouse的地址&#xff1a;https://developer.chrome.com/docs/lighthouse/ 一、使用方法 1、使用谷歌开发者…