C++ Learning string类的使用

string类的使用

C++ 中的 string 类是标准库 <string> 中提供的一个类,封装了动态数组的字符序列,常用于处理字符串。

string 类对象的常见构造

默认构造函数

std::string str; // 创建一个空字符串,长度为0

通过另一个 string 对象复制

std::string str1 = "Hello";
std::string str2(str1); // 复制 str1 到 str2

通过子串构造

std::string str1 = "hello";
std::string str2(str1,2,2)// 创建一个str1的子串,从下标2开始,长度为2
//默认长度为string::npos,即字符串长度最大值。

通过字符串字面量初始化

std::string str = "Hello"; // 创建一个内容为 "Hello" 的字符串

通过字符数组初始化

const char* cstr = "World";
std::string str(cstr); // 将字符数组 cstr 转换为 string 对象

通过部分字符数组初始化

const char* cstr = "Hello, World!";
std::string str(cstr, 5); // 创建一个内容为 "Hello" 的字符串,限制长度为 5

通过重复某个字符初始化

std::string str(5, 'A'); // 创建一个字符串 "AAAAA",长度为 5,内容为 'A'

通过迭代器初始化

std::string str1 = "hello";
std::string str3(str1.begin(), str1.end());// 创建一个str1的拷贝,从begin到end

构造函数文档

string类对象的容量操作

size()length()
size_t len = str.size(); // 返回字符串的长度(字符数)
empty()
bool isEmpty = str.empty(); // 判断字符串是否为空
capacity()
size_t cap = str.capacity(); // 返回当前分配的容量,可能大于或等于字符串的实际大小
clear()
str.clear();//清空字符串内容
resize()
  • 作用resize() 改变字符串的 实际大小,即字符串的字符数。它可以增加或减少字符串的大小。

  • 参数

    • resize(n):将字符串的大小调整为 n。如果 n 大于当前的大小,字符串会被 填充(默认使用空字符 '\0')。如果 n 小于当前大小,则会 截断 字符串。
    • resize(n, c):将字符串的大小调整为 n,如果增加字符,则用字符 c 填充。
  • 示例

    std::string str = "Hello";
    str.resize(10, 'X'); // 字符串变为 "HelloXXXXX",长度为 10,末尾填充 'X'
    str.resize(3); // 字符串变为 "Hel",长度为 3,截断多余字符
    
  • 特点

    • 改变的是 字符串的大小,也就是字符的数量。
    • 增加大小时,可能会使用填充字符(默认是 '\0',除非指定填充字符)。
    • 如果 n 小于当前大小,字符串会被 截断
    • 可能会重新分配内存,尤其是增加大小时。

string::resize - C++ Reference

reserve()
  • 作用reserve() 改变字符串的 容量(即为内部存储预分配内存)。它不会改变字符串的实际大小,只是确保字符串的内部缓冲区能够容纳至少 n 个字符。reserve() 是为了优化内存分配,减少未来的内存重新分配。

  • 参数

    • reserve(n):为字符串分配至少 n 个字符的内存空间。如果 n 比当前容量大,则会分配新的内存;如果 n 小于或等于当前容量,则什么都不做。
  • 示例

    std::string str = "Hello";
    str.reserve(20); // 为字符串预留至少 20 个字符的空间
    // 字符串的大小仍然是 5,但内部容量变为 20
    
  • 特点

    • 改变的是 字符串的容量,即分配的内存大小,而不是字符串的实际字符数。
    • reserve() 并不会改变字符串的大小,实际字符数保持不变,容量变大是为了后续可能的字符添加。
    • 不会增加或减少字符串的字符数,仅仅是内存优化。
    • 提高效率:如果知道之后会向字符串中添加大量字符,提前调用 reserve() 可以避免多次分配内存,从而提高效率。

string::reserve - C++ Reference

string类对象的访问及遍历操作

operator[](访问字符)

operator[] 允许你通过下标直接访问字符串中的字符。这是最常见的访问方式,返回指定位置的字符。

  • 语法

    char c = str[pos];  // 访问字符串中位置为 pos 的字符
    
  • 特点

    • 不会检查越界,若 pos 超出了字符串的长度,会导致未定义行为。
  • 示例

    std::string str = "Hello";
    char c = str[1];  // c = 'e'
    
at()(访问字符并进行边界检查)

at() 函数类似于 operator[],但它会 进行边界检查。如果访问越界,它会抛出 std::out_of_range 异常。

  • 语法

    char c = str.at(pos);  // 访问字符串中位置为 pos 的字符
    
  • 特点

    • 如果 pos 超出有效范围,会抛出异常。
    • 更安全,因为会进行越界检查。
  • 示例

    std::string str = "Hello";
    try {char c = str.at(10);  // 抛出 std::out_of_range 异常
    } 
    catch (const std::out_of_range& e) {std::cout << "Out of range: " << e.what() << std::endl;
    }
    
