【C++入门】C++ STL中string常用函数用法总结

2024-01-21

目录

前言

1. string使用

2. string的常见构造

3. string类对象的访问及遍历

迭代器遍历:

访问:

4. string类对象的容量操作

4.1 size和length

4.2 clear、empty和capacity

4.3 reserve和resize

reserve

resize

5. string类对象的修改操作

push_back

operator+=

c_str

find

substr

6. insert和erase

insert

erase

总结


前言

STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架,主要包含:算法、仿函数、迭代器、空间适配器、容器、适配器;六大组件,本无主要介绍的是STL容器中string常用函数的用法。

在这里插入图片描述

1. string使用

string是表示字符串的字符串类,它的接口与常规容器的接口基本相同,并且添加了一些专门用来操作string的常用接口,在刷题时也经常使用。

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

2. string的常见构造

C++的标准库版本不同,string构造方法也会有所不同

详细可查阅: https://legacy.cplusplus.com/reference/string/string/string/

无参构造:

string s1;

字符构造:

//string str('x'); //这样不行
string s;
s = 'x'; // 也就是赋值运算符重载

字符串常量构造:

string s2("hello world!");
string s2 = "hello world!";

拷贝构造:

string s3 = s2; // 两种方法等价
string s4(s2);

指定n个相同字符进行初始化:

// 接口原型:string (size_t n, char c)
string s6(10, 'x');//10个x初始化

迭代器区间构造:

string s7 = "Hello World!";
// 创建一个迭代器区间,从第2个字符开始,到第11个字符结束
string s8(s7.begin() + 1, s7.begin() + 11); // ello World

3. string类对象的访问及遍历

迭代器遍历:

begin和end:

  • begin返回指向字符串的第一个字符的迭代器
  • end返回指向字符串末尾的迭代器
string s1 = "Hello world!";
//迭代器
// iterator用法像指针
string::iterator it = s1.begin();
while (it != s1.end())
{
	cout << *it << " ";
	++it;
}

反向遍历rbegin和rend:

  • rbegin返回指向字符串最后一个字符(即其反向开头)的反向迭代器
  • rend 返回一个反向迭代器,该迭代器指向字符串第一个字符(被视为其反向末尾)
auto it1 = str.rbegin();
while (it1 != str.rend())
{
	cout << *it1 << " ";
	++it1;
}

范围for遍历:

for (auto e : s1)
{
	cout << e;
}

访问:

[ ]下标访问:

s1[1] = 'x';
cout << s1[1];

4. string类对象的容量操作

string类对象支持直接获取字符串长度,length和size都可以返回有效字符长度,size更通用;

4.1 size和length

string s = "Hello world!";// 12个字符
cout << s.size() << endl;  // 12
cout << s.length() << endl;// 12

4.2 clear、empty和capacity

注意:

  • clear后,使用empty会返回true
  • clear函数只将size清零
  • clear函数不会改变capacity

使用非常简单便捷:

string s = "Hello world!";

//VS环境下,扩容为1.5倍扩容,环境不同capacity结果可能不同
cout << s.capacity() << endl; // 15
cout << s.empty() << endl;    // 0 ->false
s.clear();
cout << s.empty() << endl;    // 1 ->true
cout << s.capacity() << endl; // 15

4.3 reserve和resize

reserve和resize有些相似都具有扩容的功能

reserve

reserve的主要功能就是开空间,为string对象预留空间,提前开好空间,减少扩容,提高效率

环境不同开空间规则也不同

  • 在VS环境下为1.5倍扩容,初始容量是15
  • g++环境下,从0开始二倍扩容
string s1 ;
cout << s1.capacity() << endl; // 15
s1.reserve(30);
cout << s1.capacity() << endl; // 31

