[ C++ ] STL---string类的使用指南

目录

前言:

 string类简介

string类的常用接口

string类对象的构造函数

string类对象的赋值运算符重载

 string类对象的容量操作

string类对象的访问与遍历

[ ] + 下标遍历

迭代器遍历

普通迭代器iterator

​编辑 const迭代器const_iterator

反向迭代器reverse_iterator

范围for遍历

string类对象的修改操作

string类非成员函数


前言:

STL(standard template libaray-标准模板库):c++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架

  • STL的六大组件

容器:各种数据结构,比如顺序表、链表、双端队列、集合 、映射等,主要用于存放数据;

算法:主要用于操作容器中数据的模版函数,如 sort(插入排序,快速排序,堆排序);

迭代器:提供遍历容器中数据的方法,迭代器是一种将operator*、operator->、operator++等指针的相关操作赋予重载的类模版;

仿函数:仿函数是重载了operator()运算符的一个类/结构体,使其可以像函数一样被调用;

适配器:专门用于修饰现有类的接口,提供一种新的接口;

空间配置器:负责空间的配置与管理,配置器是一个实现了动态空间配置,空间管理、空间释放的类模版;

 string类简介

string是由类模板basic_string实例化出来的一个类,string本质为动态增长的字符数组;

string类的官方文档:string - C++ Reference

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

string类的常用接口

string类对象的构造函数


string();//无参构造(重点掌握)string (const string& str);//拷贝构造(重点掌握)string (const string& str, size_t pos, size_t len = npos);
//string类对象str的第pos个位置开始,向后拷贝len个字符初始化对象string (const char* s);//通过常量字符串s初始化对象(重点掌握)string (const char* s, size_t n);//字符串s的前n个字符初始化对象string (size_t n, char c); //n个字符c初始化对象template <class InputIterator> //迭代器区间构造string  (InputIterator first, InputIterator last);

  •  string::npos为静态成员变量,表示size_t的最大值;
  •  该值表示"直到字符串末尾",作为返回值它通常被用作表明没有匹配;

string类对象的赋值运算符重载

string& operator= (const string& str);//支持string类对象赋值string& operator= (const char* s);//支持常量字符串赋值string& operator= (char c);//支持单个字符赋值

 string类对象的容量操作

 size()与length()底层实现原理相同,皆返回字符串有效字符的长度(不包含'\0'),引入size()原因是为了与其他容器接口保持一致,一般情况下皆使用size()

 capacity()返回空间总大小,capacity()与size()大小可能相同,也有可能比size()更大;

 empty()检测字符串是否为空串,是返回true,否则返回false;

clear()将string类对象中的有效字符清空,不改变底层空间的大小;

 

reserve()为字符串预留空间,当reserve()的参数大于string的底层空间总大小时,reserve()只会改变capacity()的大小,但是具体扩容的容量取决于编译器,当reserve()的参数小于string的底层空间总大小时,reserve()什么都不做;

  • 扩容机制检测

vs平台下移1.5倍进行扩容,linux平台下以2倍进行扩容;

  •  n>capacity()时,扩容+尾插(指明字符c,尾插字符c,不指明字符,插入'\0')
  • size()<n<capacity()时,有效数据的个数size()改变为n,容量capacity()不确定,可能会扩容,可能不变;
  • n<size()时,容量capacity()不变,有效数据的个数size()改变为n,删除数据,保留前n个;

 

string类对象的访问与遍历

[ ] + 下标遍历

[ ]运算符重载返回字符串中下标为pos位置的字符的引用,重载[ ]运算符意味着string类对象可以像访问数组一样利用下标访问元素;

  char& operator[] (size_t pos); //可读可写
const char& operator[] (size_t pos) const //只读

若只实现const char& operator[] (size_t pos) const,则const对象可以调用此const成员函数,非const对象也可以调用此const成员函数,因为权限可以缩小;但是非const对象无法修改返回值,诞生函数重载形式 char& operator[] (size_t pos);

迭代器遍历

