9.2 容器库概览

news2024/11/19 14:36:51

文章目录

      • 所有容器的共性:
    • 迭代器
      • 迭代器的范围
    • 容器类型成员
    • begin和end成员
    • 容器的定义和初始化
      • 与顺序容器大小相关的构造函数
    • 赋值和swap
      • assigned
      • swap
    • 容器大小操作
    • 关系运算符

所有容器的共性:

表格一:

类型别名说明
iterator迭代器
const_iterator只读迭代器
size_type无符号整型,类型可容纳最大容器大小
difference_type带符号整型,类型可容纳最大两迭代器距离
value_type元素类型
reference引用,即value_type&
const_reference常量引用

C为具体的容器,c为容器名:

表格二:

构造函数说明
C c;默认,构造空容器
C c1(c2);构造c2的拷贝c1
C c1 = c2;构造c2的拷贝c1
C c(b,e);使用迭代器,将迭代器b~e范围内元素拷贝到c。(array不适用)
C c{a,b,c…}列表初始化,注意使大括号,代表着类型要相匹配
C c = {a,b,c…}列表初始化,注意使大括号,代表着类型要相匹配

表格三:

赋值与swap说明
c1=c2将c1当中的元素替换为c2当中的元素
c1={a,b,c······}将c1当中的元素替换为列表当中的元素(array不适用)
a.swap(b)交换a和b当中的元素
swap(a,b)与上面等价

表格四:

大小说明
c.size();c当中元素的数目(不支持forward_list)
c.max_size()c当中最大可以保存的容量
c.empty()c是否为空容器,如果为空返回true,不为空返回false

表格五:

添加/删除元素(不适用于array)说明
c.insert(args)将args当中的元素拷贝到c当中
c.emplace(inits)使用inits构造c当中的一个元素
c.erase(args)删除args指定的元素
c.clear()清空c当中的所有元素

表格六:

关系运算符说明
==、!=所有容器都支持相等不等运算符
<、<=、>、>=关系运算符(无序关联容器不支持)

表格七:

获取迭代器
c.begin(),c.end()返回c容器的首元素和尾元素后面的位置的迭代器
c.cbegin(),c.cend()返回常量迭代器 const_iterator

表格八:

反向容器的额外成员(不支持forward_list)说明
reverse_iterator按逆序寻址元素的迭代器
const_reverse_iterator不能修改元素的逆序元素的迭代器
c.rbegin(),c.rend()返回指向尾元素位置和首元素前一位位置的迭代器
c.crbegin(),c.crend()返回const_reverse_iterator

迭代器

迭代器具有公共接口,允许通过迭代器访问容器中的元素,以及递增递减,以及使用解引用进行访问容器中的元素。对于单向链表(forward_list)不能递减,迭代器支持的算术运算只应用于string、vector、deque和array。

迭代器的范围

  1. 左闭右开区间[begin,end)
  2. begin和end需要指向同一容器中的元素。
  3. begin和end有多个版本,如cbegin、rbegin、crbegin等。带r为反向,带c为const。

容器类型成员

实际上见上表格一和表格八
主要用处:(后续会再继续讲解,下面只是举个例子,可以理解一下)

lsit<string>::reverse_iterator iter_beg = c.rbegin()

begin和end成员

只列出begin的例子,end同理

	list<string > list1 = { "hello"," ","world" };
	auto iter1 = list1.begin(); //list<stirng>::iterator
	auto iter2 = list1.cbegin();//list<string>::const_iterator
	auto iter3 = list1.crbegin();//list<string>::const_reverse_iterator
	auto iter4 = list1.rbegin();//list<string>::reverse_iterator

容器的定义和初始化

对于顺序容器(不包括array)来说除了上面表格二的共性,还有下面的两种方式:

构造说明
C c(n,t)包含n个初始值为t的元素
C c(n)包含n个元素(string不适用)

