【C++STL】String类的常用函数用法总结

String类

  • 一:String类的初始化方式
  • 二:String类的访问方式
  • 三:String的大小和容量
  • 四:string的插入:push_back() 和 insert()
  • 五:string拼接字符串:append() & + 操作符
  • 六: string的删除:erase()
  • 七: string的字符替换
  • 八:c_str()使用场景
  • 九: string的大小写转换:tolower()和toupper()函数 或者 STL中transform算法
  • 十: string的查找:find 和 substr方法
  • 十一:reserve() 和 resize()
  • 总结:

一:String类的初始化方式

string str:生成空字符串string s(str):生成字符串为str的复制品 (拷贝构造)(带参构造)string s(str, strbegin,strlen):将字符串str中从下标strbegin开始、长度为strlen的部分作为字符串初值string s(cstr, char_len):以string类型cstr的前char_len个字符串作为字符串s的初值string s(num ,c):生成num个c字符的字符串string s(str, strindex):将字符串str中从下标strindex开始到字符串结束的位置作为字符串初值

二:String类的访问方式

一:
string s1 = ("hello world"); 我们可以通过s1[i]的方式来访问但 s1[i] 的实际写法 s1.operator(i);  因为实际上是对[]进行了运算符重载二:
1.通过迭代器 iterator
string::iterator it1 = s1.begin();while (it1 != s1.end())        //这里的end都是字符串最后一个位置的下一个位置
{cout << *it1 << " ";it1++;
}2.这里还有一种叫做反向迭代器(reverse_interator, rbegin(), rend())
string s3("hello");
string::reverse_iterator it2 = s3.rbegin();while (it2 != s3.rend())
{cout << *it2 << " ";++it2;
}3.auto 范围for  //底层就是迭代器 
for (auto& e : lt1)
{cout << e << " ";
}s1.operator(i) 和 iterator都有 const的情况 const _interator
例如:const string s2(s1);注意:const _interator是interator指向的数据不能修改 如果是 const interator的话那么就是interator本身不能修改

三:String的大小和容量


1. size()和length():返回string对象的字符个数,他们执行效果相同。2. max_size():返回string对象最多包含的字符数,超出会抛出length_error异常3. capacity():重新分配内存之前,string对象能包含的最大字符数
这里对capacity底层作出一些解释:如果字符串占用的空间不大,则占用的是栈空间中的buffer,默认为15个字节,如果超过,就会在堆空间上开辟空间

四:string的插入:push_back() 和 insert()

    string s1;// 尾插一个字符s1.push_back('a');s1.push_back('b');s1.push_back('c');cout << "s1:" << s1 << endl;      // s1:abc// insert(pos,char) : 在制定的位置pos前插入字符char//insert方法 慎用效率不高 类似顺序表string ss("helloworld");ss.insert(0, "xxxx");   // 时间复杂度 O(n)

五:string拼接字符串:append() & + 操作符

    // 方法一:append()string s1("abc");s1.append("def");cout << "s1:" << s1 << endl;  // s1:abcdef// 方法二:+ 操作符string s2 = "abc";/*s2 += "def";*/string s3 = "def";s2 += s3.c_str();cout << "s2:" << s2 << endl;  // s2:abcdef

六: string的删除:erase()

//删除erase 效率也很低和insert差不多1. iterator erase(iterator p);//删除字符串中p所指的字符2. iterator erase(iterator first, iterator last);//删除字符串中迭代器区间[first,last)上所有字符 左闭右开3. string& erase(size_t pos = 0, size_t len = npos);//删除字符串中从索引位置pos开始的len个字符4. void clear();//删除字符串中所有字符

七: string的字符替换

1. string& replace(size_t pos, size_t n, const char *s);//将当前字符串从pos索引开始的n个字符,替换成字符串s2. string& replace(size_t pos, size_t n, size_t n1, char c); //将当前字符串从pos索引开始的n个字符,替换成n1个字符c3. string& replace(iterator i1, iterator i2, const char* s);//将当前字符串[i1,i2)区间中的字符串替换为字符串s

八:c_str()使用场景

string file("stl.cpp");// c_str返回string的指针 相同与数组首元素地址
FILE* fout = fopen(file.c_str(), "r");   //只能传const char* c和c++的不同之处 这个时候c_str这个时候就派上用场了
char ch = fgetc(fout);
while (ch != EOF)
{cout << ch;ch = fgetc(fout);
}

九: string的大小写转换:tolower()和toupper()函数 或者 STL中transform算法

方法一:

#include <iostream>
#include <string>
using namespace std;int main()
{string s = "ABCDEFG";for( int i = 0; i < s.size(); i++ ){s[i] = tolower(s[i]);}cout << s << endl;return 0;
}

方法二:

