C++STL--------vector

文章目录

    • 一、vector常用接口介绍
        • 1、initializer_list
        • 2、接口有很多类似
        • 3、typeid(类型).name()
        • 4、find() 函数
        • 5、内置类型构造
    • 二、vector()常用接口模拟实现

截图来源网站:https://legacy.cplusplus.com/reference/vector/vector/

一、vector常用接口介绍

在这里插入图片描述
是一个类模版,可以创建各种类型的数组。

1、initializer_list

在这里插入图片描述
可以支持初始化多个数据

	//initializer_list可以实现大括号初始化vector<int> v1 = { 1,2,3,4,5 };vector<int> v2({ 1,2,3,4,5 });//可以遍历无法修改auto i1 = { 1,2,3,4,5 };initializer_list<int> i2 = { 1,2,3,4,5 };//类似这个数组int a[] = { 1,2,3,4,5 };
2、接口有很多类似
  • size() 获取有效数据个数
  • begin() , end() 迭代器
  • capacity()空间大小
  • empty()判段是否为空
  • reserve()对空间进行扩容
  • resize()对有效数据进行调整,一般空间不够会扩容,但不会缩容空间
  • shrink_to_fit()对空间缩容跟size一样大小
  • operator[]越界是直接断言
  • at()越界是抛异常
  • date()返回底层数组的指针
  • assign()是一直赋值,会覆盖原来的数据,空间不够会扩容
  • push_back()区别是只能单个数据的插入
  • insert()插入数据但不支持下标的插入,支持迭代器区间
  • erase()删除一个值这个值的位置是迭代器,删除一端迭代器区间
  • swap()交换
  • emplace()跟insert()功能一样
  • emplace_back()跟push_back()功能一样,有的场景效率更高
3、typeid(类型).name()

可以拿到一个真实的类型

在这里插入图片描述
vector里面的迭代器可以看到实现的很复杂

4、find() 函数

不是vector的函数成员,是库里面的一个通用函数模版
在这里插入图片描述
给段段左闭右开的迭代器区间寻找指定的值,找到返回对应位置的迭代器,没找到返回last迭代器

5、内置类型构造

C++对内置类型也进行了升级

	int i = int();int k = int(10);int j(100);

二、vector()常用接口模拟实现