当将一个容器初始化为另一个容器的拷贝时,两个容器的容器类型和元素类型都必须相同。

	list<string > l = { "hello"," ","world" };
	vector<const char* > v = { "a","an","the" };

	list<string> ll(v.begin(),v.end());//正确的,实际上是将迭代器之间的数据一个个传入,进行赋值操作,并且const char*是可以转换为string类型的,所以正确。
	list<string> lll(v);//错误的,v的类型是vector,lll的类型是list,类型不一致。
	list<int> llll(v);//错误const char*无法转化为int类型

由上得到,我们可以通过控制迭代器,进行相关数量的赋值操作:

	list<string> ll(v.begin(),iter);//通过控制iter所处的位置来进行操控复制的位次,相同的v.begin()也可以进行修改。

与顺序容器大小相关的构造函数

样例:

#include<iostream>
#include<list>
#include<vector>
#include<forward_list>
#include<deque>
#include<array>
#include<string>

using namespace std;

int main() 
{
	list<string > l = { "hello"," ","world" };//构造出含有三个指定元素的容器list
	vector<int> v(10, -1);//构造出含有10个-1的容器vector
	forward_list<int> f(10);//构造出含有10个默认0的容器forward_list
	deque<string> d(10);//构造出含有10个默认为空的容器deque

	//array需要显式的标出其内存大小,值得关注的是数组容器和内置数组不一样,内置数组不允许赋值,数组容器允许赋值,但是需要有相同的大小。

	array<int, 10> a = { 1 };//a[0]为1,其余9个位置为默认0的容器array
	array<int, 10> aa = a;//正确
	//array<int, 11> aaa = a;//错误对于拷贝赋值来说需要相同大小
	return 0;
}

注意点:标准库array需要有固定大小。

赋值和swap

上述表格三满足所有的容器都有的共性操作。

这边举一些具有的特性:

函数assign(不适用于关联容器和array)说明
c.assign(b,e)将c当中的元素替换成迭代器b~e之间的数据
c.assign(i1)将c当中的元素替换成初始化列表i1当中的数据
c.assign(n,t)将c当中的元素替换成n个t

assigned

样例:

#include<iostream>
#include<list>
#include<string>

using namespace std;

int main() 
{
	list<string > l = { "hello"," ","world" };//构造出含有三个指定元素的容器list
	l.assign(3, "hi");
	for (auto i = l.begin();i!=l.end();i++)
	{
		cout << *i << " ";
	}
	
	return 0;
}

输出结果:
在这里插入图片描述

swap

交换a、b,交换函数swap速度很快(常数时间),除array外,不对任何元素进行拷贝、删除、插入操作。交换两个array,array容量必须保持一致,会真正交换他们的元素。

对string进行swap,其指针、迭代器和引用会失效;对array进行swap,其指针、迭代器和引用会指向新交换后的值;对于其他容器,指向容器的指针、迭代器和引用等不会失效,会属于另一个容器

容器大小操作

除了一个例外,每个容器类型都有三个与大小相关的操作。成员函数size返回容器中元素的数目; empty当size为0时返回布尔值true,否则返回false; max_size 返回一个大于或等于该类型容器所能容纳的最大元素数的值。forward_ list支持max_size 和empty,但不支持size,原因我们将在之后解释。

关系运算符

==!=
<><=>= %支持有序容器,左右两边必须是相同类型容器

至于比较方式和string类似,这边不进行详细介绍

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

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

相关文章

用R语言理解全微分

文章目录6 全微分梯度的概念全微分前情提要 R语言微积分极限π,e,γ\pi, e, \gammaπ,e,γ洛必达法则连续性和导数数值导数差商与牛顿插值方向导数 6 全微分 梯度的概念 对于任意函数f(x0,x1,⋯,xn)f(x_0,x_1,\cdots,x_n)f(x0​,x1​,⋯,xn​)&#xff0c;其梯度为 ∇f(∂f∂…