#include <iostream>
#include <algorithm>
#include <string>using namespace std;int main()
{string s = "ABCDEFG";string result;transform(s.begin(),s.end(),s.begin(),::tolower);cout << s << endl;return 0;
}

十: string的查找:find 和 substr方法

1. size_t find (constchar* s, size_t pos = 0) const;//在当前字符串的pos索引位置开始,查找子串s,返回找到的位置索引,-1表示查找不到子串2. size_t find (charc, size_t pos = 0) const;//在当前字符串的pos索引位置开始,查找字符c,返回找到的位置索引,-1表示查找不到字符3. size_t rfind (constchar* s, size_t pos = npos) const;//在当前字符串的pos索引位置开始,反向查找子串s,返回找到的位置索引,-1表示查找不到子串4. size_t rfind (charc, size_t pos = npos) const;//在当前字符串的pos索引位置开始,反向查找字符c,返回找到的位置索引,-1表示查找不到字符string file("stl.cpp");size_t pos = file.rfind(".");  //从前往后倒着找. 找到返回对应的下标
//string suffix = file.substr(pos, file.size() - pos);
string suffix = file.substr(pos);  //有多少取多少

十一:reserve() 和 resize()

reserve为容器预留足够的空间,避免不必要的重复分配,分配空间大于等于函数的参数,影响capacity。

resize调整容器中有效数据区域的尺寸,如果尺寸变小,原来数据多余的截掉。若尺寸变大,不够的数据用该函数第二个参数填充,影响size。

// reserve 不一定会缩容 但会扩容 意义是直接reserve就不用一直倍增扩容了 提前开空间string ss("helloworld");cout << ss.capacity() << endl;
ss.reserve(100);
cout << ss.capacity() << endl;// 注意不会改变size 所以不能越界访问
// 这个时候resize就出现了 就可以用下标进行访问了string str;
str.resize(5, '0');str[3] = '1';
cout << str[2] << endl;cout << str.size() << endl;//自己去验证一下才是最有效的
ss.clear();
ss = "hello world";
ss.resize(15, 'x');    //如果有剩余位置 就在剩余位置填充 不会覆盖原有位置cout << ss << endl;
cout << ss.size() << " " << s1.capacity() << endl;

总结:

以上就是string类的常用函数,内容并不全面,详细内容可在官方文档中进行查阅,希望对大家的学习有所帮助,一起进步!

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

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

相关文章

PhpAdmin-getshell

PhpAdmin-getshell 通过未授权成功写入&#xff0c;然后getshell 路径&#xff1a;C:\phpstudy_pro\Extensions\MySQL5.7.26\ 写入木马&#xff1a; into写入文件&#xff1a; 使用需看要secure_file_priv的值。 当value为“null”时&#xff0c;不允许读取任意文件 当value为…

Android 文件传输

经常写adb命令传文件&#xff0c;结果发现Android studio有自带的文件管理器&#xff0c;可以上传下载文件。

高扬程消防水泵在火灾中的关键作用/恒峰智慧科技

在火灾这一无情的灾难面前&#xff0c;每一秒都至关重要。而在这一分一秒的较量中&#xff0c;高扬程消防水泵无疑扮演着举足轻重的角色。它不仅是灭火战斗的得力助手&#xff0c;更是保障人民生命财产安全的守护神。 高扬程消防水泵&#xff0c;顾名思义&#xff0c;其扬程远超…

Gson打印按照想要的key顺序

默认大家都知道这个吧&#xff1f; val gson GsonBuilder().setPrettyPrinting().create() log(gson.toJson(bean))它是用于将对象bean&#xff0c;转成json以后&#xff0c;能够比较漂亮的打印出json的结构。我常用的是如下4个函数。 //就是jsonStr&#xff0c;使用该函数来…

qt对话框功能介绍

1、颜色对话框 //方式一QColor color QColorDialog::getColor(Qt::red, this, QString::fromLocal8Bit("颜色对话框"),QColorDialog::ShowAlphaChannel);qDebug() <<"color:" <<color;//方式二QColorDialog dialog(Qt::red, this); // 创建对…

通过自然语言处理执行特定任务的AI Agents;大模型控制NPC执行一系列的动作;个人化的电子邮件助手Panza

✨ 1: OpenAgents 通过自然语言处理执行特定任务的AI代理 OpenAgents是一个开放平台&#xff0c;旨在使语言代理&#xff08;即通过自然语言处理执行特定任务的AI代理&#xff09;的使用和托管变得更加便捷和实用。它特别适合于日常生活中对数据分析、工具插件获取和网络浏览…

vue2编写主体页面

目录 一. 导入两张图片 二. 新建主体vue 三. 修改路由 1. 新增主体界面Main.vue的路由 2. 完整router/index.js代码如下: 在Vue 2中编写一个主体页面通常意味着创建一个包含导航栏、侧边栏、内容区域等的布局。以下是使用Vue 2和Element UI框架来构建一个简单的主体页面的…