reserve在一般的编译器中不具备缩容的功能( C++没有严格的去规定

resize

resize功能是改变字符串的size

string s = "Hello world!";
cout << s << endl;            // 输出:Hello world!
cout << s.size() << endl;     // 12
cout << s.capacity() << endl; // 15

s.resize(40);
cout << s << endl;            // 输出:Hello world!
cout << s.size() << endl;     // 40
cout << s.capacity() << endl; // 47

在没有给字符时,resize默认补的是\0.

string s = "Hello world!"; 
s.resize(15,'x'); // 输出:Hello world!xxx

这个功能也可以让它用来初始化string对象。

resize值小于字符串的size会删除字符串中的有效字符:

string s = "Hello world!"; 
cout << s << endl;
cout << s.size() << endl; // 12
cout << s.capacity() << endl; // 15

s.resize(5); 
cout << s << endl;    //输出:Hello 
cout << s.size() << endl; // 5
cout << s.capacity() << endl; // 15

5. string类对象的修改操作

push_back

string s("abcde");
s.push_back('f');
s.push_back('g');

operator+=

append使用的频率不高,主要使用+=;

string str1 = "Hello";
string str2 = "World";
str1 += str2; // 现在 str1 的值为 "HelloWorld"

c_str

string str = "Hello";
const char* cstr = str.c_str(); // cstr 指向包含 "Hello" 的C风格字符串

c_str() 是C++中 string 类的成员函数,它返回一个指向以空字符结尾的C风格字符串的指针,以便与需要C风格字符串作为参数的函数进行交互。

注意:

返回的指针指向的字符串是只读的,不能用于修改

find

find用于在字符串中查找子字符串的位置,如果找不到则返回 string::npos


string str = "Hello, World!";
size_t pos = str.find("World"); // pos 的值为 7

substr

substr用于从字符串中提取子字符串

//函数原型
string substr (size_t pos = 0, size_t len = npos) const;

pos 是要提取的子字符串的起始位置, len 是要提取的子字符串的长度,默认值为 npos ,表示提取从起始位置到字符串末尾的所有字符

string str = "Hello, World!";
string sub = str.substr(7, 5); // sub 的值为 "World"

6. insert和erase

insert

insert的函数原型种类很多,但最长用的也就是在指定位置插入单个字符、字符串、 一个string类对象等感兴趣可以去了解一下;

string str = "Hello!";
str.insert(5, " World"); // 现在 str 的值为 "Hello World!"

当然 它也支持使用迭代器插入数据

erase

erase 函数用于从指定位置开始删除指定长度的字符函数原型:

string& erase (size_t pos = 0, size_t len = npos);

它也支持使用迭代器区间删除数据

示例:

string str = "Hello, World!";
str.erase(7, 7); // 现在 str 的值为 "Hello, "

总结

本文主要是string类常用接口的总结,string发布时间早于STL,在最初设计时实现的功能丰富,接口繁多也较为复杂,STL库函数中很多接口都十分相似,学习了string后会对vector和list等等容器的学习有帮助,以上便是本文全部内容,希望对你有所帮助,感谢阅读!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C++入门】C++ STL中string常用函数用法总结 的相关文章

  • 您应该通过属性访问同一类中的变量吗?

    如果您有一个获取和设置实例变量的属性 那么通常您总是使用该类外部的属性来访问它 我的问题是你也应该在课堂上这样做吗 如果有的话 我总是使用该属性 即使是在班级内 但我想听到一些支持和反对的论据 以确定哪个是最正确的以及为什么 或者这只是项目
  • 如何在 C# 中将 IEnumerable 转换为 Enum?

    我已将多个字符串解析为枚举标志 但看不到将它们合并为单个枚举位字段的巧妙方法 我使用的方法循环遍历字符串值 然后 将值转换为 Enum 对象 如下所示 Flags public enum MyEnum None 0 First 1 Seco
  • 为什么 lambda 可以将函数调用转换为 Actions?

    在此代码片段中 List
  • 调试神秘的git+ssh+proxy失败“bash:没有这样的文件或目录”的艰难方法

    我正在尝试通过 SOCKS5 代理克隆 github 存储库 在 ssh config I have Host github com github com ProxyCommand usr bin nc X 5 x 127 0 0 1 70
  • (简单)boost thread_group 问题

    我正在尝试编写一个相当简单的线程应用程序 但我对 boost 的线程库很陌生 我正在开发的一个简单的测试程序是 include
  • 哪些 .NET 依赖注入框架值得研究? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 C# 中读取并发送 mp4 文件

    我使用以下代码从服务器读取 mp4 文件并通过 http 发送它 我的服务器端是 mvc4 控制器 有趣的是 视频在 Chrome 中渲染得很好 但在 ios 设备上没有得到任何东西 所以我认为这可能是响应流标头问题 我缺少什么吗 var
  • 具有自定义字段名称的 RavenDB 查询索引

    我在 RavenDB 中收集了 Message 文档 定义 class Message string Content Tag Tags class Tag string Value 我有索引 from doc in docs Message
  • .net 日历 - 使整个单元执行回发(可点击)

    我已经启动并运行了一个 net 日历 并从数据库中获取信息 默认情况下 天数会应用回发操作 我想做的是将该操作应用于整个单元格 这样用户就不需要仅单击文本链接 我是 dayRenderer 操作 我有以下行来尝试复制该操作 但第二个参数我不
  • 如何强制操作系统收回内存? (C++)

    在我的 C 代码中 我分配了大量内存来创建树 然后在每个节点中使用 删除 来释放内存 删除所有内容后 我检查操作系统使用的内存量 发现内存未释放 这是预期的 因为该进程不会立即将内存返回给操作系统 因为它仍然可能会再次使用它 问题是 我在删
  • C#等待串口数据

    我试图通过 C 应用程序从指纹扫描仪获取数据 但在指纹发送之前 我的整个代码都会执行 我尝试使用延迟功能System Threading Thread Sleep 1000 因此它可以在下一步执行之前获取数据 但这一切似乎都是徒劳的 任何人
  • 如何分配二维数组? [复制]

    这个问题在这里已经有答案了 我需要创建一个二维数组 目前我将其创建为int a 100 100 但我需要使用动态分配内存malloc在C语言中 我用了代码 include
  • C++ OpenMP:嵌套循环,其中内部迭代器依赖于外部迭代器

    考虑以下代码 include
  • 如何结束用户会话并确保用户已注销?

    我是 aspx 的新手 现在的问题是 因为我正在做一个支持网络的项目 所以我从用户那里登录了 我拖放登录模板 然后使用 Session Authentication username Tostring 存储当前登录用户的信息等 现在我什至使
  • 为什么指向 int 的指针会转换为 void* 而指向函数的指针会转换为 bool?

    C 标准草案 N3337 对指针转换有以下规定 4 10 指针转换 2 指向的指针 类型的右值cv T 在哪里T是一个对象类型 可以转换为 指向的指针 类型的右值cv void 将 指针转换为cv T 到 指向cv void 指向类型对象的
  • Python 比 C++ 更快、更轻吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何编辑 .csproj 文件

    当我使用 NET Framework 4 0 MSBUILD EXE 文件编译 csproj 文件时 出现错误 在 website01 csproj 的当前上下文中找不到 lable01 实际上 我需要添加每个 ASP NET 页面及其代码
  • 链接的 ostream 内部行为及其在 MSVC 上的结果(与 Clang 相比)

    MSVC 与 GCC Clang 的流 内部字符串和操作排序问题 大家好 我最近刚刚开始更认真地使用 MSVC 来完成我的一个跨平台项目 同时通过以下方式测试输出chainedSTD 流 IE 一系列的obj foo lt lt endl
  • C++ 使用枚举调用基类构造函数

    是否可以将值和常量枚举传递给类的基本构造函数 例如 enum CarBrand Volkswagen Ferrari Bugatti class Car public Car int horsePower CarBrand brand th
  • 人们应该选择 ImmutableDictionary 还是 ImmutableSortedDictionary?

    我听说 NETSystem Collections Immutable集合被实现为平衡二叉树 以满足其不变性约束 甚至是传统上对哈希表进行建模的集合 例如Dictionary 通过使用积分值GetHashCode作为排序键 如果我有一种类型

随机推荐

  • 每天10个前端小知识 <Day 5>

    前端面试基础知识题 1 typeof 与 instanceof 有什么区别 typeof与instanceof都是判断数据类型的方法 区别如下 typeof会返回一个变量的基本类型 instanceof返回的是一个布尔值 instanceo
  • 2024年华数杯国际赛B题:光伏发电功率 思路模型代码解析

    2024年华数杯国际赛B题 光伏发电功率 Photovoltaic Power 一 问题描述 中国的电力构成包括传统能源发电 如煤 油和天然气 可再生能源发电 如水电 风能 太阳能和核能 以及其他形式的电力 这些发电模式在满足中国对电力的巨
  • iprtrmgr.dll文件丢失导致程序无法运行问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个iprtrmg
  • 前端基础:回顾es6相关知识

    Author note 题记 ECMAscript is international standard of javascript ECMA 是 js的国际标准版语言 let and const 为什么之前用var现在需要用let cons
  • iPhone16或全系升级8GB内存,支持Wi-Fi 6E!

    随着新的一年到来 苹果下一代机型iPhone 16系列的爆料也越来越充实 越来越详细 从多个爆料中 我们甚至已经都够想象出下一代iPhone的基本雏形 海通国际技术分析师Jeff Pu 为我们带来了新的内容 这位分析师称 iPhone 16
  • Jenkins 插件下载速度慢、安装失败了!我教你怎么解决!

    Jenkins部署完毕 如果不安装插件的话 那它就是一个光杆司令 啥事也做不了 所以首先要登陆管理员账号然后点击系统管理再点击右边的插件管理安装CI CD必要插件 但是问题来了 jenkins下载插件速度非常慢 而且经常提示下载插件失败 真
  • ir50_32.dll文件丢失导致程序无法运行问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个ir50 32
  • 【固定翼飞机】基于最优控制的固定翼飞机着陆控制器设计研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文章
  • 深度好文:最全的大模型 RAG 技术概览

    本文是对检索增强生成 Retrieval Augmented Generation RAG 技术和算法的全面研究 对各种方法进行了系统性的梳理 涉及了 RAG 流程中的数据拆分 向量化 查询重写 查询路由等等 在做 RAG 的小伙伴一定知道
  • messages,CentOS 7不收集日志或不存在 /var/log/messages

    var log message var log secure等都不记录了 并且都是空文件 重启机器 reboot 无效 重启日志 systemctl start rsyslog 无效 怀疑空间不足 删除 var log messages 重
  • 图解python | 基础数据类型

    1 Python变量类型 Python基本数据类型一般分为6种 数值 Numbers 字符串 String 列表 List 元组 Tuple 字典 Dictionary 集合 Set 本文详细讲解Python中变量赋值 数据类型以及数据类型
  • 2024年金三银四网络安全考试试题

    2023年金三银四网络安全考试试题 1 关于数据使用说法错误的是 A 在知识分享 案例中如涉及客户网络数据 应取敏感化 不得直接使用 B 在公开场合 公共媒体等谈论 传播或发布客户网络中的数据 需获得客户书面授权或取敏感化 公开渠道获得的除
  • 外包干了3个月,技术退步明显。。。。。

    先说一下自己的情况 本科生 19年通过校招进入广州某软件公司 干了接近4年的功能测试 今年年初 感觉自己不能够在这样下去了 长时间呆在一个舒适的环境会让一个人堕落 而我已经在一个企业干了四年的功能测试 已经让我变得不思进取 谈了2年的女朋友
  • [C++]:11.模拟实现vector

    模拟实现vector 二 模拟实现vector 0 看一看源码SGI 1 vector h 2 stl vector h 1 构造 2 析构函数
  • 利用 LangChain 和 Neo4j 向量索引,构建一个RAG应用程序

    Neo4j 在5 11版本中将向量搜索功能完全集成到 Neo4j AuraDB 和 Neo4j 图数据库中 随后对 Neo4j 向量检索的全面支持也被集成到了 LangChain 库中 Neo4j 向量检索已成为检索增强生成 RAG 应用程
  • 嵌入式开发--STM32G4系列片上FLASH的读写

    这个玩意吧 说起来很简单 就是几行代码的事 但楞是折腾了我大半天时间才搞定 原因后面说 先看代码吧 读操作 读操作很简单 以32位方式读取的时候是这样的 data IO uint32 t 0x0800F000 需要注意的是 当以32位方式读
  • Android开发中常见安全问题和解决方案

    前言 开发APP时经常有问到 APP的安全怎么保障 应用程序被PJ了怎么办 手机被人捡去了怎么办 特别在号称 安全第一 风控牛逼 的银行系统内 移动产品安全性仍被持有怀疑态度 那我们来总结下APP安全的方向和具体知识 1 应用程序安全 2
  • Android SDK开发艺术探索(五)安全与校验

    一 前言 本篇是Android SDK开发艺术探索系列的第五篇文章 介绍了一些SDK开发中安全方面的知识 包括资源完整性 存储安全 权限校验 传输安全 代码混淆等知识 通过基础的安全配置为SDK保驾护航 探索SDK开发在安全方面的最佳实践
  • Python爬虫实战:IP代理池助你突破限制,高效采集数据

    当今互联网环境中 为了应对反爬虫 匿名访问或绕过某些地域限制等需求 IP代理池成为了一种常用的解决方案 IP代理池是一个包含多个可用代理IP地址的集合 可以通过该代理池随机选择可用IP地址来进行网络请求 IP代理池是一组可用的代理IP地址
  • 【C++入门】C++ STL中string常用函数用法总结

    目录 前言 1 string使用 2 string的常见构造 3 string类对象的访问及遍历 迭代器遍历 访问 4 string类对象的容量操作 4 1 size和length 4 2 clear empty和capacity 4 3