string类篇超超超详解,40余个成员函数详细解释(图文)!看完包会!!

本篇目标

  1. constructor
  2. operator=
  3. Elements access
  4. Iterators
  5. Capacity
  6. Modifiers
  7. String operations
  8. member contants
  9. 其他函数

一、constructor(对象的创建)

void StrTest1()
{string s1;//直接构造cout << s1 << endl;//string里内置了流插入、流提取的函数重载,可直接打印string s2("hello world");//字符常量构造,有隐式类型转换cout << s2 << endl;string s3("hello world", 5);//取常量字符串的前5个进行打印cout << s3 << endl;string s4(s3); //拷贝构造cout << s4 << endl;string s5(s2, 2);//从s2的第二个字符开始(0 1 2 也就是l位置,若不给长度,直接全部拷贝)cout << s5 << endl;string s6(s2, 2, 4);//从第二个字符开始拷贝,到第四个字符cout << s6 << endl;string s7(7, 'x');//用7个x对其进行初始化cout << s7 << endl;string s8(s2.begin(), s2.end());//调用begin和end成员函数,其返回迭代器(迭代器很像指针,但不只指针)cout << s8 << endl;
}

 注意:end是返回指向容器最后一个位置下一个的迭代器,所以构造s8时,他的区间是左闭右开“[  )”的.

二、operator=(给对象赋值)

