【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;
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解决 github.com port 443: Timed out 的问题

国内访问github.com总是那么不竟如人意&#xff0c;时而无法加载网页&#xff0c;时而等我们抽完了一根烟后&#xff0c;它还处于转圈的状态。 虽然国内有gitee.com等诸多的代码托管平台&#xff0c;但却鲜有国人愿意去呢&#xff1f;其中的缘由&#xff0c;想必也不用我多说&a…

SkiaSharp:.NET强大而灵活的跨平台图形库

在.Net 6之前&#xff0c;我们一般是使用System.Drawing.Common来生成图像。 但在.Net 6平台需要配置&#xff0c;才能在非Windows平台使用System.Drawing.Common。而从.Net 7开始&#xff0c;非Windows不再允许使用&#xff0c;官方也给我们推荐了几个替代库。 今天我们一起来…

MySQL索引类型及数据结构【笔记】

1 索引类型 返回面试宝典 主键索引&#xff08;PRIMARY&#xff09;:数据列不允许重复&#xff0c;不允许为NULL&#xff0c;一个表只能有一个主键。 唯一索引&#xff08;UNIQUE&#xff09;:数据列不允许重复&#xff0c;允许为NULL&#xff0c;一个表允许多个列创建唯一索引…

软考之项目管理

一、考点分布 盈亏平衡分析&#xff08;※&#xff09;进度管理&#xff08;※※※&#xff09;软件质量管理&#xff08;※※&#xff09;软件配置管理&#xff08;※※&#xff09; 二、盈亏平衡分析 正常情况下&#xff0c;销售额固定成本可变成本税费利润 盈亏平衡下&#…

JDK8新特性:Stream

Stream 认识Stream 也叫Stream流&#xff0c;是jdk8开始新增的一套API&#xff08;java.util.stream.*&#xff09;&#xff0c;可以用于操作集合或者数组的数据。优势&#xff1a;Stream流大量的结合了Lambda的语法风格来编程&#xff0c;提供了一种更强大&#xff0c;更加简…

SSH:加密安全访问网络的革命性协议

目录 博客前言 一.ssh介绍 1.为什么需要SSH&#xff1f; 2.SSH是如何工作的&#xff1f; 连接建立 版本协商 算法协商 密钥交换 用户认证 会话请求 会话交互 3.SSH和SSL的区别 二.实战&#xff08;centos配置密钥&#xff09; 2.1.ssh/里面的文件作用解释 2.1 配…

【C++】std::variant

上一篇文章讲到了 union&#xff0c;union union存在很多问题&#xff0c;因此C17设计了一个新的variant替代原来的union。 union的问题 无法知道当前使用的类型是什么。而且union无法自动调用底层数据成员的析构函数。 这些使得一般只对一些“基本类型”使用union&#xf…

处理 Maven jar 包下载失败问题

目录 1、配置国内 Maven 源 配置和检测 settings.xml 配置国内源 2、删除本地 maven 创库的 jar 重新下载 3、其他问题 一般情况下 maven jar 包下载不成功可能有两种情况&#xff1a; 1&#xff09;没有配置国内源 2&#xff09;jar 包需要重新下载 下面详细讲解如何解决这两…

机器学习 | 利用Pandas进入高级数据分析领域

目录 初识Pandas Pandas数据结构 基本数据操作 DataFrame运算 文件读取与存储 高级数据处理 初识Pandas Pandas是2008年WesMcKinney开发出的库&#xff0c;专门用于数据挖掘的开源python库&#xff0c;以Numpy为基础&#xff0c;借力Numpy模块在计算方面性能高的优势&am…

【计网·湖科大·思科】实验二 计算机网络的寻址问题

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

物联网IOT: 风浆叶片拧紧装配及实时监测系统

某大型风电设备,通过机器人应用与精益化生产体系的融合,打造出行业领先的具备柔性生产能力的“脉动式”生产体系。同时在关键工序上。其中,在叶片装配等关键工序上使用由智能机器人代替人工,以提高生产的效率和装配质量可靠性,将六轴机器人、视觉系统、光电系统、液压、气动、伺…

RISC-V常用汇编指令

RISC-V寄存器表&#xff1a; RISC-V和常用的x86汇编语言存在许多的不同之处&#xff0c;下面将列出其中部分指令作用&#xff1a; 指令语法描述addiaddi rd,rs1,imm将寄存器rs1的值与立即数imm相加并存入寄存器rdldld t0, 0(t1)将t1的值加上0,将这个值作为地址&#xff0c;取…

科技助力“双碳”:墨水屏电子桌牌在绿色办公中的作用

随着科技的发展&#xff0c;人们对绿色环境可持续发展也越来越重视&#xff0c;所以&#xff0c;我国在几年前&#xff0c;就提出了“双碳”政策&#xff08;即碳达峰与碳中和的简称。2020年9月中国明确提出2030年“碳达峰”与2060年“碳中和”目标&#xff09;&#xff0c;而作…

DNS欺骗

DNS(域名系统)作为当前全球最大 、最复杂的分布式层次数据库系统&#xff0c;具有着开放、庞大、复杂的特性。它为全球用户提供域名解析服务&#xff0c;是互联网的重要基础设施。但由于其在设计之初未考虑安全性、人为破坏等因素 &#xff0c;DNS系统在互联网高度发达的今天面…

Python之数据可视化(地图)

目录 一 基础地图应用 二 全国疫情图 一 数据准备 二 数据处理 二 湖北省疫情图 一 数据准备 二 数据处理 一 基础地图应用 导入map地图对象 from pyecharts.charts import Map map Map() 写入数据 data [("北京市",100),("上海市"…

详细解读vcruntime140_1.dll修复的手段,如何快速解决vcruntime140_1.dll丢失问题

当出现“无法找到vcruntime140_1.dll”或程序“未能正常启动”时&#xff0c;这通常指示系统中缺失了一个关键文件&#xff1a;vcruntime140_1.dll。作为Visual C Redistributable组件的一部分&#xff0c;这个小文件在很多用Visual Studio编译的C程序运行时发挥着重要作用。解…

OJ_叠框问题

问题描述 c语言实现 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> using namespace std;int main() {int n; //存放外框尺寸int a,b; //存放两个字符char matrix[100][100] { 0 };//全部初始化为休止符/0while (scanf("%d %c %c&…

【开源】基于JAVA的实验室耗材管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 耗材档案模块2.2 耗材入库模块2.3 耗材出库模块2.4 耗材申请模块2.5 耗材审核模块 三、系统展示四、核心代码4.1 查询耗材品类4.2 查询资产出库清单4.3 资产出库4.4 查询入库单4.5 资产入库 五、免责说明 一、摘要 1.1…

IntelliJ IDEA 快捷键大全

IntelliJ IDEA 快捷键大全 一、文本编辑二、构建、编译项目 一、文本编辑 CtrlN 查找类 CtrlN 查找文件 CtrlF 查找文本 可以根据需求去选择红框内的选项 CtrlX 剪切 剪切选中文本&#xff0c;如果未选中则剪切当前行CtrlC 复制 复制选中文本&#xff0c;如果未选中则复制当前…

机房环境动力监控系统:S275远程控制网关助力高效管理

现场问题 1、机房安全隐患 机房存在意外断电、温湿度过高过低、漏水断路等隐患&#xff0c;传统监测手段难以提前发现和预警。 2、机房远程运维困难 因环境改变、非授权活动、设备状态变化等引起的事故&#xff0c;难以满足机房远程运维的可靠管控要求。 3、机房改造成本高…