C++中string的使用

news2024/9/23 14:48:45

文章目录

  • string类对象的常见构造
  • string类对象的容量操作
    • size() / length():返回字符串的长度(字符数)。
    • capacity():返回当前字符串分配的容量(即在重新分配内存前可以保存的字符数)。
    • 检查是否为空:使用 empty() 函数检查字符串是否为空。
    • clear():清空字符串,使其变为空字符串。
    • reserve(size_t n):预留至少 n 个字符的空间,避免后续频繁分配内存。
    • resize(size_t n):调整字符串的大小。可以增大或缩小字符串的长度。
  • string类对象的访问及遍历操作
    • operator[]:使用索引访问或修改字符串中的某个字符(不进行边界检查)
    • 迭代器
  • string类对象的修改操作
    • push_back():在字符串末尾添加一个字符。
    • append():将指定的字符串或字符追加到当前字符串的末尾。
    • operator += 同append()类似,不过更加简洁
    • c_str()
    • find():查找子串在字符串中的位置,返回起始位置索引,若未找到返回string::npos。
    • rfind 返过来的find()
    • substr(Generate substring)
  • string类非成员函数
    • 1. operator>> —— 输入运算符
    • 2. operator<< —— 输出运算符
    • std::getline() 函数

前言:string 是 C++ 标准库中的一个类,专门用于处理和操作字符串。与 C 语言中的字符数组(char[])相比,string 提供了更丰富的功能和更安全的内存管理,极大地简化了字符串操作。

在string当中其含有许多的接口,我们通过这些接口去使用这些让我们写代码更加方便的函数,更加高效的完成我们想要实现的目标,所以我们需要了解部分的接口,让我们在进行结果的实现更加轻松,但是由于接口过多,所以我只需要知道关于string中重点,常用的即可

string类对象的常见构造

在这里插入图片描述

可以清楚的看到,在string构造当中含有许多的接口,这边我们重点了解的是

string()构造空的string类对象,即空字符串
string(const char* s)用C-string来构造string类对象
string(const string&s)拷贝构造函数
void Teststring()
 {
    string s1;                // 构造空的string类对象s1
    string s2("hello bit");   // 用C格式字符串构造string类对象s2
    string s3(s2);            // 拷贝构造s3
 }

string类对象的容量操作

size返回字符串有效长度
length返回字符串有效长度
capacity返回空间总大小
empty检测字符串释放为空串,是返回true,否则返回false
clear清空有效字符
reserve为字符串预留空间
resize将有效字符的个数该成n个,多出的空间用字符c填充

size() / length():返回字符串的长度(字符数)。

string str = "Hello";
cout << str.size();    // 输出 5
cout << str.length();  // 等同于 size()

capacity():返回当前字符串分配的容量(即在重新分配内存前可以保存的字符数)。

string str = "Hello";
cout << str.capacity();  // 输出当前分配的容量

检查是否为空:使用 empty() 函数检查字符串是否为空。

if (str.empty()) 
{
    cout << "String is empty" << endl;
}

clear():清空字符串,使其变为空字符串。

string str = "Hello";
str.clear();  // 结果为空字符串 ""

reserve(size_t n):预留至少 n 个字符的空间,避免后续频繁分配内存。

string str = "Hello";
str.reserve(100);  // 预留至少 100 个字符的空间

resize(size_t n):调整字符串的大小。可以增大或缩小字符串的长度。

string str = "Hello";
str.resize(10, 'x');  // 变为 "Helloxxxxx"

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

operator[]返回pos位置的字符,const string类对象调用
begin+endbegin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
rbegin+ rendbegin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
at()相比operator[]更加安全带边界检查

operator[]:使用索引访问或修改字符串中的某个字符(不进行边界检查)

string str = "Hello";
char c = str[1];   // 访问第二个字符,'e'
str[0] = 'h';      // 修改第一个字符

迭代器

string 提供了迭代器来遍历字符串:

begin() 和 end() 返回指向字符串起始和末尾的迭代器。
rbegin() 和 rend() 返回逆向迭代器,用于逆序遍历。

// 迭代器
	string::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << endl;
		++it;
	}

	// string::reverse_iterator rit = s.rbegin();
	// C++11之后,直接使用auto定义迭代器,让编译器推到迭代器的类型
	auto rit = s.rbegin();
	while (rit != s.rend())
		cout << *rit << endl;

	// 3.范围for
	for (auto ch : s)
		cout << ch << endl;
}

string类对象的修改操作

