【C++】string使用

2023-11-13

1、 为什么要学习string类

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

2、在OJ中,有关字符串的题目基本以string类的形式出现,而且在常规工作中,为了简单、方便、快捷,基本都使用string类,很少有人去使用C库中的字符串操作函数

2、标准库中的string类

2.1了解string类

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

总结:

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

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

2.2string类常用的接口

申明:以下的所有Windows平台测试均在VS2013环境下进行,期间也会有部分功能在Linux平台下测试

2.2.1 构造和析构相关

  1. (constructor)—构造

(1)string()
默认构造函数,得到的是一个长度为0的空串
在这里插入图片描述
(2)string(const string& str)
这是一个 拷贝构造函数,用已经存在的字符串str拷贝构造新的字符串
具体使用方式如下:
在这里插入图片描述
(3)sting(const string& str,size_t pos,size_t len = npos)
功能:使用字符串str的从pos下标开始,长度为len这一部分字符串来构造新的字符串(len是一个缺省参数,默认值为npos,如果不给定,默认到字符串str的末尾
功能演示
在这里插入图片描述
(4)string(const char* s)
使用C语言中的字符串来构造新的对string对象
在这里插入图片描述

(5)string(const char* s,size_t n);
使用C语言中的字符串s中的前n个字符来构造string对象
在这里插入图片描述
(6)string(size_t n,char c)
使用n个字符c来构造string对象
在这里插入图片描述
(7)template<class InputIterator>
string(InputIterator first,InputIterator last)
在这里插入图片描述

  1. (destructor)—析构
 ~string();

每个对象在生命周期结束时会自动调用该析构函数

  1. operator=—赋值
    (1)string& operator= (const string& str);
    (2)string& operator= (const char* s);
    (3)string& operator= (char c);
    在这里插入图片描述

2.2.2 迭代器

暂时理解—是一个类似于指针的玩意儿
2. begin() && end()
iterator begin() | const_iterator begin() const;
iterator end() | const_iterator end() const;
3. rbegin() && rend()
reverse_iterator rbegin() | const_reverse_iterator rbegin() const;
reverse_iterator rend() | const_reverse_iterator rend() const;
画图解释:
在这里插入图片描述
在这里插入图片描述

2.2.3 容量相关

  1. size_t size() const;
  2. size_t length() const ;
    size() 和length()功能完全一致,都是获取字符串的有效长度
    展示:
    在这里插入图片描述

疑问:为什么string要提供两个功能完全一致的方法size()和length()呢?

原因: length是因为沿用C语言的习惯而保留下来的,string类最初只有length,引入STL之后,为了兼容又加入了size,它是作为STL容器的属性存在的,便于符合STL的接口规则,以便用于STL的算法

  1. size_t capacity() const;
    获取string对象在底层维护的顺序表的容量
    在这里插入图片描述

  2. void resize(size_t newsize); | void resize(size_t newsize,char c);
    resize—将string对象现有的有效元素个数更新为newsize个
    注意:newsize的值可以大于原来有效元素的个数,也可以小于。因此,我们在使用resize的时候要注意区分。具体情况见下图:
    在这里插入图片描述
    下面我们通过代码验证上述的每个情况:
    ①验证newsize<= oldsize
    在这里插入图片描述
    ②验证newsize > oldsize && newsize <= capacity
    在这里插入图片描述
    ③验证newsize > olssize && newsize > capacity
    在这里插入图片描述

  3. void reverse(size_t newcapacity = 0);
    作用:扩容,只改变容量,不会修改有效元素的个数
    假设string中原来的容量为oldcapacity,现在的参数为newcapacity
    在这里插入图片描述
    验证:
    (1)newcapacity <= oldcapacity
    ①newcapacity <= oldcapacity && oldcapacity <= 15
    在这里插入图片描述
    ②newcapacity <= oldcapacity && oldcapacity > 15 && newcapacity >15
    在这里插入图片描述
    ③newcapacity <= oldcapacity && oldcapacity > 15 && newcapacity <=15
    在这里插入图片描述
    为什么在newcapacity<=15 && oldcapacity > 15的情况下,缩小容量会变成15?
    原因分析:在string类的内部除了维护顺序表必须的三个成员以外,还有一个char array[BUF_SIZE],该数组的大小为16。具体如下图
    在这里插入图片描述
    (2)newcapacity > oldcapacity
    会进行扩容,主要执行以下步骤:
    开辟新空间—>拷贝元素---->释放旧空间—>返回新空间
    在这里插入图片描述
    验证string内部扩容的方式~
    Ⅰ在Windows平台下使用VS2013验证

    在这里插入图片描述
    Ⅱ在Linux平台下验证
    在这里插入图片描述
    在这里插入图片描述

  4. void clear();
    清空有效元素,不改变空间大小
    在这里插入图片描述

2.2.4 元素访问 && 元素遍历

元素访问

使用[]和at两类方法访问元素时,效果一样,只是针对于异常情况的处理方式不一样。具体区别如下:
(1)operator[]
char& operator[](size_t pos) | const char& operator[](size_t pos)const
在访问越界的时候,会触发assert断言,直接终止程序
在这里插入图片描述
(2)at
char& at(size_t pos) | const char& at(size_t pos) const
在访问越界的时候,会抛出异常,用户可以对其进行捕获
在这里插入图片描述

总结operator[] 与at:
在这里插入图片描述
(3)front----C++11
char& front(); | const char front()const
C++11中引入的新方法,获取string的第一个字符
(4)back----C++11
char& back(); | const char back()const
C++11中引入的新方法,获取string的最后一个字符
在这里插入图片描述
疑问:为什么这些元素访问类的函数,都会提供const和非const两份代码呢?

这个想要搞清楚,首先要明白const修饰成员函数后有哪些特性!(深入了解点这里)由于const对象不能调用非const的成员函数,所以必须提供两份代码。不然被const修饰对象就无法调用该方法,那也就意味着无法访问string的pos处的元素,这显然是不合理的!因此,对于这种元素访问类型的方法,需要提供两份代码!

元素遍历

(1)for循环+[]访问
(2)迭代器
(3)范围for
这个比较简单,直接看代码

int main()
{
	string str("hello");
	//for+[]
	for (int i = 0; i < str.size(); i++)
	{
		cout << str[i];
	}
	cout << endl;
	//迭代器
	string::iterator it = str.begin();
	while (it != str.end())
	{
		cout << *it;
		it++;
	}
	cout << endl;
	//范围for
	for (auto e : str)
	{
		cout << e;
	}
	cout << endl;
	return 0;
}

2.2.5 修改相关

  1. operator+=
    string& operator+=(const string& str);—末尾追加string
    string& operator+=(const char* s);----末尾追加C中的字符串
    string& operator+=(const char c);—末尾追加字符
    在这里插入图片描述
  2. append
    string& append(const string& str);
    功能:末尾追加一个str
    在这里插入图片描述
    string& append(const string& str,size_t subpos,size_t sublen);
    功能:将str从subpos开始,长度为sublen的子串追加到调用者的末尾
    在这里插入图片描述
    string& append(const char* s);
    功能:在末尾追加一个C中的字符串
    在这里插入图片描述
    string& append(const char* s,size_t n);
    功能:在末尾追加字符串s从0号位置开始,长度为n的子串
    在这里插入图片描述
    string& append(size_t n,char c);
    功能:在末尾追加n个char类型的元素c
    在这里插入图片描述
    template<calss IputIterator>
    string& append(InputIterator first,InputIterator last);
    功能:将迭代器first–last区间内的内容追加到字符串的末尾
    在这里插入图片描述
  3. push_back
    void push_back(char c);
    功能:末尾追加一个字符c
    在这里插入图片描述
  4. insert
    string& insert(size_t pos,const string& str);
    功能:在pos处,插入字符串str
    在这里插入图片描述
    string& insert(size_t pos,const string& str,size_t subpos,size_t sublen);
    功能:在pos处插入str从subpos开始,长度为sublen的子串
    在这里插入图片描述
    string& insert(size_t pos,const char* s);
    功能:在pos处插入C中的字符串s
    在这里插入图片描述
    string& insert(size_t pos,const char* s,size_t n);
    功能:在pos处插入字符串s的前n个字符
    在这里插入图片描述
    string& insert(size_t pos,size_t n,char c);
    void insert(iterator p,size_t n,char c);
    功能:在pos或者p处插入n个字符c
    在这里插入图片描述
  5. erase
    string& erase(size_t pos = 0,size_t len = npos);
    功能:删除从pos开始,长度为len的子串。
    注意:pos和len均为缺省参数,默认删除整个字符串
    在这里插入图片描述
    iterator erase(iterator p);
    功能:删除p位置的元素,返回下一个元素的位置
    在这里插入图片描述
    注意:在删除字符串的最后一个位置时,返回值是非法的,无法再次被使用
    在这里插入图片描述
    iterator erase(iterator first,iterator last);
    删除区间first–last之间的元素
    在这里插入图片描述
  6. swap
    void swap(string& str);
    功能:交换两个string类型的对象,string::swap效率比全局的swap要高,在交换字符串的时候强烈建议使用string::swap
    在这里插入图片描述

2.2.6 其他

  1. c_str
    const char* c_str() const;
    以C语言的方式返回字符串string
    在这里插入图片描述
  2. find
    size_t find(const string& str,size_t pos = 0)const;
    功能:在目标字符串中查找str字符串出现的位置,默认从头开始查找。找到返回str首个字符在目标字符串中的位置,找不到返回npos
    在这里插入图片描述
    size_t find(const char* s,size_t pos = 0)const;
    功能与上一个一致,唯一区别是这个查询的是C中的字符串
    size_t find(const char* s,size_t pos,size_t n)const;
    功能:查询C中字符串的前n个字符
    size_t find(char c,size_t pos=0)const;
    功能:查询字符c的位置,,哦人从0下标开始查询
  3. rfind
    功能与find类似,只不过是从字符串的末尾向起始位置查找
    在这里插入图片描述
  4. find_first_of
    与find类似,只不过是查找第一次出现的某一个字符或字符串
    接口如下:

size_t find_first_of(const string& str,size_t pos=0)const;

找第1次出现string str的位置,默认从头开始查找

size_t find_first_of(const char*s,size_t pos=0)const;

找第1次出现C语言字符串s的位置,默认从头开始查找

size_tfind_first_of(const char* s,size_t pos,size_t n)const;

找第1次出现C语言字符串s从pos开始,长度为n的子串的位置,

size_t find_first_of(char c,size_tpos=0)const;

找第1次出现字符c的位置,默认从起始位置开始查找

  1. find_last_of
    与rfind类似,只不过是查找第一次出现的某一个字符或字符串
    接口如下:

size_t find_last_of(const string& str,size_t pos=npos)const;

找第1次出现string str的位置,默认从末尾开始查找

size_t find_last_of(const char*s,size_t pos=npos)const;

找第1次出现C语言字符串s的位置,默认从末尾开始查找 ③`size_t

find_last_of(const char* s,size_t pos,size_t n)const;`

找第1次出现C语言字符串s从pos开始,长度为n的子串的位置,

size_t find_last_of(char c,size_tpos=npos)const;

找第1次出现字符c的位置,默认从末尾开始查找

  1. substr
    string& substr(size_t pos,size_t len = mpos)const;
    功能:截取子串,pos为截取的起始位置,len表示截取的长度
    在这里插入图片描述

ok~以上就是string容器的基本接口介绍及其使用,当然,这些也不是全部的接口,只是一些比较常用的接口!更下详细的可以参考http://www.cplusplus.com/
各位看官要是觉得有所收获,留下你们的足迹!
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C++】string使用 的相关文章

随机推荐

  • 五种方法解除开机密码

    5种方法解除开机密码 教你怎样解除电脑开机密码 先记下来 以后总会有用到的 此方法仅供计算机教师交流 严禁作为非法手段使用
  • 生成项目目录树

    写项目设计文档或者在写新项目的README md文件时 都需要展示项目的一些重要的目录结构 其实可以通过安装brew等方法来进行 但是推荐一个插件 vscode中下载插件tree generator 安装完成后打开需要生成的目录结构树的项目
  • 深度学习(6):图像超分辨率(Image Super Resolution)重建

    目标 使用深度学习技术对图像进行超分辨率重建 涉及到的技术包括卷积神经网络 生成对抗网络 残差网络等 技术 本实验使用到 Jupyter Notebook 等开发组件 涉及到了 TensorFlow NumPy scipy misc PIL
  • LeetCode160-------相交链表(java)

    题目中文链接 编写一个程序 找到两个单链表相交的起始节点 例如 下面的两个链表 节点 c1 开始相交 注意 如果两个链表没有交点 返回 null 在返回结果后 两个链表仍须保持原有的结构 可假定整个链表结构中没有循环 程序尽量满足 O n
  • 有哪些期货交易理念(期货交易的概念及主要特征)

    在期货和股票市场里面 什么是交易理念 所谓交易理念 我认为就是你所认为的构建你交易策略的基础 是制定交易系统的逻辑基础 比如 你觉得现在是涨势 那么在回调的时候做多 是一种交易理念 跌势 反弹放空是一种交易理念 震荡市 震荡区间下不开多 上
  • 斐讯r1换网络_新房装修网络布线方案二:客厅电视柜放单个路由器覆盖全屋

    继续研讨新房装修的家庭网络搭建的问题 我昨天推荐的是一个AC AP的方案 如果是小户型 对网络这块要求并不高 比如 并不要求全屋都5G覆盖满的 基于成本考虑 可以先不上AC AP 先用一个性能稍好的千兆路由器 比如 斐讯的K2p 网件R70
  • WinDbg Command-Line Options

    First time users of WinDbg should begin with the Debugger Operation section The WinDbg command line uses the following s
  • SQL注入点判断及注入方式

    SQL注入类型 一 判断注入点 当参数可控时 看参数是否对数据产生影响 若有影响则可能是注入点 输入SQL看是否可以产生报错 通过报错信息得到数据库部分语句 利用引号 双引号 圆括号进行报对 二 注入方式 get注入 在get传参时写入参数
  • 简便快捷 解决burp suite不能抓本地包的问题

    v 解决burp suite不能抓本地包的问题 蛋黄小课堂开课啦 蛋黄碎碎念 第一次遇到不能抓本地包的时候 通过百度找到用本机实际IP地址替代 127 0 0 1 的方法可以解决不能抓本地包的问题 但是后来又不行了 于是再百度 找了好久 最
  • 伪似然估计(Pseudo Maximum Likelihood Estimation)

    伪似然估计 和 剖面似然估计 伪似然估计 参考文献 Gong G and Samaniego F J 1981 pseudo Maximum Likelihood Estimation Theory and Applications The
  • 属性layout_weight不起作用的解决方法

    在使用线性布局的时候 使用layout weight属性来达到控件自适应屏幕宽度的效果 但是有的时候这个属性没有起作用 这个时候就需要仔细检查一下 1 只有LinearLayout标签支持 2 设置layout weight时要根据布局的方
  • SSM实战项目——Java高并发秒杀API

    SSM实战项目 Java高并发秒杀API 项目截图 秒杀列表 秒杀详情页 错误提示 开始秒杀 秒杀成功 重复秒杀 秒杀倒计时 秒杀结束 项目介绍 何为秒杀 所谓 秒杀 就是网络卖家发布一些超低价格的商品 所有买家在同一时间网上抢购的一种销售
  • c++智能指针

    智能指针是一种用于管理动态分配的内存的工具 它可以自动地不再需要时释放内存 智能指针目的 避免内存泄漏和释放已经释放的内存 用法 会在堆上分配内存 并在不再需要时自动释放 通常会跟踪指向堆上对象的引用计数 并在引用计数为0时自动释放内存
  • linux软连接显示broken link

    解决方案 sudo ln s 源文件 目标文件 注 两者必须为绝对路径
  • 关于测试用例

    测试专栏 软件测试的基本概念 关于软件测试 作为一个测试人员 这些基础知识必不可少 目录 一 测试用例的基本要素 1 什么是测试用例 2 为什么软件测试人员要写测试用例 二 测试用例的设计方法 1 基于需求设计测试用例 2 具体设计测试用例
  • docker制作镜像,导出导入本地镜像等初级指南

    首先安装 docker 1 prepare 更改 yum 源加快安装环境 添加下面 yum 源 docker ce stable name Docker CE Stable basearch baseurl https mirrors al
  • 当绘图遇上Caché之元数据代理

    很久以前到沈阳实习的时候还一个个问度娘C 画图 画了电路图绘制软件的毕业设计 雪花屏保等等 搞LIS软件后绘制各种仪器图 对C 画笔 画字符串 画线 画圆等等耳熟能详 然而却碰到一个问题 我们的仪器大部分是盒子用数据库M连接的 如果盒子仪器
  • micropython RX8025T 驱动简单演示

    我就知道可能八百年会有一位大哥来找这个驱动 让我来猜猜为啥用这个 嫌一般的RTC不够精准是吧 想用个带温度补偿的试试 代码拿去 其实巨简单的 没啥好说的 而且只有基本功能 from micropython import const impo
  • 容器的docker-compose怎样写agent.jar配置

    在 Docker Compose 文件中配置 Java Agent 例如 agent jar 的方式与之前的环境变量类似 您可以使用 environment 字段来设置 Java 环境变量 包括 javaagent 参数来指定 Java A
  • 【C++】string使用

    文章目录 1 为什么要学习string类 2 标准库中的string类 2 1了解string类 2 2string类常用的接口 2 2 1 构造和析构相关 2 2 2 迭代器 2 2 3 容量相关 2 2 4 元素访问 元素遍历 元素访问