C++中的STL-string类

文章目录

    • 一、为什么学习string类?
      • 1.1 C语言中的字符串
    • 二、准库中的string类
      • 2.2 string类
      • 2.3 string类的常用接口说明
      • 2.4 string类对象的容量操作
      • 2.5 string类对象的访问及遍历操作
      • 2.5 string类对象的修改操作
      • 2.7 string类非成员函数
      • 2.8 模拟实现string

一、为什么学习string类?

1.1 C语言中的字符串

C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。

二、准库中的string类

2.2 string类

string类文档

  1. string是表示字符串的字符串类
  2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
  3. string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator>string;
  4. 不能操作多字节或者变长字符的序列。

使用string类时,必须包含#include头文件以及using namespace std;

2.3 string类的常用接口说明

  1. string类对象的常见构造:文档说明

在这里插入图片描述

  • 下面就可以这样使用
int main()
{string s0;string s1("hello world");string s2(s1);string s3(s1, 5, 3);string s4(s1, 5, 10);string s5(s1, 5);cout << s0 << endl;cout << s1 << endl;cout << s2 << endl;cout << s3 << endl;cout << s4 << endl;cout << s5 << endl;string s6(10, '#');cout << s6 << endl;s0 = s6;cout << s0 << endl;return 0;
}

在这里插入图片描述

2.4 string类对象的容量操作

  • 可以看下面的概图

在这里插入图片描述

  • 接下来我们一个一个看看

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

在这里插入图片描述

  • max_size()是返回最大存放多少个字符
  • 每个平台可能不一样

在这里插入图片描述

  • 大家可以看这里的测试,第一次是15,第二次是2倍扩容,第三次,第四次…都是1.5倍扩容

在这里插入图片描述

  • 在linux平台下,默认从0开始,后续从2倍扩容

在这里插入图片描述

  • reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于 string的底层空间总大小时,reserver不会改变容量大小。

在这里插入图片描述

  • resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字 符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的 元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。
void Teststring3()
{// 注意:string类对象支持直接用cin和cout进行输入和输出string s("hello, world!!!");cout << s.size() << endl;cout << s.length() << endl;cout << s.capacity() << endl;cout << s << endl;// 将s中的字符串清空,注意清空时只是将size清0,不改变底层空间的大小s.clear();cout << s.size() << endl;cout << s.capacity() << endl;// 将s中有效字符个数增加到10个,多出位置用'a'进行填充// “aaaaaaaaaa”s.resize(10, 'a');cout << s.size() << endl;cout << s.capacity() << endl;// 将s中有效字符个数增加到15个,多出位置用缺省值'\0'进行填充// "aaaaaaaaaa\0\0\0\0\0"// 注意此时s中有效字符个数已经增加到15个s.resize(15);cout << s.size() << endl;cout << s.capacity() << endl;cout << s << endl;// 将s中有效字符个数缩小到5个s.resize(5);cout << s.size() << endl;cout << s.capacity() << endl;cout << s << endl;
}

在这里插入图片描述

  • 判断字符串是否为空

在这里插入图片描述

  • capacity缩小适合大小

  • 在vs下是缩小到刚刚说的倍数上

在这里插入图片描述

  • 在Linux下是缩小到size大小

在这里插入图片描述

2.5 string类对象的访问及遍历操作

在这里插入图片描述

  • 对于元素的访问操作我们有四种方式begin()+end() for [] 范围for(C++11支持)
void Teststring7()
{string s1("hello world");const string s2("Hello world");cout << s1 << " " << s2 << endl;cout << s1[0] << " " << s2[0] << endl;s1[0] = 'H';cout << s1 << endl;// s2[0] = 'h';   代码编译失败,因为const类型对象不能修改
}

在这里插入图片描述

  • 以下这些方法都是可以的
