C++证道之路第十六章string类和标准模板库

news2025/1/15 13:06:39

一、string类

string实际上是模板具体化basic_string的一个typedef,省略了与内存管理相关的参数。

string类将string::npos定义为字符串的最大长度。

string库提供了很多其他的工具,包括完成下述功能的函数:

删除字符串的部分或全部内容;

用一个字符串的部分或全部内容替换另一个字符串的部分或全部内容;

将数据插入到字符串中或删除字符串中的数据;

将一个字符串的部分或全部内容与另一个字符串的部分或全部内容进行比较;

从字符串中提取子字符串;

将一个字符串中的内容复制到另一个字符串中;

交换两个字符串的内容,等等。

string ( const char * s ):将string初始化为s指向的C风格字符串。

string ( size_type n, char c ):创建一个包含n个元素的string对象,其中每一个元素都被初始化为字符c。

C++11新增了两个构造函数,总共有9个构造函数。

运算符重载:

+=:将一个字符串附加到另一个字符串的后面。

=:用于将string对象、C风格字符串或char值赋给string对象。

<<:用于显示string对象。

[]:用于访问字符串中的各个字符。

+:将其两个操作数组合成一个string对象,第二个操作数可以是string对象、C-风格字符串或char值。

string类的输入:

使用getline函数来获取string类的一行字符串,如getline(cin, str)。

二、智能指针模板类

智能指针是行为类似于指针的类对象,但这种对象还有其他功能。

auto_ptr、unique_ptr和shared_ptr都定义了类似指针的对象,可以将new获得(直接或间接)的地址赋给这种对象。当智能指针过期时,其析构函数将使用delete来释放内顿。因此如果将new返回的地址赋给这些对象,将吴晓旭记住稍后释放这些内存:在智能指针过期时,这些内存将被自动释放。

如果两个指针指向同一个对象时。如果程序试图通过两个指针删除对象两次时这是不能接受的。

要避免这种问题,下面是几种方法:

定义赋值运算符,使之执行深复制。这样两个指针将指向不同的对象,其中的一个对象是另一个对象的副本。

建立所有权概念,对于特定的对象,只能有一个智能指针可拥有它,这样只有拥有对象的智能指针的构造函数会删除该对象。然后,让赋值操作转让所有权。这就是用于auto_ptr和unique_ptr的策略,但unique_ptr的策略更严格。

创建智能更高的指针,跟踪引用特定对象的只能指针数。这称为引用计数。例如,赋值时,计数将+1,而指针过期时,计数将-1.仅当最后一个指针过期时,才调用delete。这是shared_ptr采用的策略。

警告:

使用new分配内存时,才能使用auto_ptr和shared_ptr,

使用new[]分配内存时,不能使用它们。

不使用new分配内存时,不能使用auto_ptr或shared_ptr;

不使用new或new []分配内存时,不能使用unique_ptr。

 (怎么说,不会有人连这个都分不清吧?)

选择智能指针

如果程序要使用多个指向同一个对象的指针,应选择shared_ptr这样的情况包括:有一个指针数组,并使用一些辅助指针来标识特定的元素,如最大的元素和最小的元素;两个对象包含都指向第三个对象的指针:STL容器包含指针。很多STL算法都支持复制和赋值操作,这些操作可以用于shared_ptr,但不能用于unique_ptr和auto_ptr。如果编译器没有提供shared_ptr,可使用Boost库提供的shared_ptr。

如果程序不需要多个指向同一个对象的指针,则可以使用unique_ptr,如果函数使用new分配内存,并返回指向该内存的指针,将其返回类型声明为unique_ptr是不错的选择。这样所有权将转让给接受返回值的unique_ptr,而该智能指针将负责调用delete。可将unique_ptr储存到STL容器中,只要不调用将一个unique_ptr复制或赋给另一个的方法或算法(如sort)。

标准模板库

STL提供了一组表示容器,迭代器,函数对象和算法的模板。容器是一个与数组类似的单元,可以储存若干值。STL容器是同质的,即储存的值的类型相同;算法是完成特定任务(如对数组进行排序或在链表中查找特定值)的厨房;迭代器能够用来遍历容器的对象,与能够遍历数组的指针类似,是广义指针;函数对象是类似于函数的对象,可以是类对象或函数指针(包括函数名,因为函数名被用作指针)。STL使得能够使构造各种容器(包括数组、队列和链表)和执行各种操作(包括搜索,排序和随即排列)。

什么是迭代器?

迭代器是STL中的一个核心概念,它提供了一种访问容器中元素的方法,而不必关心容器的具体实现。迭代器可以看作是一种广义的指针,可以遍历容器中的元素,进行读写操作。