begin()end()(获取迭代器)

begin()end() 返回指向字符串开始和结束位置的 迭代器

  • begin() 返回指向第一个字符的迭代器。

  • end() 返回指向最后一个字符 下一个位置 的迭代器。

  • 语法

    auto it_begin = str.begin();  // 指向第一个字符的迭代器
    auto it_end = str.end();      // 指向最后一个字符之后的迭代器
    std::string::iterator it_begin = str.begin();//指向第一个字符
    std::string::iterator it_end = str.end();//指向最后一个字符的下一个位置
    
  • 特点

    • begin() 返回一个指向第一个字符的迭代器,end() 返回一个指向末尾之后位置的迭代器。
  • 示例

    std::string str = "Hello";
    for (auto it = str.begin(); it != str.end(); ++it) {std::cout << *it;  // 输出每个字符
    }
    
rbegin()rend()(反向迭代器)

rbegin()rend() 返回指向字符串 末尾开头前一个位置反向迭代器。反向迭代器从字符串的最后一个字符开始,向前遍历。

  • 语法

    auto it_rbegin = str.rbegin();  // 指向最后一个字符的反向迭代器
    auto it_rend = str.rend();      // 指向第一个字符前一个位置的反向迭代器
    
  • 特点

    • rbegin() 返回指向最后一个字符的反向迭代器,rend() 返回指向第一个字符前一个位置的迭代器。
    • 使用反向迭代器可以从后往前遍历字符串。
  • 示例

    std::string str = "Hello";
    for (auto it = str.rbegin(); it != str.rend(); ++it) {std::cout << *it;  // 输出每个字符,从后往前
    }
    
范围 for 循环(C++11 )

C++11 引入的范围 for 循环使得遍历容器变得更加简洁。它可以直接遍历容器中的元素,而不需要显式使用迭代器或下标。

  • 语法

    for (auto ch : str) {std::cout << ch;  // 直接遍历字符串中的每个字符
    }
    
  • 特点

    • 语法简洁。
    • 自动根据容器类型选择适当的迭代器。
    • 更加安全,不需要手动控制迭代器的增量或结束条件。
  • 示例

    std::string str = "Hello";
    for (char ch : str) {std::cout << ch;  // 输出每个字符
    }
    

string类对象的修改操作

push_back()

push_back() 方法用于将一个字符追加到字符串的末尾。

str.push_back('c');  // 在字符串的末尾添加字符 'c'
append()

append() 方法用于将一个字符串或字符序列添加到另一个字符串的末尾。你可以指定追加的字符数量,或者追加整个字符串。

str.append(" World");  // 将 " World" 追加到 str 后面
str.append("!", 1);    // 将 "!" 追加到 str 后面,指定长度
operator+=

operator+=用于将一个字符串或字符序列追加到现有的字符串对象的末尾。

它支持不同类型的操作数,包括:

  • 另一个 std::string 对象
  • 一个字符
  • 一个 C 风格字符串
std::string str("hello");
std::string str1(" world");
str += str1; //string
str += "!!!";  //C-string
str += "!";	//character
c_str()

c_str() 返回一个指向 const char* 的指针,这个指针指向字符串对象内部数据的起始位置。这个字符串的内容是以 null 字符 ('\0') 结尾的,与 C 风格字符串的要求一致。

c_str() 的语法

const char* cstr = str.c_str();
  • 其中 str 是一个 std::string 对象,cstr 是返回的 C 风格字符串指针。
  • 返回值 cstr 是一个指向 const char 的指针,它指向 str 内部数据的首字符
find 函数

find 用于在字符串中查找指定字符或子字符串的首次出现位置。如果找到了指定内容,find 返回它在字符串中的位置(索引);如果没有找到,则返回一个特殊的常量 std::string::npos,表示未找到。

基本语法

size_t find(char ch, size_t pos = 0) const; 
size_t find(const std::string& str, size_t pos = 0) const;
  • ch:要查找的字符。
  • str:要查找的子字符串。
  • pos:开始查找的位置(默认为 0,表示从字符串的开始查找)。
  • 返回值:
    • 如果找到了字符或子字符串,返回其位置(索引,从 0 开始)。
    • 如果没有找到,返回 std::string::npos

注意

  • find 只返回首次出现的位置。如果有多个相同的字符或子字符串,只有第一个会被找到。
rfind 函数

rfindfind 的反向版本。它用于从字符串的末尾开始查找指定字符或子字符串的 最后一次 出现位置。

