《C++标准库》第5章 通用工具

《C++标准库》第5章 通用工具

pair和tuple

便捷函数make_pair()

Template函数make_pair(),能够让我们无须写出类型就能生成一个pair对象。

image-20210330085507670

image-20210330085524764

make_pair函数的自动推断有时候可能并非用户所想,一个表达式用户明白的指出类型时,产生出来的pair将有绝对明确的类型

image-20210330085744504

Tuple(不定数的值组)

image-20210330085851771

Tuple中的每个类型由默认构造函数初始化,基础类型都会被初始化为0
get函数所需要的index必须在编译期已知,运行期再传入一个值是不被允许的:

image-20210330090106740

便捷函数ref和cref应用于Tuple

image-20210330090448572

image-20210330090400414

智能指针

shared_ptr

显式构造函数不能使用赋值符

image-20210330090644907

image-20210330090725479

对付Array

shared_ptr提供的默认删除器调用的是delete,而不是delete[]。这意味着如果我们想要使用指针指针指向一个数组,我们需要自定义delete[]删除器

image-20210330091043201

不要误用shared_ptr

image-20210330091233624

第二个智能指针不要传底层指针作为参数,而是得传第一个智能指针作为参数

reset函数

image-20210330091354098

Unique_ptr

不可以对unique_ptr执行copy和assign

image-20210330091538084

image-20210330091554729

注意第三个语句,可以传一个右值unique_ptr作为构造函数的参数

赋予新值必须是unique_ptr

image-20210330091746076

unique_ptr转移的源头和去处

函数端:

image-20210330091904381

unique_ptr作为函数实参,传参要使用move语义

供应端:

image-20210330092014468

函数返回一个右值指针

习惯将unique_ptr当作成员

image-20210330092130351

数据成员包含unique_ptr,在构造函数传入对应的数据时对ptr进行初始化。这样就可以预防因构造函数产生异常而导致的资源泄漏。这样处理之后甚至不用写构造函数,因为智能指针在对象销毁时会自动释放资源。

但此时我们应该写出copy构造函数和赋值操作符。如果没有自行提供,编译器将会默认生成move语义版本

对付array,偏特化

image-20210330092701847

该class不接受一个派生类型的array作为初值,所以在array身上起不了多态作用

智能指针结语

shared和weak指针内部都需要额外的辅助对象,以内部pointer指向(引用计数器等)。这会导致额外的内存开销,无法进行许多优化动作。

Unique_ptr 则完全不需要这样的额外开销,使用它和使用原生指针效率几乎相同

数值的极值

class numerical_limit<>

该模板类中含有内置数值类型的很多信息,它们以类的静态数据和静态函数的形式存在,大多数成员被声明为constexpr,它们在编译期就可以进行访问

image-20210331104539663

image-20210331104547515

用例:

image-20210331104738552

Type Trait和Type Utility

基本用法举例

type Trait是用来处理类型属性的办法。它是个template,可在编译期根据一个或多个template实参产出一个type或value

image-20210331105049919

上述例子就用到了type Trait来判断传入类型是否为指针,将其改为重载函数的形式:

image-20210331105208438

image-20210331105217305

在调用重载函数时使用type trait,根据传入的是std::true_type还是std::false_type来判断是否为指针。

处理共通类型

当两个不同类型的值进行运算时,该返回什么共通类型呢?

image-20210331105721506

image-20210331105744111

类型判断式

如果该类型满足特定的性质,则它的内部静态成员变量value的值为std::true_type,否则为std::false_type。

image-20210331105949376

image-20210331110003830

用例:

image-20210331110118597

用以校验类型关系的Trait

检查类型之间的关系,检查class提供了哪一种构造函数和哪一种赋值操作

image-20210331110222456

例子:

image-20210331110336330

类型修饰符

使用下列方法可以对类型进行改动,比如原来该类型不为const,使用方法后可以变为const。

但要注意的是这里针对的是类型,而不是实际的对象

image-20210331110509332

例子:

image-20210331110518572

其他Type Trait

