【C++】string类初步介绍

个人主页 : zxctscl
如有转载请先通知

文章目录

  • 1. 为什么学习string类
    • 1.1 C语言中的字符串
    • 1.2 推荐学习网站
  • 2. 标准库中的string类
    • 2.1 string类
    • 2.2 string类的常用接口说明
      • 2.2.1 constructor
      • 2.2.2 遍历string
        • 2.2.2.1 下标加[]遍历
        • 2.2.2.2 迭代器(iterator)遍历

1. 为什么学习string类

1.1 C语言中的字符串

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

1.2 推荐学习网站

string的学习离不开“看”,这里推荐两个网站:一个是:https://legacy.cplusplus.com/:
在这里插入图片描述

还有一个C++文档的官网是: https://en.cppreference.com/w/:
在这里插入图片描述
更喜欢第一个网站,这里面还有c的库。在之后的博客中也是以第一个网站。

2. 标准库中的string类

2.1 string类

在第一个网站里面直接搜索就会看到:
在这里插入图片描述
它是一个字符顺序表:
在这里插入图片描述

它底层也是模板是basic_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)的序列,这个类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。

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

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

2.2 string类的常用接口说明

  1. string类对象的常见构造
(constructor)函数名称功能说明
string()(重点)构造空的string类对象,即空字符串
string(const char* s)(重点)用C-string来构造string类对象
string(size_t n, char c)string类对象中包含n个字符
string(const string&s)(重点)拷贝构造函数

2.2.1 constructor

查看string类的Member functions
在这里插入图片描述
点constructor就会看见7个构造函数:
在这里插入图片描述
其他的构造函数看说明就很简单了解,但是来看看substring (3) ,它当中的size_t len = npos是什么意思呢?
在这里插入图片描述
如果len这个参数给的超过了这个字符串从pos位置开始给的长度,举个例子:从pos位置开始,剩余的长度是10,那么它超过了10,有多少就给多少,直接取到结尾。
如果len超过了剩余的长度,或者给npos缺省参数,那么这个就是从pos位置开始,直接取到结尾,有多少就取多少。
在这里插入图片描述

点开来看看npos:
npos是string里面的一个静态成员常量。
在这里插入图片描述
为什么给的是负一就取到字符的结尾?size_t无符号整形这里虽然存的是-1,但底层存的是补码,无符号整形原码和补码是一样的,这里反而变成了整形的最大值,也就是2^32-1。
在这里插入图片描述
来实现一下:

#include<iostream>
using namespace std;#include<string>
void test_string1()
{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;
}
int main()
{test_string1();return 0;
}

来看看s3:从第5个位置开始,那就是从空格开始,拷贝3个字符就是到o的位置。
在这里插入图片描述

在这里插入图片描述
2. string类对象的容量操作

函数名称功能说明
size(重点)返回字符串有效字符长度
length返回字符串有效字符长度
capacity返回空间总大小
empty (重点)检测字符串释放为空串,是返回true,否则返回false
clear (重点)清空有效字符
reserve (重点)为字符串预留空间**
resize (重点)将有效字符的个数该成n个,多出的空间用字符c填充

注意:

  1. **size()**与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size(),它的长度不包括\0。
  2. clear()只是将string中有效字符清空,不改变底层空间大小。
  3. resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。
  4. reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserver不会改变容量大小。

2.2.2 遍历string

那么要用什么样方式遍历呢?

2.2.2.1 下标加[]遍历
void test_string2()
{string s1("hello world");for (size_t i = 0; i < s1.size(); i++){cout << s1[i] << " ";}cout << endl;
}

在这里插入图片描述
string是私有的,不能拿到它的下标,想要获取它的长度,就用size,返回它有多少个字符。

std::string::operator[]这里模拟的是数组。
a[i]就相当于*a(a+i),就是返回它的第i个字符。
在这里插入图片描述

它的底层简单来实现一下:
获取pos位置那个字符

class string
{
public:char& operator[](size_t pos){return _str[pos];}
private:char* _str;size_t _size;size_t _capacity;
};

来试试修改pos位置的字符:

void test_string2()
{string s1("hello world");for (size_t i = 0; i < s1.size(); i++){cout << s1[i] << " ";}cout << endl;for (size_t i = 0; i < s1.size(); i++){s1[i] ++;}cout << endl;for (size_t i = 0; i < s1.size(); i++){cout << s1[i] << " ";}cout << endl;
}

在这里插入图片描述

如果给的是const对象就不能修改。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.2.2.2 迭代器(iterator)遍历

在这里插入图片描述
iterator是一个类型定义在string里面,所以它要指定类域,才能取到。

string::iterator it3 = s3.begin();while (it3 !=s3.end()){cout << *it3 << " ";++it3;}cout << endl;

在这里插入图片描述
迭代器行为像指针一样的类型对象,这个区间是一个左闭右开。
在这里插入图片描述

迭代器像指针,但不是指针,可以来一下它的类型。
在这里插入图片描述

用迭代器也可以实现string的修改:


it3 = s3.begin();while (it3 != s3.end()){*it3-=3 ;++it3;}cout << endl;

在这里插入图片描述

这两种方式其实没有什么区别,那为什么会有迭代器呢?
迭代器是主流,它屏蔽了底层的细节,它才是容器的核心访问方式。链表不会用下标访问。
来看个例子:

#include<iostream>
using namespace std;#include<string>
#include<vector>
#include<list>
void test_string2()
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);vector<int>::iterator it = v.begin();while (it != v.end()){cout << *it << " ";++it;}cout << endl;list<int> lt;lt.push_back(1);lt.push_back(2);lt.push_back(3);lt.push_back(4);list<int>::iterator itt = lt.begin();while (itt != lt.end()){cout << *itt << " ";++itt;}cout << endl;
}

在这里插入图片描述
范围for
自动取容器中的数据,赋值给e,自动迭代,自动往后走,自动结束。

for (auto e : s3){cout << e << " ";}cout << endl;

在这里插入图片描述
范围for底层就是迭代器。
在这里插入图片描述

有问题请指出,大家一起进步!!!

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

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

相关文章

前端跨页面通信的几种方式---同源

参考链接 1、LocalStorage:当 LocalStorage 变化时&#xff0c;会触发storage事件。利用这个特性&#xff0c;我们可以在发送消息时&#xff0c;把消息写入到某个 LocalStorage 中&#xff1b;然后在各个页面内&#xff0c;通过监听storage事件即可收到通知。 2、BroadCast C…

快速排序 刷题笔记

思路 分治双指针 在每个区间选定一个基准目标 两个指针从数组的两边向中间推进 使用 while循环判断 do {i;}while(q[i]<x); do{j--;}while(q[j]>x); 每次这样做完就会找到q[i]>x,,,,q[j]小于x 此时我们交换 q[i] ,q[j]于是小于x的数分到了小于x的一侧 大…

Java中 final、finally、finalize 有什么区别?

1、典型回答 final、finally、finalize 是 Java 中三个不同的关键字&#xff0c;它们除了长得像之外&#xff0c;其他的&#xff08;作用和含义&#xff09;完全不同。 它们三个的区别就好像&#xff1a;雷、雷锋、雷峰塔之间的区别。&#xff08;是三个完全不同的东西&#…

python实现卡普均值最小回路算法

如果给定一个含有环的有向图,要在这个图中找出所有的环并计算这些环的路径长度,然后除以环的边数,所得到的结果也就是环的平均值,这里也就是如何计算这个环的最小均值问题。 首先可以确定的是,如果图中均值最小的环的值是0,那么图中就不包含负环,由于是负环,那么所有边…

C库函数-getopt函数总结学习

1、简介 getopt函数是命令行参数解析函数 1、1命令行组成 Command name 程序文件名 operands 操作对象 option 选项 option argument 选项参数 getopt()函数将传递给mian()函数的argc,argv作为参数&#xff0c;同时接受字符串参数optstring – optstring是由选项Option字母组…

Linux系统目录结构详细介绍

目录 一、根目录&#xff08;/&#xff09; 二、/bin 三、/boot 四、/dev 1.设备文件类型&#xff1a; 2.常见设备文件&#xff1a; 五、/etc 六、/home 七、/root 八、/run 九、/sbin 十、 /tmp 十一、/usr 十二、/var Linux系统目录结构是一种层次化的文件系…

目标跟踪SORT算法原理浅析

SORT算法 Simple Online and Realtime Tracking(SORT)是一个非常简单、有效、实用的多目标跟踪算法。在SORT中&#xff0c;仅仅通过IOU来进行匹配虽然速度非常快&#xff0c;但是ID switch依然非常严重。 SORT最大特点是基于Faster RCNN的目标检测方法&#xff0c;并利用卡尔…

【阿里云系列】-基于云效构建部署Springboot项目到ACK

介绍 为了提高项目迭代的速度加速交付产品给客户&#xff0c;我们通常会选择CICD工具来减少人力投入产生的成本&#xff0c;开源的工具比如有成熟的Jenkins&#xff0c;但是本文讲的是阿里云提高的解决方案云效平台&#xff0c;通过配置流水线的形式实现项目的快速部署到服务器…

Flutter第四弹:Flutter图形渲染性能

目标&#xff1a; 1&#xff09;Flutter图形渲染性能能够媲美原生&#xff1f; 2&#xff09;Flutter性能优于React Native? 一、Flutter图形渲染原理 1.1 Flutter图形渲染原理 Flutter直接调用Skia。 Flutter不使用WebView&#xff0c;也不使用操作系统的原生控件,而是…

如何在群晖用Docker本地搭建Vocechat聊天服务并无公网ip远程交流协作

文章目录 1. 拉取Vocechat2. 运行Vocechat3. 本地局域网访问4. 群晖安装Cpolar5. 配置公网地址6. 公网访问小结 7. 固定公网地址 如何拥有自己的一个聊天软件服务? 本例介绍一个自己本地即可搭建的聊天工具,不仅轻量,占用小,且功能也停强大,它就是Vocechat. Vocechat是一套支持…

jQuery模态框弹窗提示代码

jQuery模态框弹窗提示代码 下载地址 jQuery模态框弹窗提示代码

王庆:当下股市过于悲观,A股、港股基本完成补跌和普跌过程,逆向布局时机已到

核心观点&#xff1a; 1、房地产对中国经济增长拖累最严重的时期正在过去...密切关注真正拐点的出现。 2、当前资本市场从价格表现上来讲&#xff0c;表现的远远超过了基本面所决定的悲观程度。 由于当前资本市场过于悲观&#xff0c;那么反过来就是孕育着机会。 3、我们判…