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

news2024/11/19 20:42:48

目录

前言:

 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.coloradmin.cn/o/1521139.html

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

相关文章

Linux课程_____用户的管理

一、规则 用户至少属于一个组,在创建时如果不指定组,将会创建同名的组 用户只能有一个基本组(主组),但可以隶属于多个附加组 如果一个组作为某用户的基本组,此组将不能被删除 UID: 用户标识 GID: 组的标识 root管理员的uid及gid 都为0 二、用户的配置文件 1./etc/passwd …

Arduino IDE的下载和安装

一、Arduino的介绍 Arduino是一款开源电子原型平台&#xff0c;主要包含两部分&#xff1a;硬件&#xff08;各种型号的Arduino板&#xff09;和软件&#xff08;Arduino IDE&#xff09;。这个平台由意大利的Massimo Banzi、David Cuartielles等人共同开发设计&#xff0c;并于…

mysql5.7离线安装 windows

windows上离线安装mysql5.7 下载安装包 去官网下载对应版本的mysql官网 点击archives,接着选择自己要下载的版本&#xff0c;选择windows系统&#xff0c;并根据自己电脑的位数选择相应的版本【找到“此电脑”&#xff0c;鼠标右击&#xff0c;出来下拉框&#xff0c;选择“属性…

CTF-希尔加解密

对于希尔加解密很多writeup都说用在线工具,所以研究了一下,写了一个方便的加解密python代码,根据给定的字母表及私钥字符串,尝试不同纬度不同重叠的加密矩阵输出加解密结果。运行效果如下: 代码文件Hill希尔加解密_final.py import numpy as np import string # 导入自定…

PHP异世界云商系统开源源码

系统更新与修复列表 1. 基于彩虹的二次开发 - 对彩虹系统进行了二次开发&#xff0c;增强了系统的功能和性能。2. 新增自定义输入框提示内容&#xff08;支持批量修改&#xff09; - 用户可以自定义输入框的提示内容&#xff0c;并支持批量修改&#xff0c;提升用户体验。3. 新…

【python】自动化工具Selenium与playwright去除webdriver检测

对这个世界如果你有太多的抱怨 跌倒了就不敢继续往前走 为什么人要这么的脆弱 堕落 请你打开电视看看 多少人为生命在努力勇敢的走下去 我们是不是该知足 珍惜一切 就算没有拥有 &#x1f3b5; 周杰伦《稻香》 # -*- coding:utf-8 -*- import timefrom s…

Docker基本配置及使用

Docker基本配置及使用 使用步骤 1.卸载旧版 代码如下&#xff1a;首先如果系统中已经存在旧的Docker&#xff0c;则先卸载 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engin…

C++进阶:详解多态(多态、虚函数、抽象类以及虚函数原理详解)

C进阶&#xff1a;详解多态&#xff08;多态、虚函数、抽象类以及虚函数原理详解&#xff09; 结束了继承的介绍&#xff1a;C进阶&#xff1a;详细讲解继承 那紧接着的肯定就是多态啦 文章目录 1.多态的概念2.多态的定义和实现2.1多态的构成条件2.2虚函数2.2.1虚函数的概念2…

P3374 【模板】树状数组 动态求连续区间和 刷题笔记

我们创建如下的树状数组来辅助操作 该数组每个s[i]处于第几层取决于其二进制 最后低位 的1处于从右往左数第几列 显然所有奇数的最右边一位都是1 即其最低位的1 处于右边第一列 所以所有的奇数处于第一层 而2&#xff0c;6&#xff0c;10&#xff0c;14的最低位1处于右边第二…

NVENC 视频编码器 API 编程指南 ( 中文转译 )

基于 NVIDIA Kepler™ 和更高版本 GPU 架构的 NVIDIA GPU 包含基于硬件的 H.264/HEVC/AV1 视频编码器&#xff08;以下简称 NVENC&#xff09;。NVENC 硬件采用 YUV/RGB 作为输入&#xff0c;并生成符合H.264/HEVC/AV1 标准的视频比特流。可以使用 NVIDIA 视频编解码器 SDK 中提…

