【C++】STL和vector容器

STL和vector容器

  • 基本概念
  • 六大组件
    • 容器
    • 算法
    • 迭代器
    • 容器算法迭代器
  • vector容器
    • 基本概念
    • vector构造函数
    • 赋值
    • vector的容量和大小
    • vector插入与删除
    • vector存取数据
      • 函数原型
    • vector互换容器
    • vector预留空间
    • vector容器嵌套容器

基本概念

长久以来,软件届一直希望建立一种可重复利用的东西,C++的面向对象和泛型编程思想,目的就是复用性的提升,大多情况下,数据结构和算法都未能有一套标准,导致被迫从事大量重复工作,为了建立数据结构和算法的一套标准,诞生了STL。STL称标准模板库,从广义上分为容器(container)、算法(algorithm)、迭代器(iterator)容器算法之间通过迭代器进行无缝连接,STL几乎所有的代码都采用了模板类或者模板函数。

六大组件

1、容器:各种数据结构,如vector、list、deque、set、map等,用来存放数据。
2、算法:各种常用的算法,如sort、find、copy、for_each等
3、迭代器:扮演了容器与算法之间的胶合剂
4、仿函数:行为类似函数,可作为算法的某种策略
5、适配器:一种用来修饰容器或者仿函数或迭代器接口的东西
6、空间配置器:负责空间的配置与管理

容器

放置物品的地方,STL容器就是将运用最广泛的一些数据结构实现出来。常用的数据结构:数组、链表、树、栈、队列、集合、映射表等。这些容器分为序列式容器和关联式容器两种,序列式容器,强调值的排序,序列式容器中的每个元素均有固定的位置;关联式容器,二叉树结构,各元素之间没有严格的物理上的顺序关系。

算法

问题的解法,有限的步骤,解决逻辑或数学上的问题叫做算法。算法分为质变算法和非质变算法。质变算法,是指运算过程中会更改区间内的元素的内容,例如拷贝、替换、删除等;非质变算法,是指运算过程中不会更改区间内的元素内容,例如查找、计数、遍历、寻找极值等等。

迭代器

容器和算法之间的粘合剂,提供一种方法,使之能够依序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表示方式,每个容器都有自己专属的迭代器,迭代器使用非常类似于指针,初学阶段可以理解为指针。
常用的容器中迭代器种类为双向迭代器和随机访问迭代器。

种类功能支持运算
输入迭代器对数据的只读访问只读,支持++、==、!=
输出迭代器对数据的只写访问只写,支持++
前向迭代器读写操作,并能向前推进迭代器读写,支持++、==、!=
双向迭代器读写操作,并能向前或向后操作读写,支持++
随机访问迭代器读写操作,可以以跳跃的方式访问任意数据,功能最强的迭代器读写,支持++、–、[n]、-n、<、<=、>、>=

容器算法迭代器

在例子中体现
例:迭代器:vector<int>::iterator

vector容器

基本概念

功能:vector数据结构和数组非常相似,也称单端数组
vector与普通数组区别:不同之处在于数组是静态空间,而vector可以动态扩展
动态扩展并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间。
动态扩展
vector容器的迭代器是支持随机访问的迭代器。

vector构造函数

创建vector容器
1、vector<T> v;采样模板实现类实现,默认构造函数
2、vector(v.begin(),v.end()); 将**v[begin(),end())**区间中的元素拷贝给本身
3、vector(n,elem); 构造函数将n个elem拷贝给本身
4、vector(const vector &vec); 拷贝构造函数

void test1() {vector<int> v1;//默认构造for (int i = 0;i < 5;i++) {v1.push_back(i);}p(v1);cout << endl;vector<int> v2(v1.begin(), v1.end());p(v2);cout << endl;vector<int>v3(5, 100);p(v3);cout << endl;vector<int>v4(v3);p(v4);cout << endl;
}

赋值

1、vector& operator=(const vector &vec);重载等号操作符
2、assign(beg,end);将[beg,end)区间中的数据拷贝赋值给本身
3、assign(n,elem);将n个elem拷贝给本身

void test1() {vector<int> v1;for (int i = 0;i < 5;i++) {v1.push_back(i);}p(v1);vector<int> v2;v2 = v1;p(v2);vector<int>v3;v3.assign(v1.begin(), v1.end());p(v3);vector<int>v4;v4.assign(5, 100);p(v4);
}