普通迭代器iterator
//string的底层物理结构
class string
{
public://迭代器的本质为重命名过的指针变量typedef char* iterator;//成员函数
private:char* _str;size_t _size;size_t _capacity;
};

 begin()函数返回string类对象的首位置;

end()函数返回string类对象的最后一个有效数据的下一个位置;

 const迭代器const_iterator
const_iterator begin() const;const_iterator end() const;
  1. const_iterator  本质为保护迭代器指向的内容不允许被修改
  2. const  iterator  本质为保护迭代器本身不允许被修改

反向迭代器reverse_iterator

范围for遍历

string类对象的修改操作

string类的修改接口设计的十分冗余,其中可以使用 operator += 替代append()与push_back(),因此只需重点学习 operator +=;

int main()
{string tmp("hello Linux!");string s1;// 在pos位置插入string类字符串// string& insert (size_t pos, const string& str);s1.insert(0, tmp);cout << s1 << endl;// 在pos位置插入str的子串(subpos位置开始的sublen个字符)// string& insert (size_t pos, const string& str, size_t subpos, size_t sublen);s1.insert(7, tmp, 0, 6);cout << s1 << endl;// 在pos位置插入字符指针指向的字符串// string& insert (size_t pos, constchar* s);s1.insert(2, "xxx");cout << s1 << endl;// 在pos位置插入字符指针指向的字符串的前n个字符// string& insert (size_t pos, const char* s, size_t n);s1.insert(7, "hello naiths", 8);cout << s1 << endl;// 在pos位置插入n个c字符// string& insert (size_t pos, size_t n, char c);s1.insert(0, 5, 'y');cout << s1 << endl;// 指定迭代器的位置插入n个字符c// void insert (iterator p, size_t n, char c);string::iterator it = s1.begin() + 10;s1.insert(it, 10, 'z');cout << s1 << endl;// 指定迭代器的位置插入字符c// iterator insert (iterator p, char c);s1.insert(s1.begin(), 'A');cout << s1 << endl;// 指定p位置插入迭代器区间的字符// template <class InputIterator>// void insert(iterator p, InputIterator first, InputIterator last);s1.insert(s1.begin(), tmp.begin() + 3, tmp.begin() + 8);cout << s1 << endl;// 删除pos位置开始的len个字符// string& erase (size_t pos = 0, size_t len = npos);s1.erase(2, 5);cout << s1 << endl;// 删除迭代器位置的那个字符// iterator erase (iterator p);s1.erase(s1.begin());cout << s1 << endl;// 删除迭代器区间的字符// iterator erase (iterator first, iterator last);s1.erase(s1.begin() + 2, s1.begin() + 5);cout << s1 << endl;return 0;
}

//算法库algorithm
template <class T> 
void swap ( T& a, T& b )
{T c(a); a = b; b = c;
}

void swap(string& s)
{std::swap(_str, s._str);std::swap(_capacity, s._capacity);std::swap(_size, s._size);
}

 算法库提供了swap()函数,为什么string类要单独提供一个呢?

使用string类中的swap只需要拷贝一个字符指针类型的数据,而使用算法库中的swap()需要拷贝整个string()类对象,消耗大;

 c_str()返回string类中存储字符串的字符指针,cpp需要兼容c语言,因为c语言没有string类,

 设计c_str()将string类转化为常量字符串;

find() 正向查找//从string类对象的pos位置开始,查找另一个string类对象str,
//若查找到,则返回第一次匹配的第一个字符的下标,若查找不到,返回string::npos
size_t find (const string& str, size_t pos = 0) const;//从string类对象的pos位置开始,查找常量字符串s
//若查找到,则返回第一次匹配的第一个字符的下标,若查找不到,返回string::npos
size_t find (const char* s, size_t pos = 0) const;//从string类对象的pos位置开始,查找常量字符串s的前n个字符组成的子字符串
//若查找到,则返回第一次匹配的第一个字符的下标,若查找不到,返回string::npos
size_t find (const char* s, size_t pos, size_t n) const;//从string类对象的pos位置开始,查找字符c
//若查找到,则返回第一次匹配的第一个字符的下标,若查找不到,返回string::npos
size_t find (char c, size_t pos = 0) const

 

