C++标准模板(STL)- 类型支持 (std::size_t,std::ptrdiff_t,std::nullptr_t)

对象、引用、函数(包括函数模板特化)和表达式具有称为类型的性质,它限制了对这些实体所容许的操作,并给原本寻常的位序列提供了语义含义。


附加性基本类型及宏

sizeof 运算符返回的无符号整数类型

std::size_t

定义于头文件 <cstddef>

定义于头文件 <cstdio>

定义于头文件 <cstdlib>

定义于头文件 <cstring>

定义于头文件 <ctime>

typedef /*implementation-defined*/ size_t;

std::size_t 是 sizeof 运算符还有 sizeof... 运算符和 alignof 运算符 (C++11 起)所返回的一种无符号整数类型。

注意

size_t 可以存放下理论上可能存在的对象的最大大小,该对象可以是任何类型,包括数组。大小无法以 std::size_t 表示的类型是病式的。 (C++14 起)在许多平台上(使用分段寻址的系统除外),std::size_t 可以存放下任何非成员的指针,此时可以视作其与 std::uintptr_t 同义。

std::size_t 通常被用于数组索引和循环计数。使用其它类型来进行数组索引操作的程序可能会在某些情况下出错,例如在 64 位系统中使用 unsigned int 进行索引时,如果索引号超过 UINT_MAX 或者依赖于 32 位取模运算的话,程序就会出错。

在对诸如 std::string、std::vector 等 C++ 容器进行索引操作时,正确的类型是该容器的成员 typedef size_type,而该类型通常被定义为与 std::size_t 相同。

调用示例

#include <cstddef>
#include <iostream>int main()
{const std::size_t N = 10;int* a = new int[N];for (std::size_t n = 0; n < N; ++n){a[n] = n;}for (std::size_t n = N; n-- > 0;) // 对于无符号类型的逆向循环技巧。{std::cout << a[n] << " ";}delete[] a;return 0;
}

 输出

在两个指针相减时返回的有符号整数类型

std::ptrdiff_t

定义于头文件 <cstddef>

typedef /*implementation-defined*/ ptrdiff_t;

std::ptrdiff_t 是二个指针相减结果的有符号整数类型。

注意

std::ptrdiff_t 被用于指针算术及数组下标,若负值可行。使用其他类型,如 int 的程序,可能诸如 64 位的系统上失败,在当下标超过 INT_MAX 或依赖 32 位模算术时。

在用 C++ 容器库工作时,迭代器的差的准确类型是成员 typedef difference_type ,它常与 std::ptrdiff_t 相同。

只有指向同一数组元素的指针(含指向数组结尾后一位置的指针)可以相减。

若数组过大(大于 PTRDIFF_MAX 个元素,而小于 SIZE_MAX 字节),则二个指针的差可能无法以 std::ptrdiff_t 表示,二个这种指针相减的结果是未定义的。

对于短于 PTRDIFF_MAX 的 char 数组, std::ptrdiff_t 表现为 std::size_t 的有符号对应物:它可以存储数组的大小,而且在多数平台上等同于 std::intptr_t 。

调用示例

#include <cstddef>
#include <iostream>
#include <iomanip>int main()
{const std::size_t N = 100;int* a = new int[N];int* end = a + N;for (std::ptrdiff_t i = N; i > 0; --i){if (i % 10 == 0){std::cout << std::endl;}std::cout << std::setw(3) << (*(end - i) = i) << ' ';}std::cout << std::endl;delete[] a;return 0;
}

输出

空指针字面量 nullptr 的类型

std::nullptr_t

定义于头文件 <cstddef>

typedef decltype(nullptr) nullptr_t;

(C++11 起)

std::nullptr_t 是空指针字面量 nullptr 的类型。它是既非指针类型亦非指向成员指针类型的独立类型。

示例

若二个重载接受不同指针类型,则需要 std::nullptr_t 的重载以接受空指针常量。

 调用示例

#include <cstddef>
#include <iostream>void f(int* pi)
{std::cout << "Pointer to integer overload" << std::endl;
}void f(double* pd)
{std::cout << "Pointer to double overload" << std::endl;
}void f(std::nullptr_t nullp)
{std::cout << "null pointer overload" << std::endl;
}int main()
{int* pi;double* pd;f(pi);f(pd);f(nullptr);  // 无 void f(nullptr_t) 可能有歧义// f(0);  // 歧义调用:三个函数全部为候选// f(NULL); // 若 NULL 是整数空指针常量则为歧义// (如在大部分实现中的情况)return 0;
}