Kalfka是如何保证消息消费的顺序性和一致性的

Kafka通过一系列机制来确保消息消费的顺序性和一致性。以下是一些关键的方法&#xff1a; 分区&#xff08;Partitions&#xff09;&#xff1a; Kafka中的每个主题&#xff08;Topic&#xff09;都可以被分割成多个分区。消息在发布时会被追加到特定的分区中&#xff0c;而在每…

2024年第二十一届 五一杯 (B题)大学生数学建模挑战赛 | 最大流问题,深度学习分析 | 数学建模完整代码解析

DeepVisionary 每日深度学习前沿科技推送&顶会论文&数学建模与科技信息前沿资讯分享&#xff0c;与你一起了解前沿科技知识&#xff01; 本次DeepVisionary带来的是五一杯的详细解读&#xff1a; 完整内容可以在文章末尾全文免费领取&阅读&#xff01; 第一个问题…

张大哥笔记:学什么都不如学赚钱

很多人总是这样认为&#xff1a;好好读书&#xff0c;考上好学校&#xff0c;将来可以找到一份不错的工作&#xff0c;这样的思想观念&#xff0c;可能会导致你一辈子都无法实现财富自由。 财富的多少&#xff0c;和你的努力程度没有直接关系。我们可以清楚看到那些每天辛苦劳动…

虚拟机软件:VMware VirtualBox Hyper-v

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 虚拟机软件是程序员必备的开发…

Leetcode—2739. 总行驶距离【简单】

2024每日刷题&#xff08;121&#xff09; Leetcode—2739. 总行驶距离 实现代码 class Solution { public:int distanceTraveled(int mainTank, int additionalTank) {int consume 0;int ans 0;while(mainTank ! 0) {mainTank--;consume;if(consume 5 && additio…

【20】JAVASE-网络编程【从零开始学JAVA】

Java零基础系列课程-JavaSE基础篇 Lecture&#xff1a;波哥 Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台。…

python u是什么意思

u&#xff1a;表示unicode字符串&#xff0c;默认模式&#xff0c;里边的特殊字符会被识别。 作用&#xff1a;后面字符串以unicode格式进行编码&#xff0c;一般用在中文字符串前面&#xff0c;防止因为源码储存格式问题&#xff0c;导致再次使用时出现乱码。 用法&#xff…

人脸识别 人脸识别insightFace项目使用详解

人脸识别 人脸识别insightFace项目使用详解 recognition人脸识别模型Arcface(mxnet)训练项目地址 recognition人脸识别模型 注意:该模块是有深度学习框架mxnet实现,为了加速训练,需要GPU支持, Arcface(mxnet)训练 1、安装gpu版的MXNet,我的cuda版本是10.2 pip in…

【精选文献】JAG|基于时序Sentinel-1 SAR影像小农耕作区烟草空间分布制图

目录 文章简介 01 文章摘要 02 研究背景、目标及创新点 03 研究区域与数据集 04 研究方法 05 研究结果 06 研究讨论 07 研究结论 08 文章引用 文章简介 论文名称&#xff1a;Mapping tobacco planting areas in smallholder farmlands using Phenological-Spatial-Te…

《深入解析WIndows操作系统》第9章读书笔记

1、闪存类型&#xff1a;常见的闪存类型有NOR和NAND。NOR闪存在操作上最接近RAM&#xff0c;它的每个字节都可以被独立地寻址&#xff0c;而NAND闪存则被组织成以块为单位&#xff0c;就像磁盘一样。NOR类型的闪存用来设计保存计算机主板上的BIOS&#xff0c;而NAND类型的闪存被…

笔记本上打造专属的LLama3聊天机器人

1. 引言 万众期待的 Meta 第三代 Llama 发布了&#xff0c;我想确保你知道如何以最佳方式部署这个最先进的LLM。在本教程中&#xff0c;我们将在笔记本上部署该模型&#xff0c;并指导大家一步步具体操作步骤。 闲话少说&#xff0c;我们直接开始吧&#xff01; 2. LLama3 …

React 之 如何启动一个新的项目(六)

React本身是为构建SPA&#xff08;单页面应用&#xff09;而设计的。 想完全用 React 构建一个新的应用或网站&#xff0c;我们建议选择社区中流行的、由 React 驱动的框架。 生产级的 React 框架 1. Next.js Next.js 的页面路由 是一个全栈的 React 框架。它用途广泛&#x…

数据结构算法——链表带环问题——数学深度解析

前言:本节内容主要是讲解链表的两个问题 &#xff1a;1、判断链表是否带环&#xff1b; 2、一个链表有环&#xff0c; 找到环的入口点。 本节内容适合正在学习链表或者链表基础薄弱的友友们哦。 我们先将问题抛出来&#xff0c;友友们可以自己去力扣或者牛客网去找相应题目&…