低压保护测控产品解决方案【Acrel-2000M马达监控系统】

背景及需求 低压电机回路 低压进出线回路 越级跳闸 断路器的拒跳对系统安全运行威胁很大&#xff0c;一旦某一单元发生故障时&#xff0c;断路器拒动&#xff0c;将会造成上一级断路器跳闸&#xff0c;称为越级跳闸。断路器越级跳闸的危害这将扩大事故停电范围&#xff0c;甚…

数位排序——数组及lambda表达式应用

题目链接&#xff1a;1.数位排序 - 蓝桥云课 (lanqiao.cn) package lanqiao;import java.util.Arrays; import java.util.Scanner;/*** 2023/11/1* 蓝桥2122* 数位和排序&#xff0c;数位和相等的按大小排序*/ public class lanqiao2122_数位排序 {public static void main(Str…

从零开始利用MATLAB进行FPGA设计(四)生成优化HDL代码

文章灵感来源于MATLAB官方免费教程&#xff1a;HDL Coder Self-Guided Tutorial 考虑到MATLAB官网的英文看着慢&#xff0c;再加上视频讲解老印浓浓的咖喱味&#xff0c;我决定记录利用MATLAB&Simulink&SystemGenerator进行FPGA数字信号处理的学习过程。 往期回顾&am…

力扣大厂热门面试算法题 36-38

36. 有效的数独&#xff0c;37. 解数独&#xff0c;38. 外观数列&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.16 可通过leetcode所有测试用例。 目录 36. 有效的数独 解题思路 完整代码 Java Python 37. 解数独 解题思…

MySql入门教程--MySQL数据库基础操作

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

【C++从练气到飞升】03---构造函数和析构函数

&#x1f388;个人主页&#xff1a;库库的里昂 ✨收录专栏&#xff1a;C从练气到飞升 &#x1f389;鸟欲高飞先振翅&#xff0c;人求上进先读书。 目录 ⛳️推荐 一、类的6个默认成员函数 二、构造函数 1. 构造函数的概念 2. 构造函数的定义 3. 构造函数的特性 三、析构函…

leetcode 2312. 卖木头块【划分型dp+棋盘切割类型dp】

原题链接&#xff1a;2312. 卖木头块 题目描述&#xff1a; 给你两个整数 m 和 n &#xff0c;分别表示一块矩形木块的高和宽。同时给你一个二维整数数组 prices &#xff0c;其中 prices[i] [hi, wi, pricei] 表示你可以以 pricei 元的价格卖一块高为 hi 宽为 wi 的矩形木块…

【数据结构练习题】栈——1.括号匹配 2.逆波兰表达式求值 3.出栈入栈次序匹配 4.最小栈

♥♥♥♥♥个人主页♥♥♥♥♥ ♥♥♥♥♥数据结构练习题总结专栏♥♥♥♥♥ 文件目录 前言1.括号匹配1.1问题描述1.2解题思路1.3画图解释1.4代码实现2.逆波兰表达式求值 2.1问题描述2.2解题思路2.3画图解释2.4代码解释3.出栈入栈次序匹配 3.1问题描述3.2思路分析3.3画图解释3.…

Spring Chache入门详解、配套小案例

简介&#xff1a;Spring Cache是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;只需要添加一个注解就能实现缓存功能。 Spring Cache提供了一层抽象&#xff0c;底层可以切换不同的缓存实现&#xff0c;如下&#xff1a; EHCacheCaffeineRedis (这篇帖子&#xff…

Xcode调试Qt 源码

在Mac下使用Xcode 开发Qt程序&#xff0c;由于程序断点或者崩溃后&#xff0c;Qt库的堆栈并不能够正确定位到源码的cpp文件&#xff0c;而是显示的是汇编代码&#xff0c;导致不直观的显示。 加载的其他三方库都是同理。 所以找了攻略和研究后&#xff0c;写的这篇文章。 一&a…