用来查询特殊属性、检查类型关系或提供更为复杂的类型变换

image-20210331110722146

例子:
image-20210331110744145

Reference Wrapper(外覆器)

image-20210331111008682

Function Type Wrapper(外覆器)

class std::function<>,声明于, 提供多态外覆器。可以借用这个将函数、函数指针、lambda表达式、可调用类这些可调用对象统一类型。

image-20210331111336008

辅助函数

最值函数

image-20210331115029928

minmax<>返回一个pair<>,first是最小值,second是最大值

交换 swap

image-20210331115524943

增补的“比较操作符”

image-20210331115618864

Class ration<>的编译期分数运算

使用该模板类可以指定编译期分数,并允许对它们执行编译期运算:

image-20210401100131127

num是分子,den是分母

用例:

image-20210401100231265

四则运算和逻辑判断

image-20210401100454919

注意:判断产生的结果为true_type 或 false_type, 而不是一般的true、false

例子:

image-20210401100515182

image-20210401100540434

分数预定义类型

image-20210401100611518

image-20210401100627593

Clock 和 Timer

定义于<chrono>的chrono程序库用来处理日期和时间

chrono程序库概览

Duration、timepoint

image-20210401101104132

image-20210401101118293

image-20210401101130522

duration用于表示一段时间,这段时间可以有多种表示方法。比如10分钟,可以表示为10个1分钟、60*10个1秒、1/6个1小时。这里的1分钟、1秒、1小时代表的是时间单位,而10、60*10、1/6则代表了tick。

timepoint用于表示某个时间点,在表示一个时间点之前需要像坐标轴以像先定好一个原点,这个原点就是epoch。某个时间点表示为“epoch要经过多少duration才能到达该时间点”。和坐标点到原点的距离类似

Duration(时间段)

image-20210401101840989

在模板参数中,第一个模板参数是表示tick数的数值类型,该数值在创建对象时给出。第二个模板参数是时间单位,以分数的形式表示“一个当前单位占了多少秒”

Duration的算数运算

image-20210401102013310

image-20210401102303348

例子1:单位类型不同也可以运算,运算结果会采用两个操作数单位的最大公约数

image-20210401102331094

image-20210401102450457

例子2:大单位可以转换成小单位,反之则不行。

image-20210401102600230

Duration的其他操作

image-20210401102736141

例子:

image-20210401102944551

image-20210401103012158

Clock(时钟)和Timepoint(时间点)

image-20210401103143551

Clock(时钟)

image-20210401103213389

image-20210401103407972

image-20210401103417808

这三个clock都是类型

例子:

image-20210401103734440

image-20210401103807133

image-20210401103831074

Timepoint(时间点)

image-20210401104058535

用例:

image-20210401104143115

image-20210401104526047

注意这里获取的日历表示法是根据用户所在时区获取到的

image-20210401104237138

注意这里是直接调用clock命名空间下的类型或者是静态函数获取timepoint,和之前通过模板参数获取的方式不同

时间点操作函数

image-20210401104759469

C和POSIX提供的Date/Time函数

image-20210401105219742

以计时器停滞线程

image-20210401105453400

头文件<cstddef>、<cstdlib>、<cstring>

<cstddef>内的各项定义

image-20210401105602649

C++11后引入了nullptr,现在我们应该使用它来代替NULL,表示空指针情况

<cstdlib>内的各项定义

image-20210401105724164

image-20210401105853215

image-20210401105918280

这两种退出都不会清理局部对象,如果希望能够进行清理,可以使用异常机制。

image-20210401110055615

<cstring>中的定义式

image-20210401110145495