它是一个广义指针。事实上,它可以是指针,也可以是一个可以对其执行类似指针的操作——如接触引用(如operator*()和递增(如operator++()))——的对象。

泛型编程

泛型编程旨在编写对立与数据类型的代码。在C++中,完成通用程序的工具是模板。当然,模板使得能够按泛型定义函数或类,而STL通过通用算法更近了一步。模板让这一切成为可能,但必须对元素进行仔细的设计。

理解迭代器是理解STL 的关键所在。模板使得算法独立于储存的数据类型,而迭代器使算法独立于使用的容器类型。

五、函数对象

STL中的函数对象(也称为仿函数)是一种可调用的对象,它们重载了operator(),使得它们可以像函数一样被调用。函数对象通常用于作为STL算法的参数,以定义算法的行为。例如,std::less<T>是一个内置的函数对象,它用于比较两个元素的大小。

很多STL算法都使用函数对象——也叫函数符。函数符是可以以函数方式与()结合使用的任意对象。这包括函数名、指向函数的指针和重载了()运算符的类对象(即定义了函数operator()()的类。)。

六、算法

STL包含很多处理容器的非成员函数。STL算法库提供了一系列对容器元素进行操作的函数,这些函数不依赖于特定的容器类型,因此具有高度的通用性。

STL将算法库分为4组:

非修改式序列操作;

修改式序列操作;

排序和相关操作;

通用数字运算;

查找算法:

findfind_ifbinary_search等,用于在容器中查找元素。

排序算法:

sortstable_sortnth_element等,用于对容器元素进行排序。

复制算法:

copycopy_ifcopy_n等,用于将容器中的元素复制到另一个容器或输出流中。

数值算法:

accumulateinner_productpartial_sum等,用于对容器中的元素进行数值计算。

七、其他库

C++还提供了其他一些类库,例如头文件complex为复数提供了类模板complex,包含用于float、long、和long double的具体化。这个类提供了标准的复数运算及能够处理复数的标准函数。

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

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

相关文章

POWERBI==官网教程

地址 COVID-19 tracking sample for US state and local governments - Power BI | Microsoft Learn 已经非常全面了

【简单介绍下Lisp的学习历程】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

【docker 】push 镜像到私服

查看镜像 docker images把这个hello-world 推送到私服 docker push hello-world:latest 报错了。不能推送。需要标记镜像 标记Docker镜像 docker tag hello-world:latest 192.168.2.1:5000/hello-world:latest 将Docker镜像推送到私服 docker push 192.168.2.1:5000/hello…

自动驾驶-第02课软件环境基础(ROSCMake)

1. 什么是ros 2. 为什么使用ros 3. ROS通信 3.1 Catkin编译系统

uniapp 文字转语音(文字播报、语音合成)、震动提示插件 Ba-TTS

简介&#xff08;下载地址&#xff09; Ba-TTS 是一款uniapp语音合成&#xff08;tts&#xff09;插件&#xff0c;支持文本转语音&#xff08;无服务费&#xff09;&#xff0c;支持震动提示。 支持语音合成&#xff0c;文本转语音支持震动&#xff08;可自定义任意震动效果…

python笔记:dataclass

1 引子&#xff1a;其他类似实现方法的局限性 假设我们现在需要实现这样的内容&#xff1a; nameChinaarea960population140967 1.1 tuple/list country1_tuple(China,960,140967) country1_tuple[0] #China 缺点&#xff1a;需要记住各个属性是list/tuple第几位的属性&am…

MYSQL从入门到精通(二)

1、MYSQL高级概述 【1】架构概述 【2】索引优化 【3】查询截取 【4】mysql锁机制 【5】主从复制 2、MYSQL概述 【1】mysql内核 【2】sql优化工程师 【3】mysql服务器的优化 【4】各种参数常量设定 【5】查询语句优化 【6】主从复制 【7】软硬件升级 【8】容灾百分 【9】sql编…

【005_音频开发_基础篇_ALSA_Codec_驱动-MA120x0P功放】

005_音频开发_基础篇_ALSA_Codec_驱动-MA120x0P功放 文章目录 005_音频开发_基础篇_ALSA_Codec_驱动-MA120x0P功放创作背景MA120X0P输出模式BTLSEPBTLSEBTL 硬件配置方式/硬件Limiter限幅器限幅器作用过程 主要寄存器操作指令 ma120x0p.cma120x0p.h 创作背景 学历代表过去、能…

ASP.NET视频点播系统的设计与实现