解决从BIOS选择从U盘启动但是系统仍然从硬盘启动的问题

我怀疑是BIOS失去了记忆能力&#xff0c;不能记住我的选择&#xff0c;所以仍然按默认从硬盘启动。 解决&#xff1a;重置BIOS即可 下面用物理方法重置BIOS。 在主板上找到这三根针&#xff0c;将上面的黑色套子拔出&#xff0c;然后插入旁边的另外两根针&#xff0c;例如开始…

基于python知识图谱医疗领域问答系统实现

直接上结果展示: “让人类永远保持理智,确实是一种奢求” ,机器人莫斯,《流浪地球》 项目概况 本项目为一个使用深度学习方法解析问题,知识图谱存储、查询知识点,基于医疗垂直领域的对话系统的后台程序 运行效果:

aws beanstalk 结合packer创建自定义平台

参考资料 https://github.com/aws-samples/eb-custom-platforms-samples#updating-packer-templateElastic Beanstalk 自定义平台 今天使用eb平台创建环境的时候&#xff0c;发现有名为packer的选项&#xff0c;查询文档发现aws beanstalk支持自定义平台&#xff0c;这功能几…

4. 使用预训练的PyTorch网络进行图像分类

4. 使用预训练的PyTorch网络进行图像分类 这篇博客将介绍如何使用PyTorch预先训练的网络执行图像分类。利用这些网络只需几行代码就可以准确地对1000个常见对象类别进行分类。这些图像分类网络是开创性的、最先进的图像分类网络&#xff0c;包括VGG16、VGG19、Inception、Dens…

windows下 pytorch的安装(gpu版本以及cpu版本)

一. 查看是否有gpu 打开cmd 输入nvidia-smi 是以下这种情况的就是有gpu 没有gpu的话就会报错 下载安装cuda以及cudnn&#xff08;安装cpu版本可以跳过此步骤直接进行pytorch的安装&#xff09; 下载cuda 看清楚两个箭头指的地方 一个是11.3.0 一个是日期 后面下载cudnn的时…

ProEssentials Pro 9.8.0.32 Crack

ProEssentials .Net图表组件用于对您的科学、工程和金融图表进行评估和选择&#xff01; Winforms 图表, WPF 图表, C/MFC/VCL 图表. Gigasoft拥有20多年帮助企业开发大型客户端和嵌入式图表项目的经验 为何选择ProEssentials&#xff1f; 我们真诚地希望您能针对您的具体实施…

day03 链表 | 203、移除链表元素 707、设计链表 206、反转链表

题目 203、移除链表元素 删除链表中等于给定值 val 的所有节点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff1a;[1,2,3,4,5] 示例 2&#xff1a; 输入&#xff1a;head [], val 1 输出&#xff1a;[] 示例 3&#xff1a; 输入&am…

Pytorch Kaggle实战:House Prices - Advanced Regression Techniques

通过Kaggle比赛&#xff0c;将所学知识付诸实践 目录 1、下载和缓存数据集 2、访问和读取数据集 3、数据预处理 3、训练 4、K折交叉验证 5、模型选择 6、提交Kaggle预测 1、下载和缓存数据集 建立字典DATA_HUB,它可以将数据集名称的字符串映射到数据集相关的二元组上&am…

网络抓包-抓包工具tcpdump的使用与数据分析

1.测试背景 本次测试选用两台不同的服务器&#xff0c;ip分别为.233和.246,233服务器为客户端&#xff0c;246服务器为服务端。利用tcp协议就行socket通信。socket网络编程部分示例代码为基本的通信代码&#xff0c;需要了解tcp网络通讯的基本协议与过程。服务器上采用tcpdump…

【学习笔记】【Pytorch】八、池化层

【学习笔记】【Pytorch】八、池化层学习地址主要内容一、最大池化操作示例二、nn.MaxPool2d类的使用1.使用说明2.代码实现三、池化公式学习地址 PyTorch深度学习快速入门教程【小土堆】. 主要内容 一、最大池化操作示例 二、nn.MaxPool2d类的使用 作用&#xff1a;对于输入信…

Min_25筛

概述 Min_25是日本一个ACM选手的ID&#xff0c;这个筛法是他发明的&#xff0c;所以称之为Min_25筛。它能在亚线性复杂度求出一类积性函数的 fff 的前缀和&#xff0c;前提 是这个积性函数在质数和质数的幂位置的函数值比较好求。借助埃拉托色尼筛的思想 将原问题转化成与质因…

华为PIM-SM 动态RP实验配置

目录 建立PIM SM邻居 配置DR 配置动态RP 组成员端DR上配置IGMP 配置PIM安全 配置SPT切换 配置Anycast RP 配置接口的IP地址&#xff0c;并配置路由协议使得全网互通 建立PIM SM邻居 AR5操作 multicast routing-enable 开启组播路由转发功能 int g0/0/0 pim sm …

MacOS对文件夹加密的方法

背景 MacOS没有那种类似于windows那种对文件夹加解密的软件&#xff0c;MacOS自带有一种加解密&#xff0c;但是其实使用体验上跟windows那种很不一样。 win上的加解密都很快&#xff0c;就好像仅仅对文件夹进行加解密&#xff08;我估计是安全性较低的&#xff0c;因为加密过…

【JavaSE】异常的初步认识

目录 1、初步认识异常 1、算数异常 2、空指针异常 3、数组越界异常 2、异常的结构体系 3、异常的分类 1、编译时异常/受查异常 2、运行时异常/非受查异常 4、异常的处理 1、处理异常的编程方式&#xff08;防御式编程&#xff09; 1、事前防御性&#xff08;LBYL&a…

【软件测试】软件测试基础知识

1. 什么是软件测试 软件测试就是验证软件产品特性是否满足用户的需求 2. 调试与测试的区别 目的不同 调试&#xff1a;发现并解决软件中的缺陷测试&#xff1a;发现软件中的缺陷 参与角色不同 调试&#xff1a;开发人员测试&#xff1a;测试人员&#xff0c;开发人员等&a…

软件测试复习04:动态测试——黑盒测试

作者&#xff1a;非妃是公主 专栏&#xff1a;《软件测试》 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录等价划分法边值分析法错误推测法因果图法示例习题等价划分法 等价类&#xff1a;一个几何&#xf…

如何快速搭建自己的阿里云服务器(宝塔)并且部署springboot+vue项目(全网最全)

&#x1f4e2;欢迎点赞&#x1f44d;收藏⭐留言&#x1f4dd;如有错误敬请指正&#xff01; 文章目录&#x1f4e2;欢迎点赞&#x1f44d;收藏⭐留言&#x1f4dd;如有错误敬请指正&#xff01;一、前言二、准备工作1、新手申请2、安全组设置3、修改实例4.这里可以 直接用阿里云…

【图像处理OpenCV(C++版)】——4.2 对比度增强之线性变换

前言&#xff1a; &#x1f60a;&#x1f60a;&#x1f60a;欢迎来到本博客&#x1f60a;&#x1f60a;&#x1f60a; &#x1f31f;&#x1f31f;&#x1f31f; 本专栏主要结合OpenCV和C来实现一些基本的图像处理算法并详细解释各参数含义&#xff0c;适用于平时学习、工作快…

【数据结构】5.7 哈夫曼树及其应用

文章目录前言5.7.1 哈夫曼树的基本概念哈夫曼树的特点5.7.2 哈夫曼树的构造算法哈夫曼树的构造过程哈夫曼算法的实现算法思路算法实现5.7.3 哈夫曼编码哈夫曼编码思想前缀编码哈夫曼编码哈夫曼编码的性质哈夫曼编码的算法实现文件的编码和解码前言 编程&#xff1a;将学生的百…