push_back在字符串后尾插字符
append在字符串后追加一个字符串
operator+=在字符串后追加字符串str
c_str返回C格式字符串
find + npos从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
rfind从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
substr在str中从pos位置开始,截取n个字符,然后将其返回

push_back():在字符串末尾添加一个字符。

string str = "Hello";
str.push_back('!');
//输出: Hello!

append():将指定的字符串或字符追加到当前字符串的末尾。

//追加一个对象
string str1 = "Hello";
string str2 = " World";
str1.append(str2);  // 结果: "Hello World"
//追加多个副本
string str = "Hello";
str.append(3, '!');  // 结果: "Hello!!!"

operator += 同append()类似,不过更加简洁

string str1 = "Hello";
string str2 = " World";
str1 += str2;  // 结果: "Hello World"

string str = "Hello";
str += '!';  // 结果: "Hello!"

c_str()

#include <iostream>
#include <string>
#include <cstdio>  // 用于 printf

int main() {
    // 创建 std::string 对象
    std::string str = "Hello, C++";

    // 使用 c_str() 获取 C 风格字符串
    const char* cstr = str.c_str();

    // 打印 C 风格字符串
    std::printf("C-style string: %s\n", cstr);

    // 与 C 风格字符串进行交互(不能修改内容)
    if (std::strcmp(cstr, "Hello, C++") == 0) {
        std::cout << "Strings are equal!" << std::endl;
    }

    return 0;
}
输出:
C-style string: Hello, C++
Strings are equal!

find():查找子串在字符串中的位置,返回起始位置索引,若未找到返回string::npos。

string str = "Hello, World!";
size_t pos = str.find("World");  // 返回 7

rfind 返过来的find()

在这里插入图片描述
str:要查找的子字符串(可以是 std::string、const char* 或字符 char)。
pos:从字符串的右侧开始查找的起始位置,默认值是 npos,表示从字符串末尾开始查找。
n:要查找的字符数(当使用 const char* 时适用)。

int main ()
{
  string str ("The sixth sick sheik's sixth sheep's sick.");
  string key ("sixth");

  size_t found = str.rfind(key);
  if (found!=std::string::npos)
    str.replace (found,key.length(),"seventh");

  cout << str << '\n';

  return 0;
}

输出:
The sixth sick sheik's seventh sheep's sick.

substr(Generate substring)

int main ()
{
  string str="We think in generalities, but we live in details."// (quoting Alfred N. Whitehead)

  string str2 = str.substr (3,5);     // "think"
  size_t pos = str.find("live");      // position of "live" in str
  string str3 = str.substr (pos);     // get from "live" to the end
  cout << str2 << ' ' << str3 << '\n';

  return 0;
}

输出:
think live in details.

string类非成员函数

operator+尽量少用,因为传值返回,导致深拷贝效率低
operator>>输入运算符重载
operator<<输出运算符重载
geline获取一行字符串
realtional operator大小比较

1. operator>> —— 输入运算符

operator>> 用于从输入流中提取数据。它将输入流中的数据读取到变量中,并根据变量的类型自动进行解析。

常见用法:
用 std::cin 从控制台输入数据。
可以用于基本数据类型(如 int、float、char 等)和字符串(std::string)的输入。

#include <iostream>
#include <string>

int main() {
    int num;
    std::string name;

    // 输入整数
    std::cout << "Enter a number: ";
    std::cin >> num;

    // 输入字符串(单词)
    std::cout << "Enter your name: ";
    std::cin >> name;

    std::cout << "Number: " << num << ", Name: " << name << std::endl;

    return 0;
}
输出:
Enter a number: 42
Enter your name: John
Number: 42, Name: John

2. operator<< —— 输出运算符

operator<< 用于将数据输出到输出流中,通常与 std::cout 一起使用,用来将数据输出到控制台。它可以输出基本数据类型、字符串和用户自定义类型。

常见用法:
用 std::cout 将数据输出到控制台。
支持链式调用,可以连续输出多个数据。

#include <iostream>
#include <string>

int main() {
    int age = 25;
    std::string name = "Alice";

    // 输出数据
    std::cout << "Name: " << name << ", Age: " << age << std::endl;

    return 0;
}
输出:
Name: Alice, Age: 25

std::getline() 函数

在 C++ 中,std::getline() 是一个用于从输入流中读取整行文本的函数。与 operator>> 不同,std::getline() 会读取包括空格在内的整行输入,直到遇到换行符 \n。它适用于需要获取用户输入的完整行内容的场景。
在这里插入图片描述
示例 1:读取一行文本