rfind()与find()用法相同,区别仅在于find()为正向查找,而rfind()函数反向查找,不再过多赘述;

从string类对象的pos位置开始,向后提取长度为len的字符串,返回从指定位置pos开始的总长度为len的string类对象;

string类非成员函数

使用cin对string类对象进行流提取时,由于cin遇到空格与换行符会停止读取,当输入带有空格的字符串时会出现读取不完整的现象,此时需要使用getline()函数,getline()函数可以获取一行字符串,即遇到换行符才会停止读取,遇到空格不会停止读取;

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

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

相关文章

常见的WAFI攻击包括哪些

WIFI攻击是指黑客利用各种手段&#xff0c;对WIFI网络进行非法入侵和攻击&#xff0c;以获取用户的个人信息、网络权限或其他敏感数据。常见的WIFI攻击方式主要包括以下几种&#xff1a;伪造认证页面&#xff1a;黑客可以创建一个伪造的认证页面&#xff0c;当用户尝试连接到WI…

Vue2(三):绑定样式、条件渲染(v-if,v-show)、列表渲染(v-for)、key的原理、列表过滤、列表排序

一、绑定样式 1.绑定class样式 (1)字符串写法 适用于&#xff1a;样式类名不确定&#xff0c;需要动态获取。 <div id"root"><div class"basic" :class"mood" click"changeMood">test</div><!-- class是原本的…

Android Studio实现内容丰富的安卓旅游景点预定

获取源码请点击文章末尾QQ名片联系&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动 1.开发环境 android stuido3.6 jak1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.查看景点列表 3.查看景点详情 4.景点预定 5.购物车支付结算功能 6…

计算机网络:计算机网络概述

计算机网络&#xff1a;计算机网络概述 因特网概述网络&#xff0c;互连网&#xff0c;因特网因特网发展的三个阶段因特网的标准化工作因特网组成 计算机网络的定义计算机网络的分类按使用者分类按传输介质分类按网络的覆盖范围分类按拓扑结构分类 因特网概述 网络&#xff0c…

红外相机和RGB相机标定:实现两种模态数据融合

1. 前期准备 RGB相机&#xff1a;森云智能SG2-IMX390&#xff0c;1个红外相机&#xff1a;艾睿光电IR-Pilot 640X-32G&#xff0c;1个红外标定板&#xff1a;https://item.taobao.com/item.htm?_ujp3fdd12b99&id644506141871&spma1z09.2.0.0.5f822e8dKrxxYI 2.操作步…

目标检测---IOU计算详细解读(IoU、GIoU、DIoU、CIoU、EIOU、Focal-EIOU、SIOU、WIOU)

常见IoU解读与代码实现 一、✒️IoU&#xff08;Intersection over Union&#xff09;1.1 &#x1f525;IoU原理☀️ 优点⚡️缺点 1.2 &#x1f525;IoU计算1.3 &#x1f4cc;IoU代码实现 二、✒️GIoU&#xff08;Generalized IoU&#xff09;2.1 GIoU原理☀️优点⚡️缺点 2…

网络编程:数据库

一、作业 1> 创建一个工人信息库&#xff0c;包含工号&#xff08;主键&#xff09;、姓名、年龄、薪资。 2> 添加三条工人信息&#xff08;可以完整信息&#xff0c;也可以非完整信息&#xff09; 3> 修改某一个工人的薪资&#xff08;确定的一个&#xff09; 4> …

SAP上线计划Cutover Plan

在SAP项目中&#xff0c;上线计划Cutover Plan(另一说法是切换计划)是指在项目的最后阶段&#xff0c;即从旧系统过渡到新SAP系统的过程中&#xff0c;组织必须执行的一系列活动和步骤的详细计划。这个计划对于确保平稳、有序的系统过渡至关重要。Cutover计划通常涵盖了组织沟通…

【漏洞复现】Progress Kemp LoadMaster 命令注入漏洞(CVE-2024-1212)