输出

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

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

相关文章

安装软件显示“为了对电脑进行保护,已阻止此应用”——已解决

我是在安装Tableau时遇到的这个情况。事情是这样的&#xff1a;我先安装了一次&#xff0c;发现安装选项错了&#xff0c;我就用360软件管家删除了&#xff0c;结果就没法按照教程使用管理员身份打开了&#xff0c;提示“为了对电脑进行保护&#xff0c;已阻止此应用”。 解决…

【CFD小工坊】浅水方程的离散及求解方法

【CFD小工坊】浅水方程的离散及求解方法 前言基于有限体积法的方程离散界面通量与源项计算干-湿网格的处理数值离散的稳定性条件参考文献 前言 我们模型的控制方程&#xff0c;即浅水方程组的表达式如下&#xff1a; ∂ U ∂ t ∂ E ( U ) ∂ x ∂ G ( U ) ∂ y S ( U ) U…

【已解决】 Expected linebreaks to be ‘LF‘ but found ‘CRLF‘.

问题描述 团队都是用mac&#xff0c;只有我自己是windows&#xff0c;启动项目一直报错 Expected linebreaks to be ‘LF‘ but found ‘CRLF‘. 但我不能因为自己的问题去改团队配置&#xff0c;也尝试过该vscode配置默认是LF还是报错 思路 看文章vscode如何替换所有文件的…

信创办公–基于WPS的EXCEL最佳实践系列 (数据整理复制粘贴)

信创办公–基于WPS的EXCEL最佳实践系列 &#xff08;数据整理复制粘贴&#xff09; 目录 应用背景操作步骤1、数据查找与替换2、复制或粘贴数据3、使用自动填充工具4、将数据拆分到多列5、应用数字格式 应用背景 数据的整理复制粘贴等在日常的工作中经常使用。本章内容主要学习…

修改switch Nand无线区码 以支持高频5G 信道

环境&#xff1a;NS switch 问题&#xff1a;日版&#xff0c;港版无法连接大于44信道的5G WIFI 解决办法&#xff1a;修改PRODINFO.dec的WIFI 区域码 背景&#xff1a;我的switch是最早买的港版的一批&#xff0c;WIFI 只能连接日本的信道&#xff0c;家里的路由器是国行的&am…

黑豹程序员-CSS四种样式的定义方式及冲突后的就近原则

4种样式定义 浏览器缺省设置&#xff08;即默认&#xff09;外部样式表&#xff08;引用的css&#xff09;内部样式表&#xff08;位于 标签内部&#xff09;内联样式&#xff08;在 HTML 元素内部&#xff09; 样式冲突如何解决&#xff1f; 若多重样式将层叠为一个&#x…

CentOS安装OpenNebula(二)

被控端部署&#xff1a; 先要配置好yum源&#xff1a; [rootmaster yum.repos.d]# vim opennebula.repo[rootmaster yum.repos.d]# cat opennebula.repo [opennebula] nameopennebula baseurlhttps://downloads.opennebula.org/repo/5.6/CentOS/7/x86_64 enabled1 gpgkeyhttps…

WSL2安装历程

WLS2安装 1、系统检查 安装WSL2必须运行 Windows 10 版本 2004 及更高版本&#xff08;内部版本 19041 及更高版本&#xff09;或 Windows 11。 查看 Windows 版本及内部版本号&#xff0c;选择 Win R&#xff0c;然后键入winver。 2、家庭版升级企业版 下载HEU_KMS_Activ…

如何开发物联网 APP?

如何开发物联网 APP? 这个问题本身是不严谨的&#xff0c;APP只是手机端的一个控制或者用于显示的人机交互页面&#xff0c;物联网是通过传感器&#xff0c;物联网卡等模块把物体接入网络以方便远程监控或者控制等。 你问的应该是怎么开发出来一个远程控制物体的APP吧&#x…

数学建模Matlab之数据预处理方法