#include <iostream>
#include <string>

int main() {
    std::string input;
    std::cout << "Enter a line of text: ";
    
    // 读取整行输入,直到遇到换行符
    std::getline(std::cin, input);
    
    std::cout << "You entered: " << input << std::endl;

    return 0;
}
Enter a line of text: Hello, World!
You entered: Hello, World!

示例 2:自定义分隔符

#include <iostream>
#include <string>

int main() {
    std::string input;
    std::cout << "Enter text (semicolon ';' to end): ";
    
    // 读取输入,直到遇到分号
    std::getline(std::cin, input, ';');
    
    std::cout << "You entered: " << input << std::endl;

    return 0;
}
Enter text (semicolon ';' to end): This is a test; Some more text
You entered: This is a test

std::string 是 C++ 标准库中的字符串类,它提供了对字符串操作的丰富接口和功能,极大地简化了对文本数据的处理。std::string 是面向对象的,并且支持动态内存管理,这使得它比 C 风格的字符数组(char[])更加灵活和安全。

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

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

相关文章

大数据可视化-三元图

三元图是一种用于表示三种变量之间关系的可视化工具&#xff0c;常用于化学、材料科学和地质学等领域。它的特点是将三个变量的比例关系在一个等边三角形中展示&#xff0c;使得每个点的位置代表三个变量的相对比例。 1. 结构 三个角分别表示三个变量的最大值&#xff08;通常…

Centos7.9 使用 Kubeadm 自动化部署 K8S 集群(一个脚本)

文章目录 一、环境准备1、硬件准备&#xff08;虚拟主机&#xff09;2、操作系统版本3、硬件配置4、网络 二、注意点1、主机命名格式2、网络插件 flannel 镜像拉取2.1、主机生成公私钥2.2、为啥有 Github 还用 Gitee2.3、将主机公钥添加到 Gitee2.3.1、复制主机上的公钥2.3.2、…

【C++篇】走进C++标准模板库:STL的奥秘与编程效率提升之道

文章目录 C STL 初探&#xff1a;打开标准模板库的大门前言第一章: 什么是STL&#xff1f;1.1 标准模板库简介1.2 STL的历史背景1.3 STL的组成 第二章: STL的版本与演进2.1 不同的STL版本2.2 STL的影响与重要性 第三章: 为什么学习 STL&#xff1f;3.1 从手动编写到标准化解决方…

FortiGate 防火墙 DNS 地址转换(DNS Translation)

简介 本例介绍 FortiGate 防火墙 DNS 地址转换&#xff08;DNS Translation&#xff09;配置方法。 一、 网络结构 网络结构如下图&#xff0c;PC1 连接在 FG60B 的 Internal 接口&#xff0c;FG60B 的 Wan1 接口连接 FG80CM 的 DMZ 接口&#xff0c;Wan1 接口开启 DNS 服务…

无人机之工作温度篇

无人机的工作温度是一个相对复杂的问题&#xff0c;因为它受到多种因素的影响&#xff0c;包括无人机的类型&#xff08;如民用、军用&#xff09;、设计规格、应用场景以及环境条件等。以下是对无人机工作温度范围的详细解析&#xff1a; 一、正常工作温度范围 一般来说&…

LeetcodeTop100 刷题总结(二)

LeetCode 热题 100&#xff1a;https://leetcode.cn/studyplan/top-100-liked/ 文章目录 八、二叉树94. 二叉树的中序遍历&#xff08;递归与非递归&#xff09;补充&#xff1a;144. 二叉树的前序遍历&#xff08;递归与非递归&#xff09;补充&#xff1a;145. 二叉树的后序遍…

RK3568驱动指南|第十六篇 SPI-第190章 配置模式下寄存器的配置

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

JavaEE---Spring之小练习

实现一个验证码项目 后端代码 后端代码测试 整体代码测试 输入正确的验证码 输入错误的验证码

【C++掌中宝】缺省参数的全面解析

文章目录 前言1. 什么是缺省参数&#xff1f;2. 缺省参数的分类2.1 全缺省【备胎是如何使用的&#x1f605;】2.1.1 疑难细究 2.2 半缺省2.2.1 错误用法示范2.2.2 正确用法示范2.2.3&#x1f525;实参缺省与形参缺省的混合辨析&#x1f525; 3. 缺省参数的规则和限制4. 规定必须…

Gartner发布2024年中国基础设施战略技术成熟度曲线