size_t rfind(char ch, size_t pos = std::string::npos) const; 
size_t rfind(const std::string& str, size_t pos = std::string::npos) const;
  • ch:要查找的字符。
  • str:要查找的子字符串。
  • pos:开始查找的位置,默认为 std::string::npos,表示从字符串的末尾开始查找。
  • 返回值:
    • 如果找到了字符或子字符串,返回其位置(索引)。
    • 如果没有找到,返回 std::string::npos

注意

  • rfind 只返回最后一次出现的位置。如果有多个相同的字符或子字符串,它会返回最后一个出现的索引。
substr函数

用于提取字符串的子串。它允许从原始字符串中提取出一部分字符串,并返回一个新的 std::string 对象。

substr 的基本语法

std::string substr(size_t pos = 0, size_t len = npos) const;
  • pos:表示子串的起始位置(索引),默认为 0,表示从字符串的开头开始。
  • len:表示要提取的子串的长度,默认为 std::string::npos,即直到字符串的结尾。如果指定的 len 大于从 pos 开始的位置到字符串末尾的剩余长度,则 substr 会提取到字符串的结尾。

返回值:

  • 返回一个新的 std::string 对象,包含从 pos 开始,长度为 len 的子串

string类非成员函数

std::getline(从流中读取一行)

用于从输入流(如 std::cin )中读取一行数据,并将其存储到一个 std::string 对象中。

语法

std::istream& std::getline(std::istream& is, std::string& str);
std::istream& std::getline(std::istream& is, std::string& str, char delim);
  • is:输入流对象(如 std::cin 或文件流)。
  • str:存储输入的一行文本的 std::string 对象。
  • delim(可选):指定行结束符的分隔符(默认为换行符)。

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

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

相关文章

windows下安装配置anaconda及常用的conda命令

Anaconda极大的简化了Python环境和库的管理&#xff0c;其最大的作用就是可以创建、管理多个不同python版本的虚拟环境&#xff0c;起到不同环境相互隔离、互不干扰、避免环境冲突的目的。如果使用本地Python安装多个包&#xff0c;经常会遇到包冲突&#xff0c;导致整个python…

安装CPU版的torch(清华源)

1、安装指令&#xff1a; pip3 install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple2、验证torch是否安装成功 // 使用python验证 import torch print(torch.__version__)能正常打印版本即表示安装成功&#xff0c;如下图

ASP.NET Core Web API 控制器

文章目录 一、基类&#xff1a;ControllerBase二、API 控制器类属性三、使用 Get() 方法提供天气预报结果 在深入探讨如何编写自己的 PizzaController 类之前&#xff0c;让我们先看一下 WeatherController 示例中的代码&#xff0c;了解它的工作原理。 在本单元中&#xff0c…

【蓝桥杯——物联网设计与开发】基础模块8 - RTC

目录 一、RTC &#xff08;1&#xff09;资源介绍 &#x1f505;简介 &#x1f505;时钟与分频&#xff08;十分重要‼️&#xff09; &#xff08;2&#xff09;STM32CubeMX 软件配置 &#xff08;3&#xff09;代码编写 &#xff08;4&#xff09;实验现象 二、RTC接口…

k8s dashboard可视化操作界面的安装

一、官方安装方法 根据官网的安装配置可以选择如下安装&#xff1a; kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml 二、添加阿里云加速进行安装 #修改recommended.yaml拉取镜像的链接 vim recommended.yam…

【目标跟踪综述及关键技术】

1.多目标跟踪任务介绍 定义 多目标跟踪旨在将视频序列中感兴趣的目标检测出来&#xff0c;并赋予每个目标单独的编号&#xff0c;在整个序列中形成目标的轨迹。 分类 online&#xff1a;算法在推理目标身份过程中&#xff0c;只能看见当前帧以及之前的帧&#xff08;关联&a…

webrtc音频模块(三) windows Core Audio API及声音的播放

在前面介绍了ADM(Audio Device Module)&#xff0c;它用于抽象音频设备管理和音频数据采集/播放接口。windows的实现是AudioDeviceWinowCode&#xff0c;它封装了Core Audio APIs实现了对音频设备的操作。 Core Audio APIs windows提供了多种音频操作API&#xff0c;比如最常…

在linux系统的docker中安装GitLab

一、安装GitLab&#xff1a; 在安装了docker之后就是下载安装GitLab了&#xff0c;在linux系统中输入命令&#xff1a;docker search gitlab就可以看到很多项目&#xff0c;一般安装第一个&#xff0c;它是英文版的&#xff0c;如果英文不好可以安装twang2218/gitlab-ce-zh。 …

uniapp跨平台开发---webview调用app方法

1.app端实现 注意:为了实现实时通信,app端页面是.nvue 代码实现 <template><view class"content"><view class"web-view"><web-view class"web-view" :src"url" ref"webview" onPostMessage"o…

