C++STL(一)——string类

目录

  • 一、string的定义方式
  • 二、 string类对象的容量操作
  • 三、string类对象的访问及遍历操作
  • 四、string类对象的修改操作
  • 五、string类非成员函数


一、string的定义方式

string是个管理字符数组的类,其实就是字符数组的顺序表。
它的接口也是非常多的。本章介绍一些常见使用如文档
string类实现了多个构造函数的重载,常用的构造函数如下

 ```
default (1)			string();	//无参构造copy (2)			string (const string& str); 	//拷贝str所指的字符序列substring (3)		string(const char* string& str, size_t pos,size_t len =npos);	//拷贝str字符串的第pos到最后一个字符from c-string (4)	string (const char* s);	//用C-string来构造string类对象,有'\0'string(const string& s);	 	//拷贝构造from sequence (5)	string (const char* s, size_t n);	//拷贝s字符串的前n个进行初始化fill (6)			string (size_t n, char c);	//string类对象中包含n个字符c```

使用示例

//常用
string s1;								//无参构造
string s2("羚羊");						//带参构造
string s3("this is a little sheep");	//带参构造
string s4(s2);							//拷贝构造//了解
string s5(7, '#');				//生成7个'#'字符的字符串
string s6(s3, 0, 3);			//从s3字符串第0下标拷贝3个字符
string s7(s3, 9);				//从s3字符串第8下标拷贝到结尾

二、 string类对象的容量操作