Gartner于近日首次发布2024年中国基础设施战略技术成熟度曲线&#xff0c;该曲线收录的21项技术主要覆盖四大领域&#xff0c;分别是&#xff1a;自主可控计划、AI 影响、运营效率以及基础设施现代化。 Gartner研究总监张吟铃表示&#xff1a;“中国市场与全球市场虽然使用的技…

[Redis][预备知识]详细讲解

目录 1.命令1.最核心的两个命令1.SET2.GET3.说明 2.基本全局命令0.前言1.KEYS2.EXISTS3.DEL4.EXPIRE5.TTL6.TYPE 2.数据结构和内部编码3.单线程架构1.单线程模型2.单线程还效率高&#xff1f;(重点)3.注意 1.命令 1.最核心的两个命令 1.SET 语法&#xff1a;SET key value功…

jmeter发送邮件:详细步骤与功能配置指南?

jmeter发送邮件如何设置&#xff1f;怎么配置JMeter以发送邮件&#xff1f; Apache JMeter作为一款强大的性能测试工具&#xff0c;不仅可以用于测试Web应用的性能&#xff0c;还可以通过插件扩展其功能&#xff0c;实现诸如发送邮件等操作。AokSend将详细介绍如何使用JMeter发…

核心复现—计及需求响应的区域综合能源系统双层优化调度策略

目录 一、主要内容&#xff1a; 二、摘要介绍&#xff1a; 三、综合能源系统结构&#xff1a; 四、实际仿真运行结果&#xff1a; 五、代码数据下载&#xff1a; 一、主要内容&#xff1a; 在模型构建部分&#xff1a;建立了一个综合能源系统双层优化调度模型&#xff0c;…

openeuler22.03 LTS 源码编译安装fastdfs-6.06

openeuler22.03 LTS 源码编译安装fastdfs-6.06 1、环境 名称版本备注openeuler22.03 LTSfastdfs6.06libfastcommon1.0.43libfastcommon是一个开源的C语言库&#xff0c;用于实现高性能的分布式文件系统和分布式存储系统 2、准备安装包 fastdfs 官网&#xff1a; https://git…

《概率论与数理统计》学渣笔记

文章目录 1 随机事件和概率1.1 古典概型求概率随机分配问题简单随机抽样问题 1.2 几何概型求概率1.3 重要公式求概率 2 一维随机变量及其分布2.1 随机变量及其分布函数的定义离散型随机变量及其概率分布&#xff08;概率分布&#xff09;连续型随机变量及其概率分布&#xff08…

【machine learning-12-多元线性回归】

线性回归-多特征 多特征线性回归多特征表示更简单的多元线性回归表示方法 之前节的线性回归为简化都是用的单特征&#xff0c;但现实中我们的预测因素很复杂不可能只有一个特征&#xff0c;下面总结多特征线性回归 多特征 之前总是用房价举例&#xff0c;预测房价和房屋面积的…

个人量化成功之路-----从 Yahoo! Finance 下载交易策略数据

雅虎财经 是投资者最受欢迎的网站之一。它提供有关股票、债券、货币和加密货币的各种市场数据。它还提供市场新闻、报告和分析、期权和基本数据 官方的雅虎财经 API 于 2017 年被下架 Yfinance 是由 Ran Aroussi 开发的开源 Python 库&#xff0c;用于访问雅虎财经上可用的财…

基于微信小程序的宠物寄养平台的设计与实现+ssm(lw+演示+源码+运行)

摘 要 随着科技和网络的进步&#xff0c;微信小程序技术与网络、生活贴和的更加紧密。需要依靠客户端的单机系统逐渐被淘汰&#xff0c;利用互联网可以处理大量数据的新型系统如雨后春笋般迅速发展起来。这类系统和信息化时代的同步发展对传统的办公管理方式造成了很大的压力。…

C++进阶学习——模版进阶

1. 非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 非类型形参&#xff0c;就是用一个常量作为类(函数)模板的一个参数&#xff0c;在类(函数)模板中可将该参数当成…

如何基于scrcpy改造实现大厂一键连招/触摸宏功能(带java源码)-千里马安卓framework实战

背景&#xff1a; 前面公众号文章已经分享过如何实现这种大厂里面一键连招&#xff0c;触摸宏的功能&#xff0c;原理本身是对dev/input下面的节点进行读取保存文件&#xff0c;然后在读取文件进行写入dev/input下面的节点&#xff0c;从而实现了触摸事件的读取和写入&#xf…