vector的容量和大小

1、empty();判断容器是否为空
2、capacity();容器的容量
3、size();返回容器中元素的个数
4、resize(int num);重新指定容器的长度为num,若容器变长,则以默认值0填充新位置;若容器变短,则末尾超出容器长度的元素被删除
5、resize(int num,elem);重新指定容器的长度为num,若容器变长,则以elem值填充新位置;若容器变短,则末尾超出容器长度的元素被删除

void test1() {vector<int> v1;for (int i = 0;i < 5;i++) {v1.push_back(i);}if (v1.empty()) {cout << "为空" << endl;}else {cout << "bu为空" << endl;cout << "容量:" <<v1.capacity()<< endl;cout << "大小:" << v1.size() << endl;}v1.resize(10,100);p(v1);v1.resize(4);p(v1);
}

在这里插入图片描述

vector插入与删除

1、push_back(ele);尾部插入元素ele
2、pop_back();删除最后一个元素
3、insert(const_iterator pos,ele);迭代器指向位置pos插入元素ele
4、insert(const_iterator pos,int count,ele);迭代器指向位置pos插入count个元素ele
5、erase(const_iterator pos);删除迭代器指向的元素
6、erase(const_iterator start,const_iterator end);删除迭代器从start到end之间的元素
7、clear();删除容器中的所有元素

void test1() {vector<int> vi;for (int i = 0;i < 10;i++) {vi.push_back(i * 10);}vi.pop_back();vector<int>::iterator it = vi.begin();for (it;it != vi.end();it++) {cout << *it << "\t";}vi.clear();cout << endl;cout << "清空后vi的个数" << vi.size() << endl;vi = { 1,2,3,4,5 };vi.insert(vi.begin(), 10);vi.insert(vi.begin() + 1, 60);vi.erase(vi.begin() + 2);vi.erase(vi.begin() + 3, vi.begin() + 5);vi.push_back(100);p(vi);
}

vector存取数据

存放内置数据类型可以查看:STL常用一些函数
算法:for_each
迭代器:vector<int>::iterator

函数原型

1、at(int index);返回索引index所指的数据
2、opterator[];返回索引index所指的数据
3、front();返回容器中第一个数据元素
4、back();返回容器中最后一个数据元素

class S {
public:int age;string name;S(string _n, int _a) {name = _n;age = _a;}
};
void test() {vector<int> vi;for (int i = 0;i < 10;i++) {vi.push_back(i * 10);}cout << "第一个元素" << vi.front() << endl;cout << "第一个元素" << vi.back() << endl;
}
void test1() {//存放指针(自定义类型数据)vector<S *> v;S s1("lisi", 18);S s2("Laola", 20);S s3("Tom", 23);S s4("Tony", 35);S s5("Qi", 24);v.push_back(&s1);v.push_back(&s2);v.push_back(&s3);v.push_back(&s4);v.push_back(&s5);for (vector<S *>::iterator i = v.begin();i != v.end();i++) {cout << "姓名:" << (*i)->name << "\t年龄:" << (*i)->age << endl;}
}

vector互换容器

实现两个容器内元素进行互换
swap(vec);将vec与本身的元素互换

void test1() {//基本使用vector<int> vi;for (int i = 0;i <5;i++) {vi.push_back(i * 10);}p(vi);vector<int> v2;for (int i = 5;i > 0;i--) {v2.push_back(i);}p(v2);vi.swap(v2);p(vi);p(v2);
}
void test1() {//实际使用,可以收缩空间vector<int> vi;for (int i = 0;i <1000;i++) {vi.push_back(i * 10);}cout << "vi第一次容量:" << vi.capacity() << endl;cout << "vi第一次大小:" << vi.size() << endl;vi.resize(5);cout << "vi第2次容量:" << vi.capacity() << endl;cout << "vi第2次大小:" << vi.size() << endl;//巧用swap收缩内存//vector<int>(vi)是匿名函数,用完一次系统会删除vector<int>(vi).swap(vi);cout << "vi第3次容量:" << vi.capacity() << endl;cout << "vi第3次大小:" << vi.size() << endl;
}

