【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常用函数用法总结 的相关文章

随机推荐

  • 每天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