【C++】-8- string〔常见接口函数使用〕

news/2024/12/4 23:29:02/

文章目录

  • 概览
  • 标准库中的string类
    • 「string类(了解)」
      • ﹝编码﹞
    • 「string类的常用函数接口」
      • ﹝1.string类对象的常见构造﹞
      • ﹝2.string类对象的修改操作﹞
        • ‹ c_str ›
        • ‹ npos ›
        • ‹ string结构 ›
      • ﹝3.string类对象的容量操作﹞
        • ‹ clear ›
        • ‹ reserve ›
        • ‹ resize ›
      • ﹝4.string类对象的访问及遍历操作﹞

概览

在这里插入图片描述

标准库中的string类

string(cplusplus.com)

「string类(了解)」

在这里插入图片描述

  1. 字符串是表示字符序列的类
  2. 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。
  3. string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信息,请参阅 basic_string)。
  4. string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits和allocator作为basic_string的默认参数(根于更多的模板信息请参考 basic_string)。
  5. 注意,这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。

﹝编码﹞

字符编码(英语:Character encoding)也称字集码,是把字符集中的字符编码为指定集合中某一对象(例如:比特模式、自然数序列、8位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递。(字符编码—百度百科)

在这里插入图片描述

ASCII:(American Standard Code for Information Interchange)美国信息交换标准代码
GBK:GBK全称《汉字内码扩展规范》(GBK即“国标”、“扩展”汉语拼音的第一个字母,英文名称:Chinese Internal Code Specification)
在这里插入图片描述在这里插入图片描述

「string类的常用函数接口」

  • #include <string>
  • string—constructor.cplusplus.com

﹝1.string类对象的常见构造﹞

在这里插入图片描述

函数名称功能说明
string()构造空的string类对象,即空字符串
string(const char* s)用 常量字符串 来构造string类对象
string(size_t n, char c)用 n 个字符 c 来构造string类对象
string(const string& s)拷贝构造函数

示例:

#include <string>
using namespace std;
string s1;//调用无参的构造函数,构造空的string类对象
string s2("hello RoundBottle");//用常量字符串构造string类对象
string s3(13, 'x');//用 13个x 构造 string类对象
string s4(s2);//拷贝构造

在这里插入图片描述
注意:string 类对象支持直接用 cin 和 cout 进行输入和输出

string s("hello, RoundBottle!");
cout << s << endl;

﹝2.string类对象的修改操作﹞

函数名称功能说明
push back在字符串后尾插字符
append在字符串后追加一个字符串
operator+=在字符串后追加字符串str
c_str返回C格式字符串
find + npos从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
rfind从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
substr在str中从pos位置开始,截取n个字符,然后将其返回
  • 注意:
  1. 在string尾部追加字符时,s.push_back( c ) / s.append(1, c) / s += 'c’三种的实现方式差不多,一般情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串。
  2. 对string操作时,如果能够大概预估到放多少字符,可以先通过 reserve(下面会介绍)把空间预留好。
  • 示例:
    在这里插入图片描述

‹ c_str ›

std::string::c_str
const char* c_str() const;

在这里插入图片描述

ps. cout 会自动识别类型,c_str() 函数的返回值是 const char* ,强制转成 void* 才会打印地址 在这里插入图片描述

c_str接口的意义:为了和C语言的接口兼容

‹ npos ›

public static member constant

static const size_t npos = -1; Maximum value for size_t
size_t无符号整型→ -1 本质上是整型的最大值!

‹ string结构 ›

  • vs下string的结构:先是有一个联合体,联合体用来定义string中字符串的存储空间:
    当字符串长度小于16时,使用内部固定的字符数组 (buf[16]) 来存放
    当字符串长度大于等于16时,从堆上开辟空间

在这里插入图片描述
在这里插入图片描述
故:8 + 8 + 8 + 16 = 40字节(如上图所示)

这种设计也是有一定道理的,大多数情况下字符串的长度都小于16,那string对象创建好之后,内部已经有了16个字符数组的固定空间,不需要通过堆创建,效率高。
在这里插入图片描述

vs 一般是1.5倍扩容

  • g++下string的结构
    g++下,string是通过写时拷贝实现的,string对象总共占4个字节,内部只包含了一个指针,该指针将来指向一块堆空间,内部包含了如下字段:
    • 空间总大小
    • 字符串有效长度
    • 引用计数
    • 指向堆空间的指针,用来存储字符串。

g++ 一般是2倍扩容


﹝3.string类对象的容量操作﹞

在这里插入图片描述

函数名称功能说明
size返回字符串有效长度
length返回字符串有效长度
capacity返回空间的总大小(不包括\0)
empty检测字符串是否为空串,是返回true,否则返回false
clear清空有效字符
reserve为字符串预留空间
resize将有效字符的个数改成n个,多出的空间用字符c填充
  • size 与 length

ps. size()length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()

  • size && capacity
    在这里插入图片描述

‹ clear ›

清空 string 的内容,size 置零
在这里插入图片描述

‹ reserve ›

std::string::reserve
void reserve (size_t n = 0);
Request a change in capacity
Requests that the string capacity be adapted to a plannedchange in size to a length of up to n characters.

If n is greater than the current string capacity, the function causes the container to increase its capacity to n characters (or greater).

In all other cases, it is taken as a non-binding request to shrink the string capacity: the container implementation is free to optimize otherwise and leave the string with a capacity greater than n.

This function has no effect on the string length and cannot alter its content.

  • 对于函数所传参数size_t n
    • 默认缺省值为0
    • n > current string capacity :该函数会导致容器将其容量增加到 n 个字符(或更大)
    • n <= current string capacity :容器实现可以自由优化,否则,字符串的容量大于 n。

在这里插入图片描述

‹ resize ›

std::string::resize
void resize (size_t n);
void resize (size_t n,char c);
Resize string
Resizes the string to a length of n characters.

If n is smaller than the current string length, the current value isshortened to its first n character, removing the characters beyond the nth.

If n is greater than the current string length, the current content is extended by inserting at the end as many characters as needed to reach a size of n. If c is specified, the new elements are initialized as copies of c, otherwise, they are value-initialized characters (null characters).

resize:将字符串大小调整为 n 个字符的长度

  • n > current string length :删除 n 个字符长度以后的数据
    在这里插入图片描述
  • n >= current string length :在末尾插入所需数量的字符以达到 n 大小来扩展当前内容
    在这里插入图片描述

﹝4.string类对象的访问及遍历操作﹞

函数名称功能说明
operator[]返回pos位置的字符,const string类对象调用
begin+ endbegin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
rbegin + rendbegin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
范围forC++11支持更简洁的范围for的新遍历方式
void test7()
{string s("abcdefg");string::iterator it = s.begin();while (it != s.end()){cout << *it << " ";++it;}cout << endl;
}

在这里插入图片描述

注:范围for底层也是迭代器

string s("abcdefg");
for (auto ch : s)
{cout << ch << ' ';
}
cout << endl;

END


http://www.ppmy.cn/news/107602.html

相关文章

【Python教学】Python兼职有哪些?给你们分享一下最适合学生党/工作党的Python兼职攻略以及接私活经验

文章目录 前言一、做兼职的优势二、兼职种类三、基本技能要求四、平台和渠道五、案例分析六、做兼职注意事项总结 前言 Python是一种高级编程语言&#xff0c;它具有简单易学、代码可读性高、功能强大等特点&#xff0c;被广泛应用于数据分析、人工智能、Web开发等领域。Pytho…

如何使用递归 Grep 命令在目录中搜索?

在 Linux 系统中&#xff0c;grep 是一个强大的文本搜索工具&#xff0c;可以用于在文件中查找指定的文本模式。当需要在目录及其子目录中搜索特定的文本时&#xff0c;可以使用递归 grep 命令来快速定位目标文件。本文将详细介绍如何使用递归 grep 命令来搜索目录中的文件。 递…

别再瞎考证了!关于网络安全行业的证书,看完这篇,明明白白考证

有相关证书会让你的职业生涯锦上添花&#xff0c;实战技术能力必不可少。 温馨提示&#xff1a; 1、不满足条件的高校学生群体&#xff0c;可以直接报名考取NISP二级证书&#xff0c;满足CISP认证要求后&#xff0c;免考试按规定更换CISP证书&#xff0c;为毕业后从事网络安全…

WebrtcNode publish 流程

WebrtcNode publish 流程 1. AmqpClient - RpcServer New message received AmqpClient - RpcServer New message received {method: publish,args: [67f9309ce6e645fc8a4bb9cac6406eb2,webrtc,{transportId: 67f9309ce6e645fc8a4bb9cac6406eb2,tracks: [Array],controller: …

c#快速入门(下)

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析2 目录 &#x1f449;&#x1f3fb;Inline和lambda委托和lambda &#x1f449;&#x1f…

深入解析CPU性能火焰图生成的内部原理

在进行CPU性能优化的时候&#xff0c;我们经常先需要分析出来我们的应用程序中的CPU资源在哪些函数中使用的比较多&#xff0c;这样才能高效地优化。一个非常好的分析工具就是《性能之巅》作者 Brendan Gregg 发明的火焰图。 我们今天就来介绍下火焰图的使用方法&#xff0c;以…

仪表板展示 | DataEase看世界:数据呈现世界油价变化

背景介绍 最近几个月&#xff0c;全球能源市场一直处于动荡不安的状态&#xff0c;与石油相关的新闻也非常频繁。2023年2月10日&#xff0c;面对西方多轮限价举措&#xff0c;俄罗斯副总理亚历山大诺瓦克宣布&#xff0c;俄罗斯将在3月把每日原油产量下调50万桶。目前&#xf…

Apache应用和配置

目录 构建虚拟 Web 主机基于域名的虚拟主机基于IP地址的虚拟主机基于端口的虚拟主机 Apache 连接保持构建Web虚拟目录与用户授权限制Apache 日志分割 构建虚拟 Web 主机 虚拟Web主机指的是在同一台服务器中运行多个Web站点&#xff0c;其中每一个站点实际上并不独立占用整个服务…