LeetCode 343.整数拆分

1.题目要求: 2.题目代码: class Solution { public:int integerBreak(int n) {//先确定dp数组vector<int> dp;//1.确定dp数组的含义//2.确定dp的递推公式//3.初始化dp数组//4.遍历顺序dp.resize(n 1);dp[0] 0;dp[1] 0;dp[2] 1;for(int i 3;i < n;i){for(int j …

【Linux探索学习】第二十三弹——理解文件系统:认识硬件、探索文件在硬件上的存储问题

Linux学习笔记&#xff1a;https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言&#xff1a; 我们前面讲过了文件的组成是由文件内容和文件属性两者组成的&#xff0c;但是我们前面接触的文件都是系统中的文件&#xff0c;都是已经在进…

Flask中@app.route()的methods参数详解

诸神缄默不语-个人CSDN博文目录 在 Flask 中&#xff0c;app.route 是用于定义路由的核心装饰器&#xff0c;开发者可以通过它为应用指定 URL 映射及相应的处理函数。在处理 HTTP 请求时&#xff0c;不同的业务场景需要支持不同的 HTTP 方法&#xff0c;而 app.route 的 metho…

工业相机镜头选型知识详解

工业相机在机器视觉、自动化生产和检测等领域扮演着重要角色&#xff0c;而镜头作为工业相机的关键组件&#xff0c;其选型直接影响到成像效果和系统的整体性能。在本篇博客中&#xff0c;我们将详细讲解工业相机镜头选型的相关知识&#xff0c;帮助您在实际应用中选择最合适的…

羊城杯2020 easycon

打开是这样一个页面&#xff0c;这样情况一般先想到的就是目录扫描了 好吧&#xff0c;不知道为什么gobuster扫不出来 dirsearch扫出个index.php和index.php/login&#xff0c;都访问一下 提醒我这个文件有一句话木马 怪怪的&#xff0c;不知道为什么weevely连接不上 蚁剑吧&am…

顶顶通呼叫中心中间件mod_cti模块安全增强,预防盗打风险(mod_cti基于FreeSWITCH)

文章目录 前言联系我们mod_cti版本支持安全加强说明 前言 FreeSWITCH暴露在公网最大的风险就是被不法之人盗打 出现盗打的主要原因以下几点&#xff1a; 分机密码太简单或者密码泄露了拨号方案配置不合理sofia配置错误 所以我们给顶顶通呼叫中心中间件添加了安全加强功能&am…

面试基础篇---迭代器,yield, tcp, 等

1.谈谈python的装饰器&#xff0c;迭代器&#xff0c;yield&#xff1f; 迭代器在内存中通常是一次性遍历的&#xff0c;也就是说&#xff0c;一旦遍历完所有元素&#xff0c;它就会停止工作&#xff0c;不可再用。 惰性计算&#xff1a;生成器按需生成数据&#xff0c;即只有在…

软件测试之测试用例

文章目录 测试用例测试用例的编写总结 测试用例 测试用例:描述测试点执行的文档(测试输入、执行条件、预期结果等) 作用 1.测试点能被精准执行 2.便于团队合作测试用例核心内容 用例编号、用例标题、所属模块、优先级、前置条件、测试步骤、测试数据、预期结果 测试用例的编写…

微机接口课设——基于Proteus和8086的打地鼠设计(8255、8253、8259)

原理图设计 汇编代码 ; I/O 端口地址定义 IOY0 EQU 0600H IOY1 EQU 0640H IOY2 EQU 0680HMY8255_A EQU IOY000H*2 ; 8255 A 口端口地址 MY8255_B EQU IOY001H*2 ; 8255 B 口端口地址 MY8255_C EQU IOY002H*2 ; 8255 C 口端口地址 MY8255_MODE EQU IOY003H*2 ; …

I.MX6U 启动方式详解

一、启动方式选择 BOOT 的处理过程是发生在 I.MX6U 芯片上电以后,芯片会根据 BOOT_MODE[1:0]的设置 来选择 BOOT 方式。 BOOT_MODE[1:0]的值是可以改变的,有两种方式,一种是改写 eFUSE(熔 丝),一种是修改相应的 GPIO 高低电平。第一种修改 eFUSE 的方式只能修改一次,后面就…

下载运行Vue开源项目vue-pure-admin

git地址&#xff1a;GitHub - pure-admin/vue-pure-admin: 全面ESMVue3ViteElement-PlusTypeScript编写的一款后台管理系统&#xff08;兼容移动端&#xff09; 安装pnpm npm install -g pnpm # 国内 淘宝 镜像源 pnpm config set registry https://registry.npmmirror.com/…