当前位置: 首页 > 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; 以前做…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...