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

模版and初识vector

一、引言

在C语言中,不论是数组,还是结构体定义的数组,功能都比较欠缺,不是单纯的添加几个变量就能够解决的。缺少增删查改的功能,为了解决这个问题,C++决定填上C语言这个坑,但是填过坑的人都知道,想填一个坑必定需要在其他地方挖一个坑。这些坑呢,零零碎碎,等遇到我们再一一揭晓。C++的祖师爷本贾尼博士创造了vector这一容器,既然vector是容器,那它必然可以包含各种各样的数据。很多东西都具有相似性,容器本身就是要将相似的物品归位一类。这里需要用到一个模板的工具。

二、        vector的大概介绍(相当于数组,依照先后顺序排列)

vector是STL的六大组件之一,头文件:<vector>,与之前string不同的是vector的增删查改使用迭代器特别频繁。主要是基于迭代器的灵活性、适配性、安全。vector还有个别名是顺序表(sequence list),至于它为什么叫vector(向量),就不得而知了。既然有顺序表这个别名,那vector肯定与顺序表有着千丝万缕的联系,实际上vector的底层就是顺序表。在使用过程中记得按需实例化(模版的内容)。

三、模版(template)

模版本身可以理解为一个模具,分为函数模版和类模版,只要符合的内置类型(计算机规定的类型)或自定义类型都可以套用模版,编译器会根据函数模版或是类模版生成一个对应的函数或类(有多少种不同的类型,就会生成多少个),模版就像方程组中的未知量,直到编译时模板才会被编译器替换为准确类型,就像我们求方程时求x的大小一样,算一遍才会得出x的值。编译器也会根据接受到的变量类型或根据使用者的按需实例化将模版类型替换。遇到不同类型使用模版,编译器也会生成不同类型的函数和类,这样我们就可以将不同的类型复用在同一段代码上了,大大增加了代码的复用性,节省了时间。

//class和typename都可以用来定义模版类型
template<class + 自定义的类型名,typename + 自定义的类型名>//vector的使用
std::vector<int> /*按需实例化,编译器自动将模版类型替换该类型*/ v(初始化值);
//没有初始化值时,不需要加(),不然编译器分不清这是函数,还是类对象。//最好的初始化是使用{}(花括号),这样编译器默认只是一个变量
//当然{}中可以像数组那样写出多个值。
std::vector<int> v{  };
std::cout << v[0] << std::endl;

当然模版类型也可以给缺省参数。也就是给定一个确定的类型。如果没有类型的传入,编译器根据缺省参数生成一个确定的类型。

//class和typename在tmeplate的声明中是一样的,混着用都没关系
template<class T,class T1 = int>
//
template<typename T,typename T2 = double>

        3.1函数模版

        函数模版即在函数的形参的类型,与类模版不同的是他可以不需要按需实例化,因为函数只有在执行可执行文件时才会建立栈帧。而类模版则不同,在没有缺省参数时,需要按需实例化。

template<class T>
void swap(T& tmp1,T& tmp2)
{T tmp = tmp1;tmp1 = tmp;tmp2 = tmp;
}int main()
{int a = 11 , b = 13;swap<int>(a , b);return 0;
}

        3.2类模版

        类的声明就和内置类型一样需要开好空间,如果连类型都不确定,还怎么计算内存开空间呢?哪怕是一个空类也有一字节的空间。因为编译器还会根据类的地址来查找类中的函数。这就需要类的声明的做好按需实例化。

四、        vector的详细介绍

        4.1 vector中的迭代器

        vector类中虽然,的很多函数都会使用迭代器。即是因为迭代器方便实用,又是因为要与其他的STL组件接轨。迭代器与指针相似,但有些迭代器可能不是指针,可能是用类封装,这个以后有机会再讲。

        在vector中的迭代器,分为正向迭代器和反向迭代器。正向迭代器(iterator)、反向迭代器(reverse_iterator)。顾名思义正向迭代器是由顺序表起始位置(begin())到最后一个位置的的下一个位置(end()),反向迭代器就是从最后一个位置(rbegin())到顺序表的起始位置的下一个位置(rend()),可以通过解引用操作符访问,自然也可以通过解引用操作符修改值。(除const迭代器以外)