memcmp、memcpy、memset经常会用到

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C 11标准是指C语言的第11个标准版本,也被称为C11。C语言是一种广泛应用于系统开发和嵌入式系统的高级编程语言。C11标准是对之前的C标准进行了更新和扩展,旨在提供更多功能和改进的性能。 C11标准引入了一些新的特性和改进,包括多线程支持、原子操作、泛型宏、匿名结构和联合等。多线程支持使得开发人员能够更好地处理并发操作,提高程序的性能和可靠性。原子操作提供了一种线程安全的方式来执行共享数据的读写操作。泛型宏使得宏定义更加灵活和通用,可以根据不同的类型和参数生成不同的代码。匿名结构和联合可以在不定义具体名称的情况下使用这些数据类型,提高了代码的简洁性和可读性。 C11标准还对语法、预处理、函数等方面进行了一些调整和改进。例如,它增加了对Unicode字符的支持,使得C语言能够更好地处理各种语言和字符集。此外,C11标准还修改了一些旧标准中存在的问题和不一致性,提高了代码的可移植性和可靠性。 总的来说,C11标准是对C语言的一个重要更新,为开发人员提供了更多的功能和改进的性能。它使得C语言能够更好地适应现代的编程需求,并继续在系统开发和嵌入式系统等领域发挥重要作用。 ### 回答2: C 11标准 pdf是指C语言的第11个版本的标准文档以及其对应的PDF格式的电子文档。C语言是一种广泛应用于系统编程和嵌入式开发领域的高级编程语言,具有强大的表达能力和高效的执行性能。C 11标准的发布对C语言的发展起到了重要的推动作用。 C 11标准在C99的基础上进行了扩展和完善,提供了一些新的特性和改进,并修订了一些旧的特性。C 11标准的主要特性包括:_Generic关键字,提供了泛型编程的支持;_Atomic关键字,提供了原子操作的支持;Static_assert关键字,增强了编译时的静态断言功能;_Bool类型,增加了布尔类型的支持;可变长度数组,允许数组的长度在运行时确定;_Static_assert和_Generic的预处理变体等。 C 11标准的发布对编程开发人员来说是一个重要的里程碑。它提供了更多的语言特性和编程工具,使得开发者能够更加高效地编写和调试C语言程序。同时,C 11标准的发布还推动了各种编译器和开发工具的升级和更新,为开发者提供更好的开发环境和工具支持。 C 11标准的PDF文档是官方发布的标准文档的电子版,可以使得开发者更加方便地浏览、查询和学习C 11标准的内容。开发者可以通过阅读C 11标准的PDF文档,了解新特性和改进,掌握C语言的最新规范和语法要求,为自己的编程工作提供指导和参考。 总而言之,C 11标准是C语言发展的一个重要里程碑,提供了更多的语言特性和编程工具,推动了C语言的发展和应用。C 11标准的PDF文档为开发者提供了便捷的学习和参考工具,促进了C语言程序的开发和优化。 ### 回答3: C 11标准是指C语言的第11个版本标准。C语言是一种通用的高级编程语言,广泛应用于软件开发和系统编程。不同的标准版本对C语言的语法规范、功能和特性进行了更新和改进。 C 11标准引入了一些新的特性和改进,以提高C语言的可读性、可维护性和灵活性。其中一些重要的改进包括: 1. 支持多线程编程:C 11引入了线程,可以更方便地进行多线程编程。 2. 泛型选择:通过引入_Generic关键字,可以根据不同的类型选择相应的函数或表达式。 3. 匿名结构和联合体:可以创建没有标识符的结构和联合体,更方便地进行轻量级数据封装。 4. 增强的字符串处理函数:引入了一些新的字符串处理函数,如strdup()和strtok_r(),增强了对字符串的处理能力。 5. 布尔类型支持:引入了_Bool类型,可以更清晰地表示真假值。 6. 快速的16位和32位整数类型:引入了int_fast16_t和int_fast32_t类型,提供了快速操作的整数类型。 7. 对齐指定:通过_Alignas关键字,可以指定变量的对齐方式,可以更好地控制内存布局。 8. 更好的文本处理支持:引入了一些新的标准函数,如strtof()和strtold(),提供了更加灵活和准确的文本处理能力。 总的来说,C 11标准通过引入新的特性和改进,提高了C语言的表达能力和编程效率,提供了更好的支持,使得C语言更适合于现代软件开发的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值