C++ —— 关于string类

目录

1. auto和范围for

1.1 auto关键字

1.2 范围for

2. string的三种遍历方式

3. string类的常用接口说明

3.1 成员函数

3.2 Iterators:(迭代器)

3.2.1正向迭代器和反向迭代器

3.3 Capacity(容量)

3.4 Modifiers(修饰符)

3.5 Non-member function overloads(非成员函数重载)

3.6 operator []



string文档链接:cplusplus.com/reference/string/string/?kw=stringicon-default.png?t=O83Ahttps://cplusplus.com/reference/string/string/?kw=string

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


1. auto和范围for

1.1 auto关键字

aotu的价值就是用来自动赋值,自动迭代,自动判断结束,底层就是迭代器

简化代码,替换了常类型

std::map<std::string, std::string>::iterator it = dict.begin();
//简化成
auto it = dict.begin();

1.  auto类型的对象的类型是处于待定状态的,它是由初始化的内容所决定的

 auto关键字是一个占位符,编译器执行该类型对象的定义时,先根据初始化的内容的类型A开等大的空间作为该对象的空间,A再替换auto(先占位置,后替换

2. 用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型或者要修改内容时则必须加上引用&


、字符赋值,自动迭代,自动判断结束// 底层就是迭代器//for (auto ch : s2)这样写是拷贝//修改内容要加上引用符号&for (auto& ch : s2){//修改string里的值ch -= 2;cout << ch << " ";}cout << endl;cout << s2 << endl;

3. 当在同一行声明多个变量时,这些变量必须是相同的类型

//同为int类型,正确
auto aa = 1, bb = 2;
//类型不同,错误
auto cc = 3, dd = 4.0;

否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后会默认其他也是这个类型

4. auto不能作为函数的参数也不能给缺省值

// 不能做参数
void func2(auto a)
{}

但是可以做返回值,但是建议谨慎使用

// 可以做返回值,但是建议谨慎使用
auto func3()
{return 3;
}

5. auto不能直接用来声明数组

#include<iostream>
using namespace std;
int func1(){return 10;}// 不能做参数
void func2(auto a){}
// 可以做返回值,但是建议谨慎使用auto func3(){return 3;}int main(){int a = 10;auto b = a;auto c = 'a';auto d = func1();
// 编译报错:rror C3531: “e”: 类型包含“auto”的符号必须具有初始值设定项auto e;cout << typeid(b).name() << endl;cout << typeid(c).name() << endl;cout << typeid(d).name() << endl;int x = 10;auto y = &x;auto* z = &x;auto& m = x;cout << typeid(x).name() << endl;cout << typeid(y).name() << endl;cout << typeid(z).name() << endl;auto aa = 1, bb = 2;
// 编译报错:error C3538: 在声明符列表中,“auto”必须始终推导为同一类型auto cc = 3, dd = 4.0;
// 编译报错:error C3318: “auto []”: 数组不能具有其中包含“auto”的元素类型auto array[] = { 4, 5, 6 };return 0;
}