#include<iostream>
//vector的头文件
//为了与C语言作区分,不加.h后缀
#include<vector>int main()
{std::vector<int> v;//尾插一个数据v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);std::vector<int>::reverse_iterator it = v.rbegin();while (it != v.rend()){std::cout << *it << "   ";++it;}//不可访问,end()、rend(()函数都是从//std::cout << *(v.end()) << std::endl;//不论是reverse_iterator还是iterator//都是从正向或是反向的位置相加、减,前置后置加加、减减。std::vector<int>::reverse_iterator it = v.rbegin();while (it != v.rend()){std::cout << *it << "   ";++it;}//std::cout << *(v.end()) << std::endl;return 0;
}

const迭代器只能访问,不能修改值。const迭代器直接往迭代器前加const_,直接const在迭代器前加const则会报错,不管迭代器的底层都是否为指针,它都是一个对访问方式的封装,并不是一个单纯的类型。

//初始化,当然也可以不加小括号,直接就大括号
std::vector<int> v({1,2,3,4,5,6});std::vector<int>::const_iterator it = v.begin();
while (it != v.end())
{std::cout << *it << "   ";++it;
}

        4.2 vector中的尾插函数

        push_back()和string中的push_back()效果相差无几,都是往最后的位置插入类型元素。至于是什么类型就看声明时按需实例化的是什么类型。当然它也可以用来存储char类型。也可以按需实例化成string。

//这里用int类型做个示范
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);//这里用string做一个示范
vector<string> vs;
vs.push_back("ABC");
vs.push_back("ABC");
vs.push_back("ABC");
vs.push_back("ABC");

        4.3vector中的insert和erase函数

        vector中的在指定位置插入和在删除指定位置。这里需要注意的是此insert、erase非string中的insert、erase。需要用迭代器,这里用迭代器自然是为了和STL的其他容器保持一致。但是至少也要重载一个下标插入、删除,所以C++某些设计还是不完善。

C++11的官网:cplusplus.com - The C++ Resources Network

C++11vector中的insert:vector::insert - C++ Reference (cplusplus.com)

C++11vector中的erase:vector::erase - C++ Reference (cplusplus.com)

std::vector<int> v{ 1,3,4 };
v.insert(v.begin() + 1, 2);
//注意迭代器失效的问题
for (auto e : v)
{std::cout << e << "		" ;
}
std::cout << std::endl;
//注意end()、rbegin()都是顺序表之外的位置
//end()是末尾位置的下一个位置。
//rbegin()是开头的上一个位置。
v.erase(v.end() - 1);
for (auto e : v)
{std::cout << e << "		";
}

用迭代器访问时,注意insert()后迭代器位置就已经失效了,需要更新一下,这里原因是扩容导致的。因为内存上的堆区也并不是所有位置都可以访问的,也有些是无法访问的,我们要保证顺序表的连续性,只能另寻他处再复制拷贝下来。

//迭代器更新,insert会自动返回插入位置的迭代器
std::cout << std::endl;
std::vector<int> v1{ 1,3,4 };
std::vector<int>::iterator it = v1.begin() + 1;
it = v1.insert(it, 2);
while (it != v1.end())
{std::cout << *it << "	";++it;
}//错误示例:  std::cout << std::endl;std::vector<int> v1{ 1,3,4 };std::vector<int>::iterator it = v1.begin() + 1;v1.insert(it, 2);while (it != v1.end()){std::cout << *it << "	";++it;}

        4.4vector的下标访问

        和string一样,vector也可以用下标来访问。这里size()和capacity()就不讲了,string中讲过了。