在这里插入图片描述

vector预留空间

减少vector在动态扩展容量时的扩展次数
reserve(int len);容器预留len个元素长度,预留位置不初始化,元素不可访问

void test1() {//实际使用,可以收缩空间vector<int> vi;vi.reserve(1000);int n = 0;//开辟次数int* p = NULL;for (int i = 0;i <1000;i++) {vi.push_back(i );if (p != &vi[0]) {p = &vi[0];n++;}}cout << n << endl;//1
}

vector容器嵌套容器

理清逻辑

void test1() {vector<vector<int>> v;//小容器vector<int> v1;vector<int> v2;vector<int> v3;vector<int> v4;vector<int> v5;//小容器放数据for (int i = 0;i < 5;i++) {v1.push_back(i + 1);v2.push_back(i + 2);v3.push_back(i + 3);v4.push_back(i + 4);v5.push_back(i + 5);}//大容器放数据v.push_back(v1);v.push_back(v2);v.push_back(v3);v.push_back(v4);v.push_back(v5);for (vector<vector<int>>::iterator i = v.begin();i != v.end();i++) {for (vector<int>::iterator it = (*i).begin();it != (*i).end();it++) {cout<<*it<<" ";}cout << endl;}
}

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

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

相关文章

基于 java+springboot+mybatis电影售票网站管理系统前台+后台设计和实现

基于 javaspringbootmybatis电影售票网站管理系统前台后台设计和实现 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承…

国内首个!亚信安全获得CCRC数据分类分级产品认证证书

亚信安全信数数据分类分级系统AISDC V1.0&#xff0c;荣获中国网络安全审查认证和市场监管大数据中心颁发的首个数据分类分级产品IT产品信息安全认证证书&#xff01;标志着亚信安全在大数据安全领域的强大技术实力以及专业研究&#xff0c;正式获得国内数据分类分级产品评定的…

通过LiveNVR实现海康大华华为宇视等监控摄像头在服务器上录像存储,并web无插件直播和回放

支持云端录像服务器上面集中录像存储在部署LiveNVR的服务器上面 1、流媒体服务软件2、配置开启录像(云端录像)3、录像回看(云端录像)3.1、查看录像3.1.1、时间轴视图3.1.2、列表视图 4、云端录像相关接口5、如何分享时间轴录像回看&#xff1f;6、iframe集成示例7、RTSP/HLS/FL…

centos 7 增加临时路由及永久路由

centos 7 增加临时路由及永久路由 如果增加临时路由&#xff0c;要先安装net-tools , sudo yum install net-tools route add -net 10.1.0.0 gw 10.1.1.1 netmask 255.255.0.0 意思是增加了一条动态路由&#xff0c;网关10.1.1.1 ,10.1.x.x 的所有ip都走这个网关 此种方式&am…

[框架系列]-[通用lock框架]集成及具体配置使用

目录 一&#xff1a;框架集成 1.添加pom依赖 2.开启lock配置 二&#xff1a;配置详细介绍 1.配置清单 2.具体配置介绍 &#xff08;1&#xff09;implementer &#xff08;2&#xff09;type &#xff08;3&#xff09;transactionStrategy &#xff08;4&#xff09…

Dev-Home:又一个开发人员控制中心神器,微软官方出品!

前两周&#xff0c;微软针对开发人员推出的windows控制中心&#xff1a;Dev-Home&#xff0c;迎来了0.9的预览版&#xff0c;这次重点的更新是支持Window 10了&#xff0c;之前一直都只支持Windows 11。 Dev-Home核心有两个功能&#xff1a;系统监控小组件和Gtihub扩展小组件。…

ISO 14229和UDS:汽车诊断的黄金标准

UDS简介&#xff1a; UDS是Unified Diagnostic Services的缩写&#xff0c;全名统一诊断服务。它是一种用于汽车电子控制单元&#xff08;ECU&#xff09;之间进行诊断和通信的标准协议&#xff0c;属于ISO 14229标准的一部分。 UDS的起源和背景&#xff1a; UDS的起源可以追…

一个处理Range List的面试题解法