void Teststring6()
{string s("hello world");// 1. for+operator[]for (size_t i = 0; i < s.size(); ++i)cout << s[i] << ' ';cout << endl;// 2.迭代器string::iterator it = s.begin();while (it != s.end()){cout << *it << ' ';++it;}cout << endl;// string::reverse_iterator rit = s.rbegin();// C++11之后,直接使用auto定义迭代器,让编译器推到迭代器的类型auto rit = s.rbegin();while (rit != s.rend()) {cout << *rit << ' ';++rit;}cout << endl;// 3.范围forfor (auto ch : s)cout << ch << ' ';cout << endl;}

在这里插入图片描述

2.5 string类对象的修改操作

在这里插入图片描述

  • c_str和data使用差不多,但是c_str使用较多
  • 在比较的时候==是用的一个重载,而使用c_str比较是比较地址

在这里插入图片描述

  • 案例一:
  • 找后缀
// 获取file的后缀
string file("string.cpp");
// 从后往前找 '.'
size_t pos = file.rfind('.');
// 截取从pos位置开始到最后
string suffix(file.substr(pos,file.size() - pos));
cout << suffix << endl;

在这里插入图片描述

  • 案例二:

  • 获取url中的协议

  • 用find查找.,然后再使用substr截取字符串

string url("https://www.cplusplus.com/reference/string/string/find/");
cout << url << endl;size_t n = url.find(':');
if (n == string::npos)
{cout << "invalid url" << endl;return;
}
string protocol = url.substr(0, n);
cout << protocol << endl;
cout << url.substr(0, n) << endl;

在这里插入图片描述

  • 获取url中的域名
size_t start = url.find("://");
if (start == string::npos)
{cout << "invalid url" << endl;return;
}
start += 3; // 跳过 ://
size_t finish = url.find('/', start);
string address = url.substr(start, finish - start);
cout << address << endl;
cout << url.substr(start, finish - start) << endl;

在这里插入图片描述

  • 删除url的协议前缀
size_t pos = url.find("://");
url.erase(0, pos + 3);
cout << url << endl;

在这里插入图片描述


  • find_first_of

  • 查找字符串中的包含所有字符

在这里插入图片描述

  • find_first_not_of

在这里插入图片描述

  • 后面的last就是从后往前找,很简单,不再赘述

2.7 string类非成员函数

  • 这里比较重要的是getline()
  • 这个和C语言中的gets差不多,读一行,读到\n后停止
  • 这个还多一个功能,就是可以指定读到什么字符后停止

在这里插入图片描述

2.8 模拟实现string

  • 这个的模拟实现就到下一篇文章来写~~

最后,本文学习了C++中的string类,简单的介绍了几个比常用的几个接口,以及如何使用,感谢收看

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

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

相关文章

【UE5】非持枪状态蹲姿移动的动画混合空间

项目资源文末百度网盘自取 在BlendSpace文件夹中单击右键选择动画(Animation)中的混合空间(Blend Space) &#xff0c;选择SK_Female_Skeleton&#xff0c;命名为BS_NormalCrouch 打开BS_NormalCrouch 水平轴表示角色的方向&#xff0c;命名为Direction&#xff0c;方向的最…

2024Python二级

1. 2. 前序遍历首先访问根节点再访问左子树和右子树 3. 4. sub不属于保留字 5. 6. 7. 8. continue是再重新开始进行循环&#xff0c;不是题目中所规定字母的话就对它进行输出 9. Python没有主函数的说法 10. 未转化为数据所要求的形式&#xff0c;应首先考虑eval 11. l…

Jmeter —— jmeter中元件的执行顺序作用域

元件的执行顺序&#xff1a; 配置元件-->前置处理程序-->定时器-->取样器-->后置处理程序&#xff08;除非Sampler 得 到的返回结果为空&#xff09;-->断言&#xff08;除非Sampler 得到的返回结果为空&#xff09;-->监听器 &#xff08;除非Sampler 得到…

C++特性之一:继承

1. 派生类的成员变量、成员函数、构造、析构 2. 继承的切片 3. 重定义/隐藏 重定义/隐藏&#xff1a;派生类和基类有同名的成员&#xff0c;就叫隐藏。派生类的成员隐藏了基类的成员。 隐藏时可以通过类作用限定符来访问被隐藏的成员。 class Person { public:void Print(){…

MVC架构模式学习笔记(动力节点老杜2022)

GitHub代码笔记&#xff1a;laodu-mvc: 动力节点学习javaweb中的mvc笔记。 文章目录 1.视频链接 2.不使用MVC架构模式程序存在的缺陷 3.MVC架构模式理论基础 4.JavaEE设计模式-DAO模式 5.pojo & bean & domain 6.业务层抽取以及业务类实现 7.控制层 8.MVC架构模式与三…

LLM - 大语言模型的自注意力(Self-Attention)机制基础 概述

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/136623432 注意力(Attention)机制是大型语言模型中的一个重要组成部分&#xff0c;帮助模型决定在处理信息时&#xff0c;所应该关注的部…

【论文速读】| 大语言模型引导的协议模糊测试

本次分享论文为&#xff1a;Large Language Model guided Protocol Fuzzing 基本信息 原文作者&#xff1a;Ruijie Meng, Martin Mirchev, Marcel Bhme, Abhik Roychoudhury 作者单位&#xff1a;新加坡国立大学&#xff0c;MPI-SP&#xff0c;莫纳什大学 关键词&#xff1a…

微信小程序中点击input输入框避免唤起手机端的键盘

最近在给一个门诊部开发微信预约医生的小项目&#xff0c;界面如下&#xff1a; 希望在点击性别下面的input 输入框时后弹出如下界面&#xff1a; 结果总是唤起键盘输入界面如下&#xff1a; 用语言描述就是点击input选择男和女时候&#xff0c;总是会唤起手机的键盘。导致没…

Leetcode 1514 概率最大的路径

文章目录 1. 题目描述2. 我的尝试 1. 题目描述 原题链接&#xff1a;Leetcode 1514 概率最大的路径 给你一个由 n 个节点&#xff08;下标从 0 开始&#xff09;组成的无向加权图&#xff0c;该图由一个描述边的列表组成&#xff0c;其中 edges[i] [a, b] 表示连接节点 a 和 b…

【C++】inline内联函数 VS #define宏

文章目录 1. 内联概念2. 内联特点3. 宏的优缺点 1. 内联概念 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开&#xff0c;无函数建立栈帧的开销&#xff0c;内联函数提升程序运行的效率。 在release模式下&#xff0c;默认展开生效。 在…

力扣 322 零钱兑换

题目描述 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1。 你可以认为每种硬币的数量是无限的。 示例 1&#xff1a; 输入&#xff1a;coins [1, 2, 5…

No transform from [base_footprint] to [base_link]

需要查看这两个坐标系之间的转换 果然&#xff0c;demo05_car_base中父坐标系是base_footprint&#xff0c;意思是从base_footprint到base_link的转换&#xff0c;而不是从固定坐标系base_link到base_footprint 修改&#xff1a; 父坐标系修改成base_link即可