0x01 产品简介 Progress Kemp LoadMaster是一款高性能的应用交付控制器&#xff0c;具有可扩展性&#xff0c;支持实体硬件和虚拟机的负载均衡。它提供了当今应用服务所需的各种功能&#xff0c;包括深度用户验证、资安防护&#xff08;如WAF/IPS/DDoS防护&#xff09;以及零信…

2024学习鸿蒙开发,未来发展如何?

一、前言 想要了解一个领域的未来发展如何&#xff0c;可以从如下几点进行&#xff0c;避免盲从&#xff1a; 国家政策落地情况就业市场如何学习 通过上述三点&#xff0c;就能分析出一个行业的趋势。大家可以看到&#xff0c;我上面的总体逻辑就是根据国家政策来分析未来方…

代码随想录day24(2)二叉树:合并二叉树(leetcode617)

题目要求&#xff1a;将两个二叉树合并&#xff0c;要求是将同位置处的两个节点值相加&#xff0c;如果一个为空那就将另一个二叉树的值覆盖。 思路&#xff1a;如果使用迭代法&#xff0c;就是通过层序遍历&#xff0c;通过队列进行判断进行相加。如果使用递归法&#xff0c;…

git基础-获取git仓库

通过本章的学习&#xff0c;应该能够配置和初始化一个仓库&#xff0c;开始和停止跟踪文件&#xff0c;暂存和提交更改。我们还将展示如何设置 Git 来忽略特定的文件和文件模式&#xff0c;如何快速轻松地撤销错误&#xff0c;如何浏览项目的历史记录并查看提交之间的更改&…

酷开科技聚焦大屏端数据研究,构建酷开系统深度挖掘大屏商业价值

中国所有的彩色大屏中&#xff0c;智能电视规模已经过半&#xff0c;OTT平台的数据价值越发引起人们关注。作为OTT行业的头部代表&#xff0c;酷开科技一直聚焦大屏端数据研究&#xff0c;目前已经形成一套基于大屏指数的智慧营销体系&#xff0c;让OTT大屏的数字营销化水平实现…

AI:150-基于深度学习的医学数据挖掘与病症关联发现

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带关键代码,详细讲解供大家学习,希望…

ModuleNotFoundError: No module named ‘torch_geometric‘

1. 解决办法——安装库 pip install torch_geometric -i https://pypi.tuna.tsinghua.edu.cn/simple总结 如果你仍然遇到问题&#xff0c;请确保你的pip或conda是最新版本&#xff0c;并且你正在使用的Python环境是激活的。此外&#xff0c;如果你的PyTorch版本与 torch_geom…

吴恩达机器学习-可选实验室:简单神经网络(Simple Neural Network)

在这个实验室中&#xff0c;我们将使用Tensorflow构建一个小型神经网络 import numpy as np import matplotlib.pyplot as plt plt.style.use(./deeplearning.mplstyle) import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.laye…

win10 配置 oh-my-posh

win10 配置 oh-my-posh 0. 前置1. 安装1.1. 软件1.2. 字体1.3. 激活1.3.1. Git Bash1.3.2. PowerShell 2. 配置2.1. 效果2.2. 说明2.3. 其他2.3.1. 新版PowerShell2.3.2 conda问题 0. 前置 这个东西毕竟是个&#xff0c;命令行美化工具&#xff0c;所以需要先有一个命令行&…

eth uniswap 套利交易案例四

交易hash: 0x085843b47c0d1b0f820b80c166ea8dd2e3928876fb353d107e49dcf879cf8426 交易时间&#xff1a; 2024.02.29 获利&#xff1a; 196,284刀 balancer 借了 338个 weth&#xff0c; 然后和 0x3BA6A019eD5541b5F5555d8593080042Cf3ae5f4 交易用 282个weth 换了293个wste…

【矩阵】54. 螺旋矩阵【中等】

螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5] 解题思路 1、模拟顺时针螺旋顺序遍历矩阵…

名词【语法笔记】

1.名词分为几大类 2.每一类&#xff0c;又有几个小类&#xff0c;以及所需要注意什么