摘 要 本文阐述了基于WEB的交互式视频点播系统的协议原理、软件结构和设计实现。本视频点播系统根据流媒体传输原理&#xff0c;在校园局域网的基础上模拟基于Web的视频点播系统&#xff0c;实现用户信息管理、视频文件的添加、删除、修改及在线播放和搜索功能。本系统是一个…

golang学习笔记(内存逃逸分析)

golang的内存逃逸 逃逸分析&#xff08; Escape analysis&#xff09; 是指由编译器决定内存分配的位置&#xff0c; 不需要程序员指定。 函数中申请一个新的对象。 如果分配在栈中&#xff0c; 则函数执行结束可自动将内存回收&#xff1b;如果分配在堆中&#xff0c; 则函数…

微服务总览

微服务保护 微服务总览 微服务总览 接入层&#xff1a;反向代理功能&#xff0c;可以将用户域名访问的地址以负载均衡的方式代理到网关地址&#xff0c;并且并发能力非常高&#xff0c;并且会采用主备nginx的方式防止nginx寄了&#xff0c;备份nginx监控主nginx状态&#xff0c…

展开说说:Android Fragment完全解析-卷三

本文章分析了Fragment的管理器FragmentManager、事务FragmentTransaction 、以及完整的声明周期和动态加载Fragment的原理解析。 1、Fragment管理器 FragmentManager 类负责在应用的 fragment 上执行一些操作&#xff0c;如添加、移除或替换操作&#xff0c;以及将操作添加到…

搭建MongoDB分片集群

文章目录 一、什么是分片二、分片集群1、组件构成2、分片集群内各组件间交互 三、数据如何切分四、分片策略1、哈希分片2、范围分片 五、分片集群架构六、搭建分片集群1、涉及主机2、所有主机安装MongoDB3、分片节点副本集的创建3.1、第一套副本集shard13.1.1、准备存放数据和日…

python项目==一个web项目,配置模板指定文件清洗规则,调用模板规则清洗文件

代码地址 一个小工具。 一个web项目&#xff0c;配置模板指定文件清洗规则&#xff0c;调用模板规则清洗文件 https://github.com/hebian1994/csv-transfer-all 技术栈&#xff1a; SQLite python flask vue3 elementplus 功能介绍&#xff1a; A WEB tool for cleaning…

Pyside6详细使用教程python之GUI开发

1、首先需要安装Pyside6&#xff0c;终端执行命令&#xff1a; pip3.10 install pyside6 2、你们的一般是 pip install pyside6 2、如下代码创建一个简易程序导入必要的模块 import sys from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton,…

three.js入门指南

WebGL和Three.js的概念 什么是WebGL WebGL是基于OpenGL ES 2.0的Web标准&#xff0c;可以通过HTML5 Canvas元素作为DOM接口访问。 也就是WebGL是作为OpenGL的网页端入口。它作为一个底层标准&#xff0c;然后我们可以通过JavaScript代码&#xff0c;在网页上实现三维图形的渲…

重看Spring聚焦BeanDefinition分析和构造

目录 一、对BeanDefinition的理解 &#xff08;一&#xff09;理解元信息 &#xff08;二&#xff09;BeanDefinition理解分析 二、BeanDefinition的结构设计分析 &#xff08;一&#xff09;整体结构体会 &#xff08;二&#xff09;重要接口和类分析 三、构造 BeanDef…

JavaSE——正则表达式(1/2):概述、初步使用(普通方法,正则表达式)、书写规则(字符类,预定义字符,数量词,其他,特殊案例)

目录 概述 初步使用 普通方法 正则表达式 书写规则 字符类 预定义字符 数量词 其他 特殊案例 概述 正则表达式 就是由一些特定的字符组成&#xff0c;代表的是一个规则。 作用一&#xff1a;用来校验数据格式是否合法 &#xff08;更简单、更便捷&#xff09; 作…

C语言 | Leetcode C语言题解之第66题加一

题目&#xff1a; 题解&#xff1a; /*** Note: The returned array must be malloced, assume caller calls free().*/ int* plusOne(int* digits, int digitsSize, int* returnSize){for(int i digitsSize - 1; i > 0; --i){digits[i] digits[i] 1;//最后元素1判断是不…

SQL注入漏洞扫描---sqlmap

what SQLMap是一款先进的自动执行SQL注入的审计工具。当给定一个URL时&#xff0c;SQLMap会执行以下操作&#xff1a; 判断可注入的参数。判断可以用哪种SQL注入技术来注入。识别出目标使用哪种数据库。根据用户的选择&#xff0c;读取哪些数据库中的数据。 更详细语法请参考…