函数名称功能
size(重点)返回字符串有效字符长度
length返回字符串有效字符长度
capacity返回空间总大小
max_capacity返回最大空间
empty (重点)检测字符串释放为空串,是返回true,否则返回false
clear (重点)清空有效字符
reserve (重点)为字符串预留空间**
resize (重点)将有效字符的个数该成n个,多出的空间用字符c填充
int main()
{string s1("hello world");//在string类里等价,常用sizecout << s1.size() << endl;cout << s1.length() << endl;//根据编译器的不同结果也不同cout << s1.max_size() << endl;		cout << s1.capacity() << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;s1.clear();cout << s1.size() << endl;			//只清理字符数据cout << s1.capacity() << endl;		//不清理空间string s2("hello c++");//开空间,知道一共需要多少空间一次性开好空间后续就不需要扩容了//缩容是重新拷贝一块空间把数据拷贝进去,释放掉原空间s2.reserve(100);cout << s2.size() << endl;cout << s2.capacity() << endl;//开空间+初始化默认\0s2.resize(100, 'x');		//也可选定初始化字符cout << s2.size() << endl;cout << s2.capacity() << endl;s2.resize(20);		//如果只要前20个,把后面数据清掉cout << s2.size() << endl;cout << s2.capacity() << endl;//empty是string的判空函数,我们可以调用strcmp函数来实现,strcmp函数是用于比较两个字符串大小的函数,当两个字符串相等时返回0。bool empty(){return strcmp(_str, "") == 0;}return 0}

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

迭代器在任何容器中都是相通的,虽然各个容器结构不一样,但在用法上都是通用的。
iterator是像指针一样的类型,iterator提供了一种统一的方式访问和修改容器的数据,算法就可以通过迭代器去处理容器中数据。

//正向迭代器
iterator 
const iterator
//反向迭代器
reverse_iterator
const_reverse_iterator
函数名称功能
operator[] (重点)返回pos位置的字符,const string类对象调用
begin+ endbegin获取第一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
rbegin + rendrbegin获取最后一个有效字 符的迭代器 + rend获取第一个字符下一个位置的迭代器
范围forC++11支持更简洁的范围for的新遍历方式
#include<iostream>
#include<string>
using namespace std;int main()
{//[]运算符重载(可读可写)//[ ]运算符的重载是为了让string对象能像C字符串一样,通过[ ] +下标的方式获取字符串对应位置的字符char& operator[](size_t i)			//只读const char& operator[](size_t i)const{assert(i < _size); 	 //检测下标的合法性return _str[i];		 //返回对应字符}string s;string s1("hello world");cout << s1 << endl;			//普通直接打印//1. 下标+[]遍历,可对字符之间做控制和修改for (int i = 0; i < s1.size(); i++){s1[5] = '-';		//下标5的位置改为-cout << s1[i] << ' ';}cout << endl;//2.迭代器string::iterator it = s1.begin();while (it != s1.end()){cout << *it++ << ' ';}cout << endl;//3.范围for,其实底层就是迭代器for (auto ch : s1){cout << ch << ' ';}cout << endl;//逆置数组string s2("hello world");//写法等价auto rit = s2.rbegin();			//auto可自动识别类型string::reverse_iterator rit = s2.rbegin();while (rit != s2.rend()){cout << *rit++ << " ";}return 0;
}

四、string类对象的修改操作

函数名称功能
push_back在字符串后尾插字符c
insert插入字符或字符串
append在字符串后追加一个字符串
assign覆盖写入字符串
erase删除字符
operator=重载后该运算符支持string类的赋值、字符串的赋值以及字符的赋值
operator+= (重点)在字符串后追加字符串str
c_str返回C格式字符串
find + npos从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
rfind从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
substr在str中从pos位置开始,截取n个字符,然后将其返回

+=运算符的重载是为了实现字符串与字符、字符串与字符串之间能够直接使用+=运算符进行尾插。
+=运算符实现字符串与字符之间的尾插直接调用push_back函数即可。
1、使用push_back进行尾插

int main()
{string s1("hello");s1.push_back(' ');		//插入字符s1.push_back('c');s1.push_back('p');s1.push_back('p');cout << s1 << endl;		//hello cppreturn 0;
}

2、使用insert、append、assign插入

int main()
{string s1("hello world");//追加s1.append("abcde");cout << s1 << endl;		//hello worldabcdes1.assign("1234567");cout << s1 << endl;		//覆盖如上内容改为1234567//string& insert (size_t pos, const string& str);s1.insert(0, "hello");	//第0位置插入hellos1.insert(5, "world");	//第5位置插入worldcout << s1 << endl;		//helloworld1234567//string& insert (size_t pos, size_t n, char c);s1.insert(0, 7, 'x');	//第0字符插入7个x字符cout << s1 << endl;		//xxxxxxxhelloworld1234567//void insert (iterator p, size_t n, char c);s1.insert(s1.begin()+7, 7, 'y');	//第7个位置插入7个x字符cout << s1 << endl;		//xxxxxxxyyyyyyyhelloworld1234567
}

3.使用erase删除

int main()
{string s1("hello world");s1.erase(5, 1);			//下标第5个位置删除一个字符cout << s1 << endl;s1.erase(5);			//下标5之后都删除string s2("hello world");//两个写法头删s2.erase(0, 1);s2.erase(s2.begin());
}

4.截取网站每个部分

int main()
{string url = "https://cplusplus.com/reference/string/string/?kw=string";size_t pos1 = url.find("://");string protocaol;if (pos1 != string::npos){protocaol = url.substr(0, pos1);}cout << protocaol << endl;string domain;string uri;size_t pos2 = url.find('/',pos1+3);if (pos2 != string::npos){domain = url.substr(pos1 + 3, pos2 - (pos1 + 3));uri = url.substr(pos2 + 1);}cout << domain << endl;cout << uri << endl;
}

5.+和+=

int main()
{string s1;string s2("hello");//支持string类的赋值s1 = s2;cout << s1 << endl; //hello//支持字符串的赋值s1 = "world";cout << s1 << endl;  //world//支持字符的赋值s1 = 'x';cout << s1 << endl; //xstring s3;string s4("hello");//支持string类的复合赋值s3 += s4;cout << s1 << endl; //hello//支持字符串的复合赋值s3 += " world";cout << s3 << endl; //hello world//支持字符的复合赋值s3 += '!';cout << s4 << endl; //hello world!return 0;
}

五、string类非成员函数

operator+尽量少用,因为传值返回,导致深拷贝效率低
operator>> (重点)输入运算符重载
operator<< (重点)输出运算符重载
getline (重点)获取一行字符串
relational operators (重点)大小比较

1.string类中也对>>和<<运算符进行了重载,这就是为什么我们可以直接使用>>和<<对string类进行输入和输出的原因。

istream& operator>> (istream& is, string& str);
ostream& operator<< (ostream& os, const string& str);
int main()
{string s;cin >> s; //输入cout << s << endl; //输出return 0;
}

2.string类中还对一系列关系运算符进行了重载,它们分别是==、!=、<、<=、>、>=。重载后的关系运算符支持string类和string类之间的关系比较、string类和字符串之间的关系比较、字符串和string类之间的关系比较。

int main()
{string s1("abcd");string s2("abde");cout << (s1 > s2) << endl; //0cout << (s1 < s2) << endl; //1cout << (s1 == s2) << endl; //0return 0;
}

这些重载的关系比较运算符所比较的都是对应字符的ASCII码值。

3.使用>>进行输入操作时,当>>读取到空格便会停止读取,我们将不能用>>将一串含有空格的字符串读入到string对象中。

用法1
可以用getline函数完成一串含有空格的字符串的读取操作。

istream& getline (istream& is, string& str);

getline函数将从is中提取到的字符存储到str中,直到读取到换行符’\n’为止。

int main()
{string s;getline(cin, s);	 //输入:hello worldcout << s << endl;   //输出:hello worldreturn 0;
}

用法2

istream& getline (istream& is, string& str, char delim);

getline函数将从is中提取到的字符存储到str中,直到读取到分隔符delim或换行符’\n’为止。

int main()
{string s;getline(cin, s, 'l'); //输入:hello worldcout << s << endl;   //输出:hello worreturn 0;
}

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

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

相关文章

登录认证(5):过滤器:Filter

统一拦截 上文我们提到&#xff08;登录认证&#xff08;4&#xff09;&#xff1a;令牌技术&#xff09;&#xff0c;现在大部分项目都使用JWT令牌来进行会话跟踪&#xff0c;来完成登录功能。有了JWT令牌可以标识用户的登录状态&#xff0c;但是完整的登录逻辑如图所示&…

Python 网络爬虫实战:从基础到高级爬取技术

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 网络爬虫&#xff08;Web Scraping&#xff09;是一种自动化技术&#xff0c;利用程序从网页中提取数据&#xff0c;广泛…

MySQL锁类型(详解)

锁的分类图&#xff0c;如下&#xff1a; 锁操作类型划分 读锁 : 也称为共享锁 、英文用S表示。针对同一份数据&#xff0c;多个事务的读操作可以同时进行而不会互相影响&#xff0c;相互不阻塞的。 写锁 : 也称为排他锁 、英文用X表示。当前写操作没有完成前&#xff0c;它会…

93,【1】buuctf web [网鼎杯 2020 朱雀组]phpweb

进入靶场 页面一直在刷新 在 PHP 中&#xff0c;date() 函数是一个非常常用的处理日期和时间的函数&#xff0c;所以应该用到了 再看看警告的那句话 Warning: date(): It is not safe to rely on the systems timezone settings. You are *required* to use the date.timez…

51单片机 01 LED

一、点亮一个LED 在STC-ISP中单片机型号选择 STC89C52RC/LE52RC&#xff1b;如果没有找到hex文件&#xff08;在objects文件夹下&#xff09;&#xff0c;在keil中options for target-output- 勾选 create hex file。 如果要修改编程 &#xff1a;重新编译-下载/编程-单片机重…

【Rust自学】19.2. 高级trait:关联类型、默认泛型参数和运算符重载、完全限定语法、supertrait和newtype

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 19.2.1. 在trait定义中使用关联类型来指定占位类型 我们首先在第10章的10.3. trait Pt.1&a…

Elasticsearch:如何搜索含有复合词的语言

作者&#xff1a;来自 Elastic Peter Straer 复合词在文本分析和标记过程中给搜索引擎带来挑战&#xff0c;因为它们会掩盖词语成分之间的有意义的联系。连字分解器标记过滤器等工具可以通过解构复合词来帮助解决这些问题。 德语以其长复合词而闻名&#xff1a;Rindfleischetik…

web-SQL注入-CTFHub

前言 在众多的CTF平台当中&#xff0c;作者认为CTFHub对于初学者来说&#xff0c;是入门平台的不二之选。CTFHub通过自己独特的技能树模块&#xff0c;可以帮助初学者来快速入门。具体请看官方介绍&#xff1a;CTFHub。 作者更新了CTFHub系列&#xff0c;希望小伙伴们多多支持…

WPS动画:使图形平移、围绕某个顶点旋转一定角度

1、平移 案例三角形如下图&#xff0c;需求&#xff1a;该三角形的A点平移至原点 &#xff08;1&#xff09;在预想动画结束的位置绘制出图形 &#xff08;2&#xff09;点击选中原始图像&#xff0c;插入/动画/绘制自定义路径/直线 &#xff08;3&#xff09;十字星绘制的直线…

xmind使用教程

xmind使用教程 前言xmind版本信息“xmind使用教程”的xmind思维导图 前言 首先xmind是什么&#xff1f;XMind 是一款思维导图和头脑风暴工具&#xff0c;用于帮助用户组织和可视化思维、创意和信息。它允许用户通过图形化的方式来创建、整理和分享思维导图&#xff0c;可以用于…

KNIME:开源 AI 数据科学

KNIME&#xff08;Konstanz Information Miner&#xff09;是一款开源且功能强大的数据科学平台&#xff0c;由德国康斯坦茨大学的软件工程师团队开发&#xff0c;自2004年推出以来&#xff0c;广泛应用于数据分析、数据挖掘、机器学习和可视化等领域。以下是对KNIME的深度介绍…

2025年01月27日Github流行趋势

项目名称&#xff1a;onlook项目地址url&#xff1a;https://github.com/onlook-dev/onlook项目语言&#xff1a;TypeScript历史star数&#xff1a;5340今日star数&#xff1a;211项目维护者&#xff1a;Kitenite, drfarrell, iNerdStack, abhiroopc84, apps/dependabot项目简介…

TCL C++开发面试题及参考答案

进程和线程的区别 进程和线程都是操作系统中重要的概念,它们在很多方面存在着明显的区别。 从概念上来说,进程是资源分配的基本单位,每个进程都有自己独立的地址空间、内存、文件描述符等资源。例如,当我们在计算机上同时运行多个应用程序,像浏览器、文本编辑器等,每个应…

本地部署DeepSeek-R1模型(新手保姆教程)

背景 最近deepseek太火了&#xff0c;无数的媒体都在报道&#xff0c;很多人争相着想本地部署试验一下。本文就简单教学一下&#xff0c;怎么本地部署。 首先大家要知道&#xff0c;使用deepseek有三种方式&#xff1a; 1.网页端或者是手机app直接使用 2.使用代码调用API …

VS Code 复制正确格式的文件路径/文件夹路径 (绝对路径,相对路径, 斜杠 /, 反斜杠\\ 等)

VS Code 搜索 : baincd.copy-path-unixstyle Github : https://github.com/baincd/vscode-copy-path-unixstyle 插件市场: https://marketplace.visualstudio.com/items?itemNamebaincd.copy-path-unixstyle 支持复制各种格式的路径 格式 GitBash /c/chris/project-name/sr…

每天学点小知识之设计模式的艺术-策略模式

行为型模式的名称、定义、学习难度和使用频率如下表所示&#xff1a; 1.如何理解模板方法模式 模板方法模式是结构最简单的行为型设计模式&#xff0c;在其结构中只存在父类与子类之间的继承关系。通过使用模板方法模式&#xff0c;可以将一些复杂流程的实现步骤封装在一系列基…

python 中的堆

文章目录 小根堆的特点Python 中的 heapq 模块1. heapq.heappush(heap, item)2. heapq.heappop(heap)3. heapq.heapify(x)4. heapq.heappushpop(heap, item)5. heapq.heapreplace(heap, item)6. heapq.nsmallest(n, iterable)7. heapq.nlargest(n, iterable) 小根堆的应用场景示…

深度学习 Pytorch 基础网络手动搭建与快速实现

为了方便后续练习的展开&#xff0c;我们尝试自己创建一个数据生成器&#xff0c;用于自主生成一些符合某些条件、具备某些特性的数据集。 导入相关的包 # 随机模块 import random# 绘图模块 import matplotlib as mpl import matplotlib.pyplot as plt# 导入numpy import nu…

【RocketMQ】RocketMq之IndexFile深入研究

一&#xff1a;RocketMq 整体文件存储介绍 存储⽂件主要分为三个部分&#xff1a; CommitLog&#xff1a;存储消息的元数据。所有消息都会顺序存⼊到CommitLog⽂件当中。CommitLog由多个⽂件组成&#xff0c;每个⽂件固定⼤⼩1G。以第⼀条消 息的偏移量为⽂件名。 ConsumerQue…

注解与反射基础

注解 概述 注解&#xff08;Annotation&#xff09;&#xff0c;从jdk5.0引入。 作用 不是程序本身&#xff0c;可以对程序作出解释&#xff08;这一点和注释没什么区别&#xff09;可以被其他程序读取 格式 注释是以“注释名”在代码中存在的&#xff0c;还可以添加一些…