std::vector<int> v{ 1,3,4 };
for(int i = 0;i < v.size();++i)
{std::cout << v[i] << "   ";
}

        4.5vector拷贝构造和operator = 

        这是我们比较容易忽略的。顺嘴提醒一下。

std::vector<int> v{ 1 , 2 , 3 , 4 }
std::vector<int> v1 = v;

相关文章:

模版and初识vector

一、引言 在C语言中&#xff0c;不论是数组&#xff0c;还是结构体定义的数组&#xff0c;功能都比较欠缺&#xff0c;不是单纯的添加几个变量就能够解决的。缺少增删查改的功能&#xff0c;为了解决这个问题&#xff0c;C决定填上C语言这个坑&#xff0c;但是填过坑的人都知道…...

网站开发基础:HTML、CSS

前端开发主要使用的技术如 HTML、CSS 和 JavaScript 等。 简单制作一个网页 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>柒毓同学网站的首页</title><style>.c1{border: solid 1px g…...

IP协议讲解

IP协议 IP协议的本质&#xff1a;提供一种能力&#xff0c;将数据跨网络从A主机传输到B主机 4位版本号(version): 指定IP协议的版本, 对于IPv4来说, 就是4. 4位头部长度(header length): IP头部的长度是多少个32bit, 也就是 length * 4 的字节数. 4bit表示最大 的数字是15, 因…...

SpringMVC4-SpringMVC获取请求参数

目录 通过ServletAPI获取&#xff08;不常用&#xff09; 通过控制器方法的形参获取请求参数 RequestParam RequestHeader CookieValue 通过POJO获取请求参数 解决获取请求参数的乱码问题 test_param.html&#xff1a; <!DOCTYPE html> <html lang"en&qu…...

【C++】C++基础

目录 一. C关键字(C98) 二、C的第一个程序 三、命名空间 3.1.namespace的价值 3.2.namespace的定义 3.2.命名空间使用 总结&#xff1a;在项目当中第一、第二种方法搭配使用&#xff0c;第三种冲突风险非常大&#xff0c;仅适合练习使用。 四、C输入&输出 五、缺省…...

自动化运维工具 Ansible

Ansible 基础 Ansible 介绍 Ansible 是一个自动化运维工具&#xff0c;基于Python开发&#xff0c;集合了众多运维工具&#xff08;puppet、cfengine、chef、 func、fabric&#xff09;的优点&#xff0c;实现了批量系统配置、批量程序部署、批量运行命令等功能。 Ansible 的…...

深度学习:GAN图像生成

GAN的诞生背景 诞生&#xff1a; 2014年由Ian Goodfellow提出 创新性&#xff1a; 无监督学习&#xff1a;GAN 提供了一种新的方法来进行无监督学习&#xff0c;即不需要对训练数据进行标注就可以学习到数据的潜在分布。对抗训练&#xff1a;通过引入对抗机制&#xff0c;G…...

django基于python的房价分析可视化系统的设计与开发 h1y0i

目录 项目介绍技术栈具体实现截图Scrapy爬虫框架关键技术和使用的工具环境等的说明解决的思路开发流程爬虫核心代码展示系统设计论文书写大纲详细视频演示源码获取 项目介绍 大数据分析是现下比较热门的词汇&#xff0c;通过分析之后可以得到更多深入且有价值的信息。现实的科…...

Labview helper

IMAQ Advanced Setup Learn Geometric Pattern 2 VI 参数说明Curve Extraction Mode (0)指定VI如何识别图像中的曲线。如果您希望VI不对图像中对象的均匀性或图像背景做出任何假设&#xff0c;请将此选项设置为正常。如果您希望VI假定图像中的对象或图像背景由均匀的像素值组成…...

《安富莱嵌入式周报》第343期:雷电USB4开源示波器正式发布,卓越的模拟前端低噪便携示波器,自带100W电源的便携智能烙铁,NASA航空航天锂电池设计

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 更新一期视频教程 【授人以渔】CMSIS-RTOS V2封装层专题视频&#xff0c;一期视频将常用配置和用法梳理清楚&#xff0…...

如何用JavaScript编写一个简单的计数器

在网页开发中&#xff0c;计数器是一种常见的功能&#xff0c;它可以帮助我们记录点击次数、显示时间等。下面我将介绍如何在HTML页面中使用JavaScript实现一个基本的计数器。如图&#xff1a; 1、 创建HTML结构 首先&#xff0c;我们需要创建一个基础的HTML结构来容纳我们的计…...

uniapp中实现评分组件,多用于购买商品后,对商品进行评价等场景

前言 uni-rate是uniapp框架中提供的一个评分组件。它可以用于用户评价、打分等场景。uni-rate组件可以根据设定的星星总数&#xff0c;展示用户评分的效果&#xff0c;用户可以通过点击星星或滑动星星的方式进行评分。同时&#xff0c;uni-rate组件也支持自定义星星图标、星星…...

算法笔记(三)——前缀和算法

算法笔记&#xff08;三&#xff09;——前缀和算法 文章目录 算法笔记&#xff08;三&#xff09;——前缀和算法一维前缀和二维前缀和寻找数组的中心下标除自身以外数组的乘积和为 K 的子数组和可被 K 整除的子数组连续数组矩阵区域和 前缀和算法是一种用空间换时间的算法&am…...

Nginx技术深度解析与实战应用

Nginx技术深度解析与实战应用 Nginx是一款轻量级、高性能的Web服务器、反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器&#xff0c;由俄罗斯的程序设计师Igor Sysoev开发。Nginx以其内存占用少、启动迅速、高并发能力强等特性&#xff0c;在互联网项目…...

Maven Surefire Plugin

Maven Surefire Plugin 最新版本新特性详解 Maven Surefire Plugin 是用于运行单元测试和集成测试的重要工具&#xff0c;支持 JUnit、TestNG 等测试框架。插件的新版本引入了许多新特性和配置选项&#xff0c;这些功能提升了测试执行的性能、灵活性和并发能力。在本节中&…...

八、跳跃、闪避

一、人物跳跃功能 1、动画 设置一个bool值 条件设置为true 2、逻辑 实现跳跃&#xff0c;一定有IsGround&#xff1b;判断是否为地面&#xff0c;进行跳跃功能 写一个跳跃和一个条约结束方法 跳跃设置为false&#xff0c;结束设置为true 3、代码 public void Jump() {if…...

使用辅助分类器 GAN 进行条件图像合成

Conditional Image Synthesis with Auxiliary Classifier GANs Conditional Image Synthesis with Auxiliary Classifier GANs&#xff08;简称AC-GANs&#xff09;是一种用于改善生成对抗网络&#xff08;GANs&#xff09;进行图像合成的方法。在AC-GANs中&#xff0c;判别器…...

C#中的static关键字:静态成员与单例模式的实现

在C#中&#xff0c;static 关键字是一个非常重要的概念&#xff0c;它用于声明静态成员&#xff0c;这些成员属于类本身&#xff0c;而不是类的任何特定实例。使用 static 关键字可以定义静态类、静态字段、静态属性、静态方法等。此外&#xff0c;理解静态成员也对于实现如单例…...

【优选算法】(第八篇)

目录 串联所有单词的⼦串&#xff08;hard&#xff09; 题目解析 讲解算法原理 编写代码 最⼩覆盖⼦串&#xff08;hard&#xff09; 题目解析 讲解算法原理 编写代码 串联所有单词的⼦串&#xff08;hard&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&#…...

告别PPT熬夜!Kimi+AIPPT一键生成PPT,效率upup!

Kimi AiPPT 一键生成PPT 还在为做PPT熬夜加班吗&#xff1f;还在为PPT排版抓狂吗&#xff1f;现在&#xff0c;有一个好消息要告诉所有“打工人”&#xff01;Kimi和AIPPT强强联手&#xff0c;推出了一键生成PPT功能&#xff0c;让你告别PPT制作的痛苦&#xff01; 以前做…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...