#pragma once#include <iostream>
#include <assert.h>
#include <string.h>
#include <vector>
#include <algorithm>
#include <initializer_list>
#include <string>namespace lsh
{template<class T>class vector{public:typedef T* iterator;typedef const T* const_iterator;iterator begin(){return _start;}const_iterator begin() const{return _start;}iterator end(){return _finish;}const_iterator end() const{return _finish;}vector():_start(nullptr),_finish(nullptr),_end_of_storage(nullptr){}vector(std::initializer_list<T> li):_start(nullptr), _finish(nullptr), _end_of_storage(nullptr){reserve(li.size());for (auto& c : li){push_back(c);}}vector(const vector<T>& v){reserve(v.capacity());for (auto& c : v){push_back(c);}}template<class InputIterator>vector(InputIterator first, InputIterator last){while (first != last){push_back(*first);first++;}}vector(size_t n, T val = T()){reserve(n);for (size_t i = 0; i < n; i++){push_back(val);}}vector(int n, T val = T()){reserve(n);for (size_t i = 0; i < n; i++){push_back(val);}}~vector(){if (_start){delete[] _start;_start = _finish = _end_of_storage = nullptr;}}void resize(size_t n, T val = T()){if (n < size()){_finish = _start + n;}else{reserve(n);while (_finish < _start + n){*_finish = val;_finish++;}}}size_t size()const{return _finish - _start;}size_t capacity()const{return _end_of_storage - _start;}void reserve(size_t n){size_t s = size();if (n > capacity()){T* tmp = new T[n];if (_start){for (int i = 0; i < s; i++){tmp[i] = _start[i];}delete [] _start;}_start = tmp;_finish = _start + s;_end_of_storage = _start + n;}}void push_back(const T& x){if (_finish == _end_of_storage){reserve(capacity() == 0 ? 4 : capacity() * 2);}*_finish = x;++_finish;}void swap(vector<T> v){std::swap(_start, v._start);std::swap(_finish, v._finish);std::swap(_end_of_storage, v._end_of_storage);}vector<T>& operator=(vector<T> v){swap(v);return *this;}T& operator[](size_t n){assert(n < size());return _start[n];}const T& operator[](size_t n) const{assert(n < size());return _start[n];}bool empty(){return _start == _finish;}void pop_back(){assert(_finish > _start);--_finish;}//存在迭代器失效,要返回更新后的迭代器iterator insert(iterator pos, const T& x){assert(pos >= _start && pos <= _finish);if (_finish == _end_of_storage){int n = pos - _start;reserve(capacity() == 0 ? 4 : capacity() * 2);pos = _start + n;}iterator i = _finish;while (i > pos){*i = *(i-1);i--;}*pos = x;++_finish;return pos;}iterator erase(iterator pos){assert(pos >= _start && pos < _finish);iterator i = pos;while (i < _finish -1){*i = *(i + 1);i++;}--_finish;return pos;}private:iterator _start = nullptr;iterator _finish = nullptr;iterator _end_of_storage = nullptr;};
}

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

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

相关文章

哪种护眼大路灯孩子用着最好?公认最好的护眼大路灯

哪种护眼大路灯孩子用着最好&#xff1f;最近也有不少家长关注到了孩子视力健康的这个情况&#xff0c;很着急开始寻找各种能够减少孩子因为不良光线影响视力健康的方法&#xff0c;其中大路灯以良好的表现成为家长们的首选&#xff0c;但快速发展的市场中&#xff0c;却涌入了…

Golang 逃逸分析(Escape Analysis)理解与实践篇

Golang 逃逸分析&#xff08;Escape Analysis&#xff09;理解与实践篇 文章目录 1.逃逸分析2.相关知识&#xff08;栈、堆、GC分析&#xff09;3.逃逸分析综合-实践 demo 逃逸分析&#xff08;Escape Analysis&#xff09;是编译器在编译期进行的一项优化技术&#xff0c;是Gl…

Qt QTableWidget多行表头、表头折行显示

表头折行显示 //方法一QVector<QString> chNames;chNames<<"表头1"<<"表头2长命名abcdefg";ui.tableWidget->setColumnCount(chNames.size()1);ui.tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem(QString::fromL…

【C】C语言常见概念~

C语言常见概念 转义字符 转义字符&#xff0c;顾名思义&#xff0c;转变原来意思的字符 比如 #include <stdio.h> int main() {printf("abcndef");return 0; }输出的结果为&#xff1a; 将代码修改一下&#xff1a; #include <stdio.h> int main(…

双目视觉搭配YOLO实现3D测量

一、简介 双目&#xff08;Stereo Vision&#xff09;技术是一种利用两个相机来模拟人眼视觉的技术。通过对两个相机获取到的图像进行分析和匹配&#xff0c;可以计算出物体的深度信息。双目技术可以实现物体的三维重建、距离测量、运动分析等应用。 双目技术的原理是通过两…

SpringBoot基础(五):集成JUnit5

SpringBoot基础系列文章 SpringBoot基础(一)&#xff1a;快速入门 SpringBoot基础(二)&#xff1a;配置文件详解 SpringBoot基础(三)&#xff1a;Logback日志 SpringBoot基础(四)&#xff1a;bean的多种加载方式 SpringBoot基础(五)&#xff1a;集成JUnit5 目录 一、JUnit…

敏捷开发 与 Scrum

‌敏捷开发的概念起源于20世纪90年代末期&#xff0c;旨在解决传统软件开发方法中存在的效率低下问题。‌ 传统软件开发方法因其繁琐的过程和对文档的严格要求&#xff0c;导致了“重型化危机”&#xff0c;这使得开发效率大幅下降。为了应对这些问题&#xff0c;敏捷方法应运…

微信小程序 - 01 - 一些补充和注意点(补充ing...)

目录 一、节流二、在一个发请求的函数中&#xff0c;只有发生下拉动作&#xff0c;才执行关闭下拉代码 最近在学微信小程序&#xff0c;把学习过程中的一些补充和注意点总结一下&#xff0c;内容会比较简单&#xff0c;因为只涉及基础知识&#xff0c;供个人参考 一、节流 情…

AIGC毕设项目分享:基于RAG的数字人对话系统及其应用

本研究的主要目标是设计并实现一个基于检索增强生成&#xff08;RAG&#xff09;技术的数字人对话系统&#xff0c;旨在提升数字人系统在多轮对话中的上下文管理、情境感知能力以及动态内容生成效果。系统结合了深度学习中的最新大语言模型技术&#xff0c;通过引入RAG框架来增…

K8S配置MySQL主从自动水平扩展

前提环境 操作系统Ubuntu 22.04 K8S 1.28.2集群&#xff08;1个master2个node&#xff09; MySQL 5.7.44部署在K8S的主从集群 metrics-server v0.6.4 概念简介 在K8s中扩缩容分为两种 ●Node层面&#xff1a;对K8s物理节点扩容和缩容&#xff0c;根据业务规模实现物理节点自动扩…

Python列表专题:list与in

Python是一种强大的编程语言,其中列表(list)是最常用的数据结构之一。列表允许我们存储多个元素,并且可以方便地进行各种操作。在Python中,in运算符被广泛用于检测元素是否存在于列表中。本文将深入探讨Python列表及其与in运算符的结合使用。 1. Python列表的基础 1.1 什…

爬虫案例——网易新闻数据的爬取

案例需求&#xff1a; 1.爬取该新闻网站——&#xff08;网易新闻&#xff09;的数据&#xff0c;包括标题和链接 2.爬取所有数据&#xff08;翻页参数&#xff09; 3.利用jsonpath解析数据 分析&#xff1a; 该网站属于异步加载网站——直接网页中拿不到&#xff0c;需要…

项目开发--基于docker实现模型容器化服务

背景 1、docker-compose build 和 docker-compose up -d分别是什么作用&#xff1f; 2、如何进入新构建的容器当中 3、模型保存的方法区别 4、如何让docker容器启动的时候能使用cuda进行模型推理加速 5、如何实现容器的迭代 解决方案 问题1 docker-compose build 和 docker…

WindowsAPI|每天了解几个winAPI接口之Iphlpapi.h网络配置相关文档详细分析三

上一篇&#xff1a;WindowsAPI|每天了解几个winAPI接口之Iphlpapi.h网络配置相关文档详细分析二 如果有错误欢迎指正批评&#xff0c;在此只作为科普和参考。 文章目录 GetTcpTable&GetExtendedTcpTable&#xff1a;获取TCP连接的信息GetOwnerModuleFromTcpEntry&#xff1…

MySQL-08.DDL-表结构操作-创建-案例

一.MySQL创建表的方式 1.首先根据需求文档定义出原型字段&#xff0c;即从需求文档中可以直接设计出来的字段 2.再在原型字段的基础上加上一些基础字段&#xff0c;构成整个表结构的设计 我们采用基于图形化界面的方式来创建表结构 二.案例 原型字段 各字段设计如下&…

深入理解线性表--顺序表

目录 顺序表- Seqlist -> sequence 顺序 list 表 顺序表的概念 问题与解答 顺序表的分类 静态顺序表 动态顺序表 问题与解答(递进式) 动态顺序表的实现 尾插 头插 尾删 头删 指定位置插入 指定位置删除 销毁 总结 前言&#xff1a;线性表是具有相同特性的一类数据结构…

2024 年 04 月编程语言排行榜,PHP 排名创新低?

编程语言的流行度总是变化莫测&#xff0c;每个月的排行榜都揭示着新的趋势。2024年4月的编程语言排行榜揭示了一个引人关注的现象&#xff1a;PHP的排名再次下滑&#xff0c;创下了历史新低。这种变化对于PHP开发者和整个技术社区来说&#xff0c;意味着什么呢&#xff1f; P…

现代数字信号处理I-P3 MVUE学习笔记

目录 1. 参数估计问题的提出与本质 2. 估计的性质 2.1 Ancillary&#xff08;多余估计&#xff09; 例1&#xff0c;Ancillary估计量 2. Uniformly Optimal 3. Sufficiency充分性 3.1 统计量充分性定义 例2&#xff1a;利用充分统计量定义获取伯努利分布的充分统计量 …

服务器源IP暴露后的安全风险及防御措施

在互联网安全领域&#xff0c;服务器的源IP地址泄露可能成为黑客攻击的切入点。本文将列举十种常见的攻击类型&#xff0c;并提供相应的防御建议&#xff0c;帮助管理员们更好地保护服务器免受潜在威胁。 一、引言 服务器源IP地址的暴露意味着攻击者可以直接针对服务器发起攻击…

Anaroute - 理论学习(一)

一、贡献&#xff1a; 框架能够在考虑特定约束的同时&#xff0c;高效地完成复杂AMS设计的布线&#xff0c;并实现签署质量的性能。 提出了一种对称性约束的分配算法&#xff0c;根据引脚位置分配合适的网络匹配要求新的引脚聚类策略&#xff0c;以实现规律性的布线模式&…