#include<iostream>
#include <string>
#include <map>
using namespace std;
int main(){std::map<std::string, std::string> dict = { { "apple", "苹果" },{ "orange","橙子" }, {"pear","梨"} };// auto的用武之地//std::map<std::string, std::string>::iterator it = dict.begin();auto it = dict.begin();while (it != dict.end()){cout << it->first << ":" << it->second << endl;++it;}return 0;}


1.2 范围for

1. for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围,自动迭代,自动取数据,自动判断结束

2. 范围for的作用就是遍历数组和容器对象(主要用于容器)

// C++11的遍历
for (auto& e : array)e *= 2;for (auto e : array)
cout << e << " " << endl;

加上&就可以修改其中的内容(e * = 2),如果不修改就可以不加

3. 范围for的底层就是迭代器,容器遍历实际就是替换为迭代器

#include<iostream>
#include <string>
#include <map>
using namespace std;
int main()
{int array[] = { 1, 2, 3, 4, 5 };// C++11的遍历for (auto& e : array)e *= 2;for (auto e : array)cout << e << " " << endl;string str("hello world");for (auto ch : str){cout << ch << " ";}cout << endl;
return 0;
}


2. string的三种遍历方式

#include<iostream>
#include<string>
#include<map>
#include<list>
using namespace std;//class string
//{
//private:
//	char _buff[16];
//	char*  _str;
//
//	size_t _size;
//	size_t _capacity;
//};// string:: :展开string库
// iterator:迭代器
// it:使用迭代器定义的对象
// begin():返回这块空间开始位置的迭代器
// end:返回最后一个数据的下一个位置(\0)
//string::iterator it = s2.begin();
//while (it != s2.end())
//{
//
//	cout << *it << " ";
//	++it;
//}
//cout << endl;void test_string1()
{string s1;string s2("hello world");cout << s1 << s2 << endl;s2[0] = 'x';cout << s1 << s2 << endl;//访问+修改  第一种只支持数组,不支持树或者链表// 1、下标 + []for (size_t i = 0; i < s2.size(); i++){cout << s2[i] << " ";}cout << endl;// 2、迭代器  使用的偏少//string::iterator it = s2.begin();auto it = s2.begin();while (it != s2.end()){*it += 2;cout << *it << " ";++it;}cout << endl;cout << s2 << endl;//只是简单的遍历用第三种// 3、字符赋值,自动迭代,自动判断结束// 底层就是迭代器//for (auto ch : s2)for (auto& ch : s2){ch -= 2;cout << ch << " ";}cout << endl;cout << s2 << endl;
}


3. string类的常用接口说明

3.1 成员函数

 

1.  constructor(构造函数):

string();
创建一个空的string对象,也就是创建一个空的字符串
string (const char* s);
以 C 当中 str 的方式 创建这个 string对象,最后以 " \0 " 结尾
string (size_t n, char c);
string类当中有 n 个 c 这个字符
string (const string& str);
拷贝构造函数
string (const string& str, size_t pos, size_t len = npos);
拷贝构造函数,从某一位置开始(pos),拷贝 len 个字符
string (const char* s, size_t n);
构造一个string 类 ,在 s 常量字符串 的前n 个字符中拷贝

 

2.destructor(析构函数):string里的析构函数是自动析构的

3. operator= (运算符=):


3.2 Iterators:(迭代器)

类似指针,但不全是指针

begin:返回一个指向字符串的第一个字符的迭代器 
end:返回最后一个数据的下一个位置(\0)
rbegin:指向的是最后一个字符的位置
rend:指向的是第一个字符的前一个位置

3.2.1正向迭代器和反向迭代器

const迭代器的特点是只能读不能写

 正向:

1. Iterators      2. const_Iterators

begin:返回一个指向字符串的第一个字符的迭代器 
end:返回最后一个数据的下一个位置(\0)

 反向迭代器:倒着遍历使用

1. reverse_Iterators      2.const_reverse_Iterators

rbegin:指向的是最后一个字符的位置
rend:指向的是第一个字符的前一个位置

void test_string2()
{string s2("hello world");string::iterator it = s2.begin();while (it != s2.end()){*it += 2;cout << *it << " ";++it;}cout << endl;string::reverse_iterator rit = s2.rbegin();while (rit != s2.rend()){cout << *rit << " ";++rit;}cout << endl;const string s3("hello world");//string::const_iterator cit = s3.begin();auto cit = s3.begin();while (cit != s3.end()){//*cit += 2;cout << *cit << " ";++cit;}cout << endl;//string::const_reverse_iterator rcit = s3.rbegin();auto rcit = s3.rbegin();while (rcit != s3.rend()){// *rcit += 2;cout << *rcit << " ";++rcit;}cout << endl;
}


3.3 Capacity(容量)

size返回字符串有效字符长度
empty 判断字符串是否为空串,是返回true,否则返回false
reserve 

提前开辟好要开辟的空间,根据计划的大小更改调整字符串容量,长度最多大于 n 个字符

如果开辟100个空间,那么实际上开辟101个空间,多的一个给\0

为字符串预留空间**

resize 将有效字符的个数该成n个,多出的空间用字符c填充 ,string部分使用的不多
clear

清空所有的数据,但是不清除容量

length返回字符串有效字符长度
capacity返回空间总大小


 

1. size与length底层实现原理完全相同,引入size的原因是因为length不具有通用性,size具有通用性,所以基本都是用size,但是length不能舍弃

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不会改变容量大小

 

// 测试string容量相关的接口
// size/clear/resize
void Teststring1()
{// 注意:string类对象支持直接用cin和cout进行输入和输出string s("hello, bit!!!");cout << s.size() << endl;cout << s.length() << endl;cout << s.capacity() << endl;cout << s << endl;// 将s中的字符串清空,注意清空时只是将size清0,不改变底层空间的大小s.clear();cout << s.size() << endl;cout << s.capacity() << endl;// 将s中有效字符个数增加到10个,多出位置用'a'进行填充// “aaaaaaaaaa”s.resize(10, 'a');cout << s.size() << endl;cout << s.capacity() << endl;// 将s中有效字符个数增加到15个,多出位置用缺省值'\0'进行填充// "aaaaaaaaaa\0\0\0\0\0"// 注意此时s中有效字符个数已经增加到15个s.resize(15);cout << s.size() << endl;cout << s.capacity() << endl;cout << s << endl;// 将s中有效字符个数缩小到5个s.resize(5);cout << s.size() << endl;cout << s.capacity() << endl;cout << s << endl;
}


3.4 Modifiers(修饰符)

operatot-=在字符串后追加字符串str
append在字符串后追加一个字符串
push_back在字符串后尾插字符
c_str返回底层字符串的指针,兼容C语言
find+npos从字符串pos位置开始往后找字符,返回该字符在字符串中的
位置,正着找
rfind从字符串pos位置开始往前找字符,返回该字符在字符串中的
位置,倒着找
substr在str中从pos位置开始,截取n个字符,然后将其返回

// 1. 插入(拼接)方式:push_back  append  operator+= 
// 2. 正向和反向查找:find() + rfind()
// 3. 截取子串:substr()
// 4. 删除:erase
void Teststring5()
{string str;str.push_back(' ');   // 在str后插入空格str.append("hello");  // 在str后追加一个字符"hello"str += 'b';           // 在str后追加一个字符'b'   str += "it";          // 在str后追加一个字符串"it"cout << str << endl;cout << str.c_str() << endl;   // 以C语言的方式打印字符串// 获取file的后缀string file("string.cpp");size_t pos = file.rfind('.');string suffix(file.substr(pos, file.size() - pos));//suffix:后缀cout << suffix << endl;// npos是string里面的一个静态成员变量// static const size_t npos = -1;// 取出url中的域名string url("http://www.cplusplus.com/reference/string/string/find/");cout << url << endl;size_t start = url.find("://");if (start == string::npos){cout << "invalid url" << endl;return;}start += 3;size_t finish = url.find('/', start);string address = url.substr(start, finish - start);cout << address << endl;// 删除url的协议前缀pos = url.find("://");url.erase(0, pos + 3);cout << url << endl;
}

3.5 Non-member function overloads(非成员函数重载)

operator+可以string+字符串 或者 字符串+string
operator>>输入运算符重载
operator<<输出运算符重载
getline获取一行字符串
relational operators大小比较


3.6 operator []

operator[] 在C当中 " [] " 这个操作符相当于是 解引用操作,只有在连续的空间当中才能使用这个 " [] " 这个操作符,比如在栈上开辟的数组和 堆上动态开辟的空间

那么在自定义类型string 类当中,我们也可以使用 " [] " 来访问这个字符串数组

使用 下标 + []  的方式来访问string自定义类型

 

	string s3("hello world");// 直接打s3 当中的内容cout << s3 << endl;// 下标 + []for (int i = 0; i < s3.size(); i++){cout << s3[i];}cout << endl;return 0;

operator []返回pos位置的字符,const string类对象调用
begin+endbegin获取一个字符的迭代器 + end获取最后一个字符下一个位
置的迭代器

 


                                                                   感谢观看~

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

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

相关文章

智算时空 重塑视界│智汇云舟2024视频孪生产品发布会圆满举行,多个“全球首款”重磅亮相

​秋风送爽&#xff0c;丹桂飘香。9月6日&#xff0c;由北京智汇云舟科技有限公司主办&#xff08;简称&#xff1a;智汇云舟&#xff09;&#xff0c;北京北科软科技有限公司&#xff08;简称&#xff1a;北科软&#xff09;、北京恒升联合科技有限公司&#xff08;简称&#…

Leetcode 236-二叉树的最近公共祖先

同剑指offer 68-II 二叉树的最近公共祖先/lcr 194 题目描述 题目转载自LeetCode 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0…

【Rust】Mdbook插件开发和分享——多图浏览和多语言代码

mdbook-image-slider 受DevExpress文档多图浏览的启发&#xff0c;我开发这个插件&#xff0c;在查看多个图片和图片的描述的时候非常方便 项目地址&#xff1a;https://github.com/VinciYan/mdbook-image-slider.git 特点 鼠标置于图片查看区域时显示切换图片按钮鼠标点击图…

VS Code 文件定位功能

1、取消“当前打开文件”的自动定位功能。 设置 ->搜索 Explorer: Auto Reveal -> 将配置改为 false 2.在vs2017中定位文件 Tools->Option->Projects And Solutions->General, tick “track Active Item in Solution Explorer” 工具-> 选项->项目和…

iOS——GCD再学习

GCD 使用GCD好处&#xff0c;具体如下&#xff1a; GCD 可用于多核的并行运算&#xff1b;GCD 会自动利用更多的 CPU 内核&#xff08;比如双核、四核&#xff09;&#xff1b;GCD 会自动管理线程的生命周期&#xff08;创建线程、调度任务、销毁线程&#xff09;&#xff1b…

华为手机找不到wifi调试?不急,没有wifi调试一样可以进行局域网模式调试

最近小黄在使用uniapp启动无线调试的时候突然发现华为的手机突然找不到wifi调试了&#xff0c;那么我们怎么进行无线调试呢&#xff1f; 其实他只是找不到开关而已&#xff0c;正常使用就行。 1.使用数据线连接手机。 打开cmd命令行执行&#xff1a;adb tcpip 5555 2.再执行ad…

物联网之Arduino开发环境的下载与安装、ESP32开发环境的下载与安装、常见环境配置问题的解决办法、COM端口不可用的解决方法

MENU 前言下载和安装Arduino安装ESP32开发环境常见问题JSON下载失败和下载速度慢配置解释器没有发现端口检测到端口&#xff0c;但是有警告图标&#xff0c;端口无法使用 前言 想玩开发板必须得写代码&#xff0c;要不然Arduino不知道怎么运行&#xff0c;Arduino的开发语言是C…

❤《实战纪录片 1 》原生开发小程序中遇到的问题和解决方案

《实战纪录片 1 》原生开发小程序中遇到的问题和解决方案 文章目录 《实战纪录片 1 》原生开发小程序中遇到的问题和解决方案1、问题一&#xff1a;原生开发中 request请求中返回 的数据无法 使用this传递给 data{}中怎么办&#xff1f;2、刚登录后如何将token信息保存&#xf…

用于客户支持的 GenAI:探索 Elastic Support Assistant

作者&#xff1a;Chris Blaisure, Cory Mangini 我们很高兴地宣布推出 Elastic 的支持助手。本博客将带你了解我们最新的生成式 AI 工具以及它可以帮助你使用 Elastic 技术的一些常见场景。 Elastic 支持助手现已在 Support Hub 上可用 今天&#xff0c;我们宣布 Elastic 支持…

每日一题,力扣leetcode Hot100之206反转链表

原来的链表是1-2-3-4-5-null 反转后是5-4-3-2-1-null 只需要循环遍历&#xff0c;并且借一个temp便可以完成反转 class Solution:def reverseList(self, head: ListNode) -> ListNode:cur, pre head, Nonewhile cur:tmp cur.next # 暂存后继节点 cur.nextcur.next pre…

【软件测试】盒木进销存管理系统 需求说明书

目录 1 引言 2 项目概述 3 平台、角色和权限 3.1 Web端 4 Web端需求 4.1 登录/注册页面 4.1.1 业务描述 4.1.2 需求描述 4.1.3 行为人 4.1.4 UI页面 4.1.5 业务规则 4.2 首页 4.2.1 业务描述 4.2.2 需求描述 4.2.3 行为人 4.2.4 UI界面 4.2.5 业务规则 4.3报…

回归预测 | Matlab基于贝叶斯算法优化XGBoost(BO-XGBoost/Bayes-XGBoost)的数据回归预测+交叉验证

回归预测 | Matlab基于贝叶斯算法优化XGBoost(BO-XGBoost/Bayes-XGBoost)的数据回归预测交叉验证 目录 回归预测 | Matlab基于贝叶斯算法优化XGBoost(BO-XGBoost/Bayes-XGBoost)的数据回归预测交叉验证效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现基于贝叶…

第144天:内网安全-Linux权限维持OpenSSHPAM后门SSH软链接公私钥登录

目录 案例一&#xff1a; 权限维持-Linux-替换版本-OpenSSH 后门 案例二&#xff1a; 权限维持-Linux-更改验证-SSH-PAM 后门 案例三&#xff1a; 权限维持-Linux-登录方式-软链接&公私钥&新帐号 ssh软链接 公私钥 新帐号 案例一&#xff1a; 权限维持-Linux-替换…

记录|C#的软件图标更换

目录 前言一、软件界面的图标二、软件外的图标更新时间 前言 参考文章&#xff1a; 自己开发出的软件&#xff0c;肯定要更换图标&#xff0c;无论是软件打开前还是软件上的。如下图&#xff1a; 一、软件界面的图标 直接在Form的属性中进行icon的更换【如下图&#xff1a;】…

android kotlin 基础复习 继承 inherit

1、新建文件kt 2、代码&#xff1a; /**用户基类**/ open class Person1(name:String){/**次级构造函数**/constructor(name:String,age:Int):this(name){//初始化println("-------基类次级构造函数---------")println("name:${name},age:${age}")} }/**子…

线程的状态(java)

“苦&#xff1f; 何止是苦~~~~~” 本期内容来分享一下线程状态相关的知识哦&#xff01;&#xff01;&#xff01; 对于进程来说&#xff0c;进程是有两种状态的。 一种是就绪状态&#xff1a;正在CPU上执行&#xff0c;或者随时可以去CPU上执行的。 另一种是阻塞状态&…

PDF 全文多语言 AI 摘要 API 数据接口

PDF 全文多语言 AI 摘要 API 数据接口 PDF / 文本摘要 AI 生成 PDF 文档摘要 AI 处理 / 智能摘要。 1. 产品功能 支持多语言摘要生成&#xff1b;支持 formdata 格式 PDF 文件流传参&#xff1b;快速处理大文件&#xff1b;基于 AI 模型&#xff0c;持续迭代优化&#xff1b;…

自己动手实现mybatis的底层框架(不用动态代理直接用执行器、用动态代理自己实现。图文分析!)

目录 一.原生mybits框架图分析 自己实现Mybatis框架的分析 两种框架操作数据库的方法&#xff1a; 二.搭建开发环境 1.先创建一个maven项目 2.加入依赖(mysql dom4j junit lombok) 三.mybatis框架的设计思路 具体实现过程 3.1实现任务阶段 1- 完成读取配置文件&#x…

【Linux修行路】线程安全和死锁

目录 ⛳️推荐 一、线程安全 1.1 常见的线程不安全情况 1.2 常见的线程安全情况 1.3 常见的不可重入情况 1.4 常见可重入的情况 1.5 可重入与线程安全的联系 1.6 可重入与线程安全的区别 二、死锁 2.1 死锁的四个必要条件 2.2 如何避免产生死锁&#xff1f; ⛳️推荐…

西门子PLC与HMI之间的时间同步工控小周

HMI 时间同步功能工控人加入PLC工业自动化精英社群 HMI 设备具有时间同步功能&#xff0c;利用 HMI 设备的该功能&#xff0c;可实现 PLC 和 HMI 之间的时间同步&#xff0c;进而实现多个 PLC 之间的时间同步。 HMI 设备时间同步的属性&#xff1a; 1.HMI 设备既可作为主站对…