大纲 题目解法Rangeaddremove ToolsRangeListaddremove 代码 最近看到一个比较有意思的面试题。题目不算难&#xff0c;但是想把效率优化做好&#xff0c;也没那么容易。 我们先看下题目 题目 // Task: Implement a class named RangeList // A pair of integers define a ra…

【C++】C++中的【文件IO流】使用指南 [手把手代码演示] & [小白秒懂]

前言 大家好吖&#xff0c;欢迎来到 YY 滴 系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Linux》…

JavaEE-自定义SSM-编写核心-解析yml文件

3.3.1 加载yml文件 编写yaml工厂&#xff0c;用于加载yml文件 package com.czxy.yaml;import java.io.InputStream;/*** 用于处理 application.yml文件* 1. 加载application.yml文件* 2. yaml工具类进行解析* Map<String, Map<String, Map<....>> >* …

Linux使用二进制包安装MySQL

目录 一、软件包下载 二、上传软件包到Linux根目录 1、使用xftp将软件包上传到根目录 2、解压缩 三、准备工作 四、初始化软件 五、设置MySQL的配置文件 六、配置启动脚本 一、软件包下载 官网下载&#xff1a;MySQL :: Download MySQL Community Server 二、上传软件…

AWTK 开源串口屏开发(8) - 系统设置

AWTK 开源串口屏开发 - 系统设置 系统设置只是一个普通应用程序&#xff0c;不过它会用 默认模型 中一些内置的属性和命令&#xff0c;所以这里专门来介绍一下。 1. 功能 在这个例子会用到 默认模型 中一些下列内置的属性和命令&#xff1a; 内置属性 属性类型说明rtc_yea…

【Unity3D日常开发】Unity3D中设置Text行首不出现标点符号

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 在开发中会遇到Text的文本内容行首出现标点符号的情况&#xf…

PyTorch初探:基本函数与案例实践

正文&#xff1a; 在熟悉了PyTorch的安装和环境配置后&#xff0c;接下来让我们深入了解PyTorch的基本函数&#xff0c;并通过一个简单的案例来实践这些知识。 1. 基本函数 PyTorch的核心是张量&#xff08;Tensor&#xff09;&#xff0c;它类似于多维数组&#xff0c;但可以…

Cesium加载地图-高德影像

废话不多说&#xff0c;直接上代码 整体代码 <template><div id"cesiumContainer" style"height: 100vh;"></div><div id"toolbar" style"position: fixed;top:20px;left:220px;"><el-breadcrumb><…

hive面试题

0. 思维导图 1. 简述Hive♥♥ 我理解的&#xff0c;hive就是一款构建数据仓库的工具&#xff0c;它可以就结构化的数据映射为一张表&#xff0c;并且可以通过SQL语句进行查询分析。本质上是将SQL转换为MapReduce或者spark来进行计算&#xff0c;数据是存储在hdfs上&#xff0c;…

【word】论文、报告:①插入图表题注,交叉引用②快速插入图表目录③删改后一键更新

【word】①插入图表题注&#xff0c;②删改后一键更新 写在最前面插入题注交叉引用修改插入题注的文字格式快速插入图表目录 插入题注后有删改&#xff0c;实现编号一键更新 &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2024每日百字篆刻时光&#xff0c;感谢你…

ubuntu安装mongod

1、安装 1.1包管理公钥导入 wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -执行结果截图如下&#xff1a; 1.2创建列表文件 lsb_release -dc 根据你的Codename 来修改下方对应的命令&#xff0c;如果你的是jammy&#xff0c;就修改为j…

Hive常见问题汇总

Hive和Hadoop的关系 Hive 构建在 Hadoop 之上&#xff0c; HQL 中对查询语句的解释、优化、生成查询计划是由 Hive 完成的 所有的数据都是存储在 Hadoop 中 查询计划被转化为 MapReduce 任务&#xff0c;在 Hadoop 中执行&#xff08;有些查询没有 MR 任务&#xff0c;如&…

防御保护---安全策略

文章目录 一.安全策略概述 概述&#xff1a; 安全策略的作用&#xff1a; 包过滤防火墙的安全风险 状态检测防火墙访问过程 安全策略与传统防火墙的区别 二.案例分析 基础配置&#xff1a;&#xff08;正常数通&#xff09; 安全策略配置 练习 一.安全策略概述 概述&#xff1…