void StrTest2()
{string s2 = "hello world";//创建对象时直接初始化 ,相当于s2("hello world")cout << s2 << endl;string s3 = s2;//用类对象赋值初始化cout << s3 << endl;s2 = "5569";cout << s2 << endl;//string s4 = 'c';//错误,不能在创建对象时进行赋值字符string s4;cout << s4 << endl;s4 = 'a';cout << s4 << endl;}

三、Element access(元素访问)

3.1 oeprator[]

void StrTest3()
{string s3 = "hello world";//len = 11cout << s3 << endl;cout << s3.size() << endl;//可以看到,size=11,size是没有把'\0'算入的for (int i = 0; i < s3.size(); i++) {s3[i]++;cout << s3[i] ;}cout << endl;}

若是用const修饰对象 

3.2 at

void StrTest4()
{string s3 = "hello world";const string s4 = "hello world";cout << s3 << endl;for (int i = 0; i < s3.size(); i++){s3.at(i)++;cout << s3.at(i)<<' ';}cout << endl;
}

3.3 back&front

void StrTest5()
{string s3 = "hello world";cout << s3.back() << endl;cout << s3.front() << endl;
}

 

 四、Iterator(迭代器)

4.1 begin&end

 在这里我们可以认为迭代器和指针很像(当然迭代器不知包括指针),begin()返回指向首字符的指针

end返回指向最后一个字符的下一个位置的指针

下面我们将用3种不同的方式遍历串

void StrTest6()
{string s3 = "hello world";//方法一 operator[]for (int i = 0; i < s3.size(); i++) {cout << s3[i];}cout << endl;//方法二 atfor (int i = 0; i < s3.size(); i++) {cout << s3.at(i);}cout << endl;//方法三 迭代器string::iterator it1 = s3.begin();while (it1 != s3.end()){*it1 += 3;cout << *it1;it1++;}cout << endl;//方法四 遍历for循环for (auto& e : s3) {cout << e;}cout << endl;
}

 4.2 rbegin&rend

 这里的r有反向的意思,reversebegin和reverseend

下面使用这两个函数遍历字符串

void StrTest7()
{string s2("hello world");//从rbegin到rend//反向打印string::reverse_iterator it1 = s2.rbegin();while (it1 != s2.rend()){cout << *it1;it1++;}cout << endl;//正向打印//从rend到rbeginstring::reverse_iterator it2 = s2.rend()-1;//指向第一个字符while (it2 != s2.rbegin()){cout << *it2;it2--;}cout << *it2;cout << endl;
}

4.3 cbegin&cend& crbegin&crend

void StrTest8()
{string s3 = "hello world";string::const_iterator it1 = s3.cbegin();//这里的it1指向的内容就不能再改变了//其余的cend 、 crend 、 crbegin 除了是_const 以外,其他和前面两个函数一摸一样,不再赘述
}

五、Capacity(空间)

5.1 size&length&max_size

这两个都是返回字符串的长度,功能都基本相同

 

void StrTest9()
{string s1 = "hello world";//实际长度为12,包含'\0'cout << s1.length() << endl;cout << s1.size() << endl;
}

可以看出,vs编译器是不把'\0'算入size和length中的,编译器不同,得出的实际效果也就不同

可以看到,在64位机器下,编译器能给的最大空间很大很大,但实际上却给不了这么大的空间(即便身价500亿,亦不能随时掏出1个亿) 

5.2 capacity

那么当我们扩大字符串长度/缩小,capacity会有变化吗 

void StrTest9()
{string s1 = "hello world";//实际长度为12,包含'\0'cout << s1.length() << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;s1 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";cout << s1.capacity() << endl;s1 = "xxx";cout << s1.capacity() << endl;
}

可以很明显的看出,当我们扩大字符串的长度时,capacity会自动扩大,但当我们缩小字符串长度时,capacity却不会随之变小(capacity只扩大不缩小) 

5.3 resize

void StrTest9()
{string s1 = "hello world";//实际长度为12,包含'\0'cout << s1.length() << endl;cout << s1.size() << endl;cout << s1.max_size() << endl;cout << s1.capacity() << endl;s1 = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";cout << s1.capacity() << endl;s1 = "xxx";cout << s1.capacity() << endl;//扩容至25,其余补充为cs1.resize(25, 'c');cout << s1 << endl;cout << s1.capacity() << endl;cout << s1.length() << endl;cout << s1.size() << endl;//扩容至50,这是会发现capacity也随之改变至70s1.resize(50,'X');cout << s1 << endl;cout << s1.capacity() << endl;cout << s1.length() << endl;cout << s1.size() << endl;//缩容至25s1.resize(25);//你会发现capacity不会变小,capacity只大不变小cout << s1 << endl;cout << s1.capacity() << endl;cout << s1.length() << endl;cout << s1.size() << endl;}

5.4 reserve

void StrTest10() {string s1 = "hello world";cout << s1 << endl;cout << s1.capacity() << endl;//15cout << s1.length() << endl;//11cout << s1.size() << endl;//11//现在我们来扩大capacity,那么capacity就一定是50吗?s1.reserve(50);cout << s1.capacity() << endl;//63 ,编译器其可能觉得50不好,自动优化到63cout << s1.length() << endl;//11cout << s1.size() << endl;//11//那现在我们来缩小capacity,你觉得有可能吗s1.reserve(25);cout << s1.capacity() << endl;//63 ,capacity还是63,根本不听你的cout << s1.length() << endl;//11cout << s1.size() << endl;//11//再次缩小s1.reserve(20);cout << s1.capacity() << endl;//63,还是没有缩小cout << s1.length() << endl;//11cout << s1.size() << endl;//11//再次缩小s1.reserve(13);//15 ,为什么这次就缩小了呢?//是因为其中内置了一个大小为15的数组,当空间小于15时(也就是串小于15),会先存储到这个buffer区中cout << s1.capacity() << endl;//15,cout << s1.length() << endl;//11cout << s1.size() << endl;//11
}

注意:可以利用reserve提高插入数据的效率,避免增容带来的开销,一把开好,省得麻烦(如果知道要用多少) 

 5.5 clear&empty&shrink_to_fit

一、clear

作用很直观也很简单的一个成员函数,清楚字符串中所有有效字符,使其长度变为0

void StrTest11()
{//空间大小不变,长度变为0string s1 = "hello world";cout << s1 << endl;cout << s1.capacity() << endl;//15cout << s1.size() << endl;s1.clear();cout << s1.capacity() << endl;//15cout << s1.size() << endl;
}

 二、empty

 若有效字符个数为0,返回true,否则返回false

三、shrink_to_fit

void StrTest12() {string s1 = "hello world";cout << s1 << endl;s1.reserve(100);cout << s1.capacity() << endl;//111s1.shrink_to_fit();cout << s1.capacity() << endl;//还是15,储存在数组中
}

 六、Modifiers(修改器)

6.1 oeprator+=

void StrTest13()
{string s1 = "hello,";string s2 = "xiaoyutongxue";s1 += s2;cout << s1 << endl;string s3 = "hello,";s3 += "xiaoyutongxue";cout << s3 << endl;string s4 = "ok";s4 += 'x';cout << s4 << endl;
}

6.2 append 

void StrTest14()
{string s3 = "hello";string s4 = "world";char ch[] = "good";//添加字符串对象s3.append(s4); cout << s3 << endl;//添加字符串对象的一部分s3.append(s4, 1, 100);cout << s3 << endl;//添加字符数组s3.append(ch);cout << s3 << endl;///添加字符数组的n个字符s3.append(ch, 3);cout << s3 << endl;//追加常量字符串s3.append("66666");cout << s3 << endl;///追加n个字符xs3.append(15, 'x');cout << s3 << endl;//interatorstring s5 = "5月12日";string s6 = "mu qin jie kuai le!";s6.append(s5.begin(), s5.end());//左闭右开[ ),不用减一cout << s6 << endl;}

6.3 push_back

 在串的尾部尾插一个字符c

6.4 assign

 这些重载函数的参数都差不多,我就不再赘述了,直接代码呈现

void StrTest15()
{//用字符串对象覆盖string s1 = "hello world";cout << s1 << endl;string s2 = "xiaoyutongzhi";s1.assign(s2);cout << s1 << endl;//用一部分字符串对象覆盖s1.assign(s2, 6, 100);cout << s1 << endl;//用一个字符数组覆盖char ch[] = "mu qin jie kuai le";s1.assign(ch);cout << s1 << endl;//用字符数组的n个字符覆盖s1.assign(ch, 5);cout << s1 << endl;//迭代器覆盖s1.assign(s2.begin(), s2.end());cout << s1 << endl;
}

6.5 insert

void StrTest16() {string s1 = "hello ";string s2 = "xiaoyutongzhi";//s1.insert(6,s2);//cout << s1 << endl;//s1.insert(6, s2, 6, 100);//cout << s1 << endl;/*s1.insert(s1.end(), 6, 'x');cout << s1 << endl;*//*s1.insert(s1.end(),  'x');cout << s1 << endl;*/s1.insert(s1.end(), s2.begin(), s2.end());cout << s1 << endl; }

6.6 erase

void StrTest16() {string s1 = "hello ";string s2 = "xiaoyutongzhi";string s3 = "xiaoyutongzhi";s1.erase();cout << s1 << endl;cout << s1.capacity() << endl;cout << s1.size() << endl;s2.erase(6, 100);cout << s2 << endl;//删除p位置的内容s3.erase(s3.begin());cout << s3 << endl;s3.erase(s3.begin(), s3.end()-2);//左闭右开cout << s3 << endl;
}

 注意:若pos位置大于字符串长度,则抛异常

6.7 replace

void StrTest1()
{string s1 = "xxxxxxxxxxx";cout << s1.size() << endl;string s2 = "cccccc";cout << s1 << endl;//1.类对象替换s1.replace(0, 3, s2);cout << s1 << endl;cout << s1.size() << endl;//说明会将从第0个位置开始,长度为三的字符替换,并追加s2剩余字符->size扩大//若len>字符串长度,默认替换到字符串尾//2.迭代器替换s1 = "xxxxxxxxxxx";s1.replace(s1.begin(), s1.begin()+2 , s2);cout << s1 << endl;cout << s1.size() << endl;//3.固定替换长度(类对象)s1 = "xxxxxxxxxxx";s1.replace(0, 3, s2, 0, 3);//若sublen大于len,则在替换的末尾追加cout << s1 << endl;cout << s1.size() << endl;//
}

 6.8 swap

void StrTest2()
{//交换后,size和capacity(属性)也会交换string s1 = "xxxxxxxx";string s2 = "ssssssssssssssssssssss";cout << "s1 = " << s1 << endl;cout << "s1.size() = " << s1.size() << endl;cout << "s1.capacity() = " << s1.capacity() << endl;cout << "s2 = " << s2 << endl;cout << "s2.size() = " << s2.size() << endl;cout << "s2.capacity() = " << s2.capacity() << endl;s1.swap(s2);cout << "s1 = " << s1 << endl;cout << "s1.size() = " << s1.size() << endl;cout << "s1.capacity() = " << s1.capacity() << endl;cout << "s2 = " << s2 << endl;cout << "s2.size() = " << s2.size() << endl;cout << "s2.capacity() = " << s2.capacity() << endl;
}

6.9 pop_back

七、 String operations:

7.1 c_str

 

void STRTest1()
{//1.c_str函数string s = "hello world";//返回一个与s中存储的字符串相同的常量字符串,最后还有'\0'char* str = new char[s.length() + 1];//strcpy(str, s);这里直接用s是不行的,因为s是对象名,而不是一个char*strcpy(str, s.c_str());//这样就可以,返回一个常量字符串cout << s.c_str() << endl;cout << str << endl;delete[] str;str = nullptr;}

7.2 copy 

void STRTest2()
{string s = "hello world";char str[20];int length = s.copy(str, 3, 0);//这里若是不把str的length处设置为'\0',下面打印就打印未初始化的随机值str[length] = '\0';cout << str << endl;cout << length << endl;}

 7.3 find

void STRTest3()
{string s = "hello worldho";string s1 = "world";char s2[5] = "ld";size_t pos1 = s.find('h', 0);cout << pos1 << endl;size_t pos2 = s.find('o', 1);cout << pos2 << endl;size_t pos3 = s.find(s1, 0);cout << pos3 << endl;size_t pos4 = s.find(s2, 0);cout << pos4 << endl;
}

7.4 rfind 

void STRTest4()
{string s1 = "hehello heorange hehe";string s2 = "he";size_t pos1 = s1.rfind('o',1110);size_t pos2 = s1.rfind(s2,1110);cout << pos1<<endl;cout << pos2 << endl;
}

7.5 find_first_of

 

void STRTest5()
{string s1 = "hello world hehe haha orange";size_t pos = s1.find_first_of("wld", 0);cout << pos << endl;//此处找到l下标为2//也可以把指定元素的字符全部改为*std::size_t found = s1.find_first_of("aeiou");while (found != std::string::npos){s1[found] = '*';found = s1.find_first_of("aeiou", found + 1);}std::cout << s1 << '\n';
}

 7.6 substr

void STRTest6()
{//用find如何提取协议、域名和资源string s1 = "https://gitee.com/chen-1/qi-training-record";size_t pos1 = s1.find(':');size_t pos2 = s1.find('/', pos1 + 3);size_t pos3 = s1.find('/', pos2 + 1);cout << s1.substr(0, pos1-0)<<endl;//左闭右开,右边减去左边是元素个数cout << s1.substr(pos1+3, pos2-pos1-3)<<endl;//取出第二段cout << s1.substr(pos2 + 1) << endl;//取出第三段
}

八、非成员函数 

8.1 operator+

void STRTest7() {string s1 = "hello";string s2 = "world";string s3 = s1 + s2;cout << s3 << endl;string s4 = s1 + "xxxxxx";cout << s4 << endl;//这就是为什么要写成全局函数而不写成成员函数的原因->要支持非对象成为第一个参数string s5 = "xxxxx" + s1;cout << s5 << endl;//不能是string s5 = "xxxx"+"xxxx"; 不能对内置类型进行运算符重载,至少要有一个自定义类型
}

8.2 string类同样支持比较(用ASCLL比较)

注意:运算符优先级流插入大于比较符号,注意加括号 

8.3  getline

可以从流中读取空格(cin就不行),读入str中

cin默认空格或换行是多个值之间的分割

getline默认换行是多个读入值之间的分割,也可以控制分隔符delim

九、其他函数

9.1 to_string、stoi

void STRTest8()
{int x = 0, y = 90;cin >> x >> y;string s = to_string(x + y);cout << s << endl;//stoi 字符串转成整形int ret = stoi(s);cout << ret << endl;
}

十、ok了,也是写完了,hp-1000000000000000

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

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

相关文章

Naive RAG 、Advanced RAG 和 Modular RAG 简介

简介&#xff1a; RAG&#xff08;Retrieval-Augmented Generation&#xff09;系统是一种结合了检索&#xff08;Retrieval&#xff09;和生成&#xff08;Generation&#xff09;的机制&#xff0c;用于提高大型语言模型&#xff08;LLMs&#xff09;在特定任务上的表现。随…

深入解析RedisJSON:在Redis中直接处理JSON数据

码到三十五 &#xff1a; 个人主页 JSON已经成为现代应用程序之间数据传输的通用格式。然而&#xff0c;传统的关系型数据库在处理JSON数据时可能会遇到性能瓶颈。为了解决这一问题&#xff0c;Redis推出了RedisJSON模块&#xff0c;它允许开发者在Redis数据库中直接存储、查询…

产品推荐 | 基于 AMD Virtex UltraScale FPGA VCU1287 的特性描述套件

01 产品概述 VCU1287 功能描述套件可为您提供描述和评估 Virtex™ UltraScale™ XCVU095-FFVB2104E FPGA 上可用 32 GTH (16Gbps) 和 32 GTY (30Gbps) 收发器所需的一切功能。每个 GTH 与 GTY Quad 及其相关参考时钟均从 FPGA 路由至 SMA 及 Samtec BullsEye 连接器。 Bulls…

好题总结汇总

好题总结汇总 总结一些做完很有收获的题。 一、经典问题 DP的结合 1、题意&#xff1a; 给定 n n n 种颜色的球的数量 a 1 , a 2 , . . . , a n a_1, a_2, ..., a_n a1​,a2​,...,an​&#xff0c;选出一些不同种类的球(也就是在n种球中选球的任意情况)&#xff0c;将球…

TCP的滑动窗口机制和流量控制

目录 滑动窗口 流量控制 拥塞控制 滑动窗口 TCP除了保证可靠性之外&#xff0c;也希望能够尽可能高效的完成数据传输。滑动窗口就是一种提高效率的机制。以下是不引入滑动窗口的数据传输过程&#xff1a; 可以看到&#xff0c;主机A这边每次收到一个ACK才发送下一个数据。这…

为什么cca门限和tx 功率有关系

Cca是用来决定信道是否繁忙&#xff0c;好像只和收有关。 但是为什么和tx有关。 设想一下这个网路布局。 如果某个STA在决定是否发送的时候&#xff0c;是否不能只看收到的干扰多大&#xff0c;还应该“冒险”一下&#xff0c;如果自己的功率足够&#xff0c;那么就可以扛住干…

MyBatis的注解实现复杂映射开发

xml 配置方式实现复杂映射回顾 ​ 实现复杂映射我们之前可以在映射文件中通过配置来实现&#xff0c;使用注解开发后&#xff0c;我们可以通过 Results 注解&#xff0c;Result 注解&#xff0c;One 注解和 Many 注解组合完成复杂关系的配置。 注解说明Results代替的是标签 …

【csv-parse】使用parse方法的时候来转换为csv字符串时,会导致输出有乱码

&#x1f601; 作者简介&#xff1a;一名大四的学生&#xff0c;致力学习前端开发技术 ⭐️个人主页&#xff1a;夜宵饽饽的主页 ❔ 系列专栏&#xff1a;前端bug记录 &#x1f450;学习格言&#xff1a;成功不是终点&#xff0c;失败也并非末日&#xff0c;最重要的是继续前进…

Vue3组件库开发项目实战——02项目搭建(配置Eslint/Prettier/Sass/Tailwind CSS/VitePress/Vitest)

摘要&#xff1a;在现代前端开发中&#xff0c;构建一个高效、可维护且易于协作的开发环境至关重要。特别是在开发Vue3组件库时&#xff0c;我们需要确保代码的质量、一致性和文档的完整性。本文将带你从0搭建vue3组件库开发环境&#xff0c;以下是配置代码规范、格式化、CSS样…

扩散模型diffusion model

一 什么是扩散模型 1.1 现有生成模型 已经有大量的方法证明深度生成模型能够模拟人类的想象思维&#xff0c;生成人类难以分辨真伪的内容&#xff0c;主要方法如下&#xff1a; 1、GAN&#xff1a;用神经网络训练生成器和判别器 GAN 的主要思想&#xff1a; GAN 就是一个互搏的…

49.乐理基础-拍号的类型-单拍子、复拍子

当前写的东西&#xff0c;如果只是想要看懂乐谱的话&#xff0c;它是没什么意义的&#xff0c;就像我们要把 0&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5。。。称为自然数&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5称为正整…

H5 云商城 file.php 文件上传致RCE漏洞复现

0x01 产品简介 H5 云商城是一个基于 H5 技术的电子商务平台,旨在为用户提供方便快捷的在线购物体验。多平台适配:H5 云商城采用 H5 技术开发,具有良好的跨平台适配性。无论是在电脑、手机还是平板等设备上,用户都可以通过网页浏览器访问和使用云商城,无需安装额外的应用程…

销量?模糊销量?精准销量?如何获取淘宝商品销量数据接口

淘宝爬虫商品销量数据采集通常涉及以下几个步骤&#xff1a; 1、确定采集目标&#xff1a;需要明确要采集的商品类别、筛选条件&#xff08;如天猫、价格区间&#xff09;、销量和金额等数据。例如&#xff0c;如果您想了解“小鱼零食”的销量和金额&#xff0c;您需要设定好价…

vueday1

1.作用&#xff1a;利用表达式进行插值&#xff0c;渲染到页面中 三元表达式、点语法、数组对应项&#xff0c;方法、点语法方法 1.使用的时候需要存在&#xff0c;需要在data里面声明&#xff0c;如果没有声明会报错 2.ifelse不能用 3.不能在标签属性中使用{{}}插值 <!DO…

【前端】打砖块游戏:实现细节介绍

打砖块游戏:实现细节介绍 在本文中,我将详细介绍如何使用HTML、CSS和JavaScript技术构建一个简单的打砖块游戏。我们将重点讨论游戏的三个核心技术方面:碰撞检测、画图和事件监听。 完整代码我放在:github可以直接拉取代码测试。 游戏概览 打砖块游戏中,玩家通过控制底…

静态住宅IP优缺点总结

在进行海外 IP 代理时&#xff0c;了解动态住宅 IP 和静态住宅 IP 的区别以及如何选择合适的类型非常重要。本文将介绍精态住宅 IP 特点和&#xff0c;并提供选择建议&#xff0c;帮助您根据需求做出明智的决策。 静态住宅 IP 的特点 静态住宅 IP 是指 IP 地址在一段时间内保…

涨点神器:即插即用特征融合模块!超低参数,性能依旧SOTA

在写论文时&#xff0c;一些通用性模块可以在不同的网络结构中重复使用&#xff0c;这简化了模型设计的过程&#xff0c;帮助我们加快了实验的迭代速度。 比如在视觉任务中&#xff0c;即插即用的特征融合模块可以无缝集成到现有网络中&#xff0c;以灵活、简单的方式提升神经…

7.STL中string的一些超常用函数 (附习题)

目录 1.find 2.atoi 3.to_string 4.getline 【leetcode 习题】 387.字符串中的第一个唯一字符 125. 验证回文串 1.find 1.查找第一次出现的目标字符串&#xff1a;说明&#xff1a;如果查找成功则输出查找到的第一个位置&#xff0c;否则返回-1&#xff1b; s1.find(s2…

宇宙(科普)

宇宙&#xff08;Universe&#xff09;在物理意义上被定义为所有的空间和时间&#xff08;统称为时空&#xff09;及其内涵&#xff0c;包括各种形式的所有能量&#xff0c;比如电磁辐射、普通物质、暗物质、暗能量等&#xff0c;其中普通物质包括行星、卫星、恒星、星系、星系…

【目标检测】YOLOv5|YOLOv8模型QT界面可视化部署

YOLO-Deploy-QT_Interface 最近笔者做了YOLO系列算法的部署工作,现做一个总结。主要工作是做了用于部署YOLOv5和YOLOv8的可视化QT界面,可实现图片、文件夹、视频、摄像头的ONNX与OpenVino部署,具体效果如下: 代码链接:https://github.com/Zency-Sun/YOLO-Deploy-QT_Inte…