本文综合代码来自文章http://t.csdnimg.cn/P5zOD 异常值与缺失值处理 %% 数据修复 % 判断缺失值和异常值并修复&#xff0c;顺便光滑噪音&#xff0c;渡边笔记 clc,clear;close all; x 0:0.06:10; y sin(x)0.2*rand(size(x)); y(22:34) NaN; % 模拟缺失值 y(89:95) 50;% 模…

POJ 3109 Inner Vertices 离散化+树状数组

一、题目大意 围棋棋盘&#xff0c;如果某个坐标上下左右的四个方向都存在棋子&#xff0c;那么ans1&#xff0c;根据输入的棋子数量&#xff0c;求出ans的数量。 二、解题思路 题目中有说到如果程序不会结束&#xff0c;那么输出-1&#xff0c;这其实是无源之水&#xff0c…

Linux下基本指令(上)

文章内容&#xff1a; 1. ls 指令 语法&#xff1a; ls [选项][目录或文件] 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及其他信息。 单个ls显示当前目录下的文件和目录 常用选项&#…

Vue iconfont-阿里巴巴矢量图标库用法

一、vue使用 选择心仪的图标 加入购物车 点击右上角购物车&#xff0c;点击添加至项目 在资源管理 可以看到我的项目 进入项目设置勾选彩色 点击下载到本地 解压压缩包 在main.js文件内导入css文件 import "/assets/font_icon/iconfont.css"; 使用&#xff1a; 复…

Java开源工具库使用之Lombok

文章目录 前言一、常用注解1.1 AllArgsConstructor/NoArgsConstructor/RequiredArgsConstructor1.2 Builder1.3 Data1.4 EqualsAndHashCode1.5 Getter/Setter1.6 Slf4j/Log4j/Log4j2/Log1.7 ToString 二、踩坑2.1 Getter/Setter 方法名不一样2.2 Builder 不会生成无参构造方法2…

Ubuntu Qt 5.15.2 支持 aarch64

概述 AArch64是ARMv8 架构的一种执行状态。 为了更广泛地向企业领域推进&#xff0c;需要引入64 位构架。 同时也需要在ARMv8 架构中引入新的AArch64 执行状态。 AArch64 不是一个单纯的32 位ARM 构架扩展&#xff0c;而是ARMv8 内全新的构架&#xff0c;完全使用全新的A64 指令…

黑豹程序员-架构师学习路线图-百科:Git/Gitee(版本控制)

文章目录 1、什么是版本控制2、特点3、发展历史4、SVN和Git比较5、Git6、GitHub7、Gitee&#xff08;国产&#xff09;8、Git的基础命令 1、什么是版本控制 版本控制系统&#xff08; Version Control &#xff09;版本控制是一种管理和跟踪软件开发过程中的代码变化的系统。它…

【Python】time模块和datetime模块的部分函数说明

时间戳与日期 在说到这俩模块之前&#xff0c;首先先明确几个概念&#xff1a; 时间戳是个很单纯的东西&#xff0c;没有“时区”一说&#xff0c;因为时间戳本质上是经过的时间。日常生活中接触到的“日期”、“某点某时某分”准确的说是时间点&#xff0c;都是有时区概念的…

C#,数值计算——Ranq1的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// Recommended generator for everyday use.The period is 1.8E19. Calling /// conventions same as Ran, above. /// </summary> public class Ranq1 { …

2023版 STM32实战4 滴答定时器精准延时

SysTick简介与特性 -1- SysTick属于系统时钟。 -2- SysTick定时器被捆绑在NVIC中。 -3- SysTick可以产生中断,且中断不可屏蔽。 SysTick的时钟源查看 通过时钟树可以看出滴答的时钟最大为72MHZ/89MHZ 通过中文参考手册也可以得到这个结论 代码编写&#xff08;已经验证&a…

嵌入式Linux应用开发-基础知识-第十九章驱动程序基石②

嵌入式Linux应用开发-基础知识-第十九章驱动程序基石② 第十九章 驱动程序基石②19.3 异步通知19.3.1 适用场景19.3.2 使用流程19.3.3 驱动编程19.3.4 应用编程19.3.5 现场编程19.3.6 上机编程19.3.7 异步通知机制内核代码详解 19.4 阻塞与非阻塞19.4.1 应用编程19.4.2 驱动编程…