【C++】string类的使用

2023-11-10


需要云服务器等云产品来学习Linux的同学可以移步/-->腾讯云<--/-->阿里云<--/-->华为云<--/官网,轻量型云服务器低至112元/年,新用户首次下单享超低折扣。


 目录

一、string

1、string的介绍

2、为什么string类要实现为模板?

二、元素访问

1、使用operator[]实现数组下标式的访问

2、迭代器读写

2.1正向迭代器

2.2反向迭代器

2.3const正向迭代器(不能改变*it)

2.4const反向迭代器(不能改变*it)

3、范围for读写

三、string的构造接口

四、string的容量相关的接口

1.reserve(调整容量)

2.resize(调整size)

五、string对象修改相关的接口

1、insert

2、earse

3、assign

4、replace

六、string对象字符串运算相关接口

1、c_str

2、find查找+substr返回子串

七、部分非成员函数接口

1、getline

八、string对象与其他类型互相转换

1、stoi等

2、to_string


一、string

1、string的介绍

string是管理字符数组的类。

typedef basic_string<char> string;

basic_string是模板。将basic_string<char>这个实例重命名为string。

2、为什么string类要实现为模板?

我们印象中,单个字符就是1个字节,也就是char类型,但是由于编码问题,会有2字节和4字节的字符类型。

类型

编码

类型

string

UTF-8

char

wstring

Unicode

wchar_t

u16string

UTF-16

char16_t

u32string

UTF-32

char32_t

对于字符串的多种类型,设计了basic_string模板。

二、元素访问

1、使用operator[]实现数组下标式的访问

int main()
{
	string s("hello world");//构造
	for (size_t i = 0; i < s.size(); ++i)//读
	{
		cout << s[i] << " ";//等价于cout << s.operator[](i) << " ";
	}
	cout<<endl;
	for (size_t i = 0; i < s.size(); ++i)//写
	{
		cout << (s[i] += 1) << " ";
	}
	return 0;
}

operator[]和at的区别在于operator[]是断言,at是抛异常。主要release版本assert失效。

2、迭代器读写

2.1正向迭代器

int main()
{
	string s("hello world");
	string::iterator it = s.begin();
	//遍历访问
	while (it != s.end())
	{
		cout << *it;
		++it;
	}
	cout << endl;
	it = s.begin();//将it重新置为s.begin位置
	//遍历修改
	while (it != s.end())
	{
		*it += 1;
		cout << *it;
		++it;
	}
	return 0;
}

2.2反向迭代器

int main()
{
	string s("hello world");
	string::reverse_iterator rit = s.rbegin();
	//遍历访问
	while (rit != s.rend())
	{
		cout << *rit;
		++rit;
	}
	cout << endl;
	//遍历修改
	rit = s.rbegin();//将rit重新置为s.rbegin位置
	while (rit != s.rend())
	{
		*rit += 1;
		cout << *rit;
		++rit;
	}
	return 0;
}

2.3const正向迭代器(不能改变*it)

void test(const string& s)
{
	string::const_iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it;
		++it;
	}
}

2.4const反向迭代器(不能改变*it)

void test(const string& s)
{
	string::const_reverse_iterator rit = s.rbegin();
	while (rit != s.rend())
	{
		cout << *rit;
		++rit;
	}
}

3、范围for读写

int main()
{
	string s("hello world");
	//范围for的遍历访问
	for (auto e : s)
	{
		cout << e;
	}
	cout << endl;
	//范围for的遍历修改
	for (auto& e : s)
	{
		e += 1;
		cout << e;
	}
	return 0;
}

三、string的构造接口

函数名称

功能说明

string() (重点)

无参的构造,构造空字符串

string(const char* s) (重点)

用C_string字符串构造对象

string(size_t n, char c)

用n个字符创建对象

string(const string& s) (重点)

拷贝构造

string (const string& str, size_t pos, size_t len = npos)

用对象构造,下标为2至len位置

string (const char* s, size_t n)

用字符串的前n个构造对象

template <class InputIterator>

string (InputIterator first, InputIterator last);

迭代器区间构造

int main()
{
    string s1;//无参的构造      
    string s2("hello world");//用C_string字符串构造对象    
    string s3(3, 'x');//用3个字符创建对象
    string s4(s2);//拷贝构造
    string s5(s2, 2, 7);//用s2对象构造,下标为2开始,共7个字符构造s5,结果为llo wor
    string s6("hello world", 7);//用字符串构前7个字符构造
    string s7(s2.begin(),s2.begin()+3);//迭代器区间构造
    return 0;
}

四、string的容量相关的接口

函数名称

功能说明

size(重点)

返回字符串的长度,不包含'\0'

length

返回字符串的长度,不包含'\0'

capacity

返回数组容量

empty(重点)

字符串的判空

clear(重点)

将size置为0,不改变容量

reserve(重点)

用于预先开好空间

resize(重点)

调整size的大小,可能会改变容量。多出来的位置用'\0'填充

1.reserve(调整容量)

reserve用于预先开好空间,如果预开空间小于现有空间,将不会改变容量。

2.resize(调整size)

int main()
{
	string s("hello world");
	s.resize(20, 'x');//将size改为20,多出来的位置用字符x填充
	s.resize(30);//将size改为30,多出来的位置用'\0'填充
	return 0;
}

reserve和resize扩容时不会对已有的数据做改变,但缩容时会放弃超出空间的已有数据。

五、string对象修改相关的接口

函数名称

功能说明

push_back

尾插一个字符

append

尾插字符串

operator+=(重点)

字符、字符串尾插

insert

在pos位置插入

earse

在pos位置删除

assign

对原有字符串清空后赋值

replace

替换

1、insert

string& insert (size_t pos, const string& str);//pos位置插入string对象
string& insert (size_t pos, const string& str, size_t subpos, size_t sublen);//pos位置插入字符对象的一部分
string& insert (size_t pos, const char* s);//pos位置插入字符串
string& insert (size_t pos, const char* s, size_t n);//pos位置插入字符串的前n个
string& insert (size_t pos, size_t n, char c);//在pos位置插入n个字符
void insert (iterator p, size_t n, char c);
iterator insert (iterator p, char c);

template <class InputIterator>
void insert (iterator p, InputIterator first, InputIterator last);

2、earse

string& erase (size_t pos = 0, size_t len = npos); //从pos位置删除len个字符
iterator erase (iterator p);
iterator erase (iterator first, iterator last);

3、assign

assign可以理解成将原字符对象清空,重新进行赋值操作。

4、replace

repalce是对字符对象的部分取代。

#include <iostream>
#include <string>
#include <cstddef>

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

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

  std::cout << str << '\n';

  return 0;
}

六、string对象字符串运算相关接口

c_str(重点)

将string对象返回c格式字符串的指针

find(重点)

查找

rfind

倒着找

substr(重点)

返回子串

find_first_of

返回第一个匹配字符的下标

1、c_str

int main()
{
	string s("hello world");
	//虽然打印结果一样,但c_str()返回const char*,可以用于返回值有要求的地方
	cout << s << endl;
	cout << s.c_str() << endl;

	string file("test.txt");
	FILE* fout = fopen(file.c_str(), "w");
	return 0;
}

2、find查找+substr返回子串

size_t find (const string& str, size_t pos = 0) const;//从pos位置开始,在string对象中找str
size_t find (const char* s, size_t pos = 0) const;//从pos位置开始,在string对象中找s
size_t find (const char* s, size_t pos, size_t n) const;//从pos位置开始,在string对象中匹配s的前n个
size_t find (char c, size_t pos = 0) const;//从pos位置开始,在string对象中找字符

rfind是找到字符最后一次出现位置的下标。

一闭一开才是真实距离!!!

查找.后边的内容:

int main()
{
	string file("test.txt");
	size_t pos = file.find('.');//size_t find (char c, size_t pos = 0) const;
	if (pos != string::npos)//npos是定义在string中的静态变量
	{
		string suffix = file.substr(pos,file.size()-pos);//这里长度不给也行,默认是npos
		cout << suffix << endl;
	}
	return 0;
}

查找协议:

int main()
{
	string url("https://legacy.cplusplus.com/reference/string/string/find/");
	size_t pos = url.find(':');
	if (pos != string::npos)
	{
		string protocol = url.substr(0, pos);//从0开始数pos个元素
		cout << protocol << endl;
	}
	return 0;
}

查找域名:

int main()
{
	string url("https://legacy.cplusplus.com/reference/string/string/find/");
	size_t pos1 = url.find(':');
	size_t pos2 = url.find('/', pos1 + 3);
	if (pos2 != string::npos)
	{
		string domainName = url.substr(pos1+3, pos2-pos1-3);
		cout << domainName << endl;
	}
	return 0;
}

查找地址:

int main()
{
	string url("https://legacy.cplusplus.com/reference/string/string/find/");
	size_t pos1 = url.find(':');
	size_t pos2 = url.find('/', pos1 + 3);
	string uri = url.substr(pos2+1);
	cout << uri << endl;
	return 0;
}

七、部分非成员函数接口

函数名称

功能说明

operator+

左右操作数必须有一个string对象或

operator<<

流插入

operator>>

流提取

getline(重点)

获取一行

流提取是不能接收到空格和换行的,需要接收一行的时候需要使用getline。 

1、getline

istream& getline (istream& is, string& str, char delim);//从流提取中取出字符至str中,直至遇到delim或'\n'
istream& getline (istream& is, string& str);//从流提取中取出字符至str中
getline(std::cin,str);

八、string对象与其他类型互相转换

1、stoi等

 将一个string对象转化为int类型的数字。

idx如果不传或者为nullptr,则表示不使用这个参数;反之,&idx指向string对象数字字符的后一个位置。

2、to_string

能够把内置类型转化为string对象。

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

【C++】string类的使用 的相关文章

  • 有没有快速创建集合的方法?

    目前我正在创建一个像这样的新集 std set a s s insert a1 s insert a2 s insert a3 s insert a10 有没有办法创建s在一行 int myints 10 20 30 40 50 std s
  • QCombobox 向下箭头图像

    如何更改Qcombobox向下箭头图像 现在我正在使用这个 QSS 代码 但这不起作用 我无法删除向下箭头边框 QComboBox border 0px QComboBox down arrow border 0px background
  • 如何在 C# / .NET 中创建内存泄漏[重复]

    这个问题在这里已经有答案了 可能的重复 托管代码中是否可能存在内存泄漏 特别是 C 3 0 https stackoverflow com questions 6436620 is it possible to have a memory
  • VS 程序在调试模式下崩溃,但在发布模式下不崩溃?

    我正在 VS 2012 中运行以下程序来尝试 Thrust 函数查找 include cuda runtime h include device launch parameters h include
  • 为什么这个没有特殊字符的正则表达式会匹配更长的字符串?

    我正在使用此方法来尝试查找匹配项 例如 Regex Match A2 TS OIL TS OIL RegexOptions IgnoreCase Success 我得到了真实的结果 我很困惑 我认为这应该返回 false 因为模式中没有特殊
  • 找不到 assimp-vc140-mt.dll ASSIMP

    我已经从以下位置下载了 Assimp 项目http assimp sourceforge net main downloads html http assimp sourceforge net main downloads html Ass
  • ASP.Net Core 内容配置附件/内联

    我正在从 WebAPI 控制器返回一个文件 Content Disposition 标头值自动设置为 附件 例如 处置 附件 文件名 30956 pdf 文件名 UTF 8 30956 pdf 当它设置为附件时 浏览器将要求保存文件而不是打
  • 动态生成的控件 ID 返回为 NULL

    我可以在 Page PreInit 函数中创建动态控件 如何检索控件及其 ID 我的 C 代码用于创建动态控件之一 var btn new WebForms Button btn Text btn ID Addmore btn Click
  • PHP 的 mb_internal_encoding 实际上是做什么的?

    根据 PHP 网站 http www php net manual en function mb internal encoding php它这样做 coding 是用于 HTTP 输入的字符编码名称 字符编码转换 HTTP输出字符编码 转
  • 类的成员复制

    在学习 复制成员 概念时 书中给出了如下说法 此外 如果非静态成员是引用 const 或没有复制赋值的用户定义类型 则无法生成默认赋值 我不太明白这个声明到底想传达什么 或者说这个说法指的是哪一种场景 谢谢 该语句与编译器自动为您编写的类
  • 单例模式和 std::unique_ptr

    std unique ptr唯一地控制它指向的对象 因此不使用引用计数 单例确保利用引用计数只能创建一个对象 那么会std unique ptr与单例执行相同 单例确保只有一个实例属于一种类型 A unique ptr确保只有一个智能指针到
  • 为什么 set_symmetry_difference 无法与比较器一起使用?

    Example program include
  • 检查 RoutedEvent 是否有任何处理程序

    我有一个自定义 Button 类 当单击它时 打开特定窗口 它总是执行相同的操作 我添加了一个可以在按钮的 XAML 中分配的 Click 事件 就像常规按钮一样 当它被单击时 我想执行 Click 事件处理程序 如果已分配 否则我想执行默
  • 无法在内存位置找到异常源:cudaError_enum

    我正在尝试确定 Microsoft C 异常的来源 test fft exe 中 0x770ab9bc 处的第一次机会异常 Microsoft C 异常 内存位置 0x016cf234 处的 cudaError enum 我的构建环境是 I
  • 运行选定的代码生成器时出错:“未将对象引用设置到对象的实例。”错误?

    我已经尝试了所有解决方案 例如修复 VS 2013 但没有用 当您通过右键单击控制器文件夹来创建控制器并添加控制器时 然后右键单击新创建的控制器的操作并选择添加视图 当我尝试创建视图时 就会发生这种情况 它不是一个新项目 而是一个现有项目
  • 新任务中使用的依赖注入服务

    我在需要时使用依赖项注入来访问我的服务 但我现在想要创建一个并发任务 但这会由于依赖项注入对象及其生命周期而导致问题 我读过这篇文章 标题 防止多线程 Link http mehdi me ambient dbcontext in ef6
  • 如何在 DropDownList 中保留空格 - ASP.net MVC Razor 视图

    我在视图中通过以下方式绑定我的模型 问题是我的项目文本是格式化文本 单词之间有空格 如下所示 123 First 234 00 123 AnotherItem 234 00 123 Second 234 00 我想保留此项目文本中的空格 即
  • 在简单注入器中解析具有自定义参数的类

    我正在使用以下命令创建 WPF MVVM 应用程序简易注射器作为 DI 容器 现在 当我尝试从简单注入器解析视图时遇到一些问题 因为我需要在构造时将参数传递到构造函数中 而不是在将视图注册到容器时 因此这不是适用的 简单注入器将值传递到构造
  • C++0x中disable_if在哪里?

    Boost 两者都有enable if and disable if 但 C 0x 似乎缺少后者 为什么它被排除在外 C 0x 中是否有元编程工具允许我构建disable if按照enable if 哦 我刚刚注意到std enable i
  • ASP.NET Core MVC 视图组件搜索路径

    在此处的文档中 https learn microsoft com en us aspnet core mvc views view components view aspnetcore 2 2 https learn microsoft

随机推荐

  • 《老漏洞复现与分析篇》 - 其一 - shift后门

    引言 因为本菜鸡的博客没什么文章素材 所以想开一个新文章类别 本来想整一个漏洞分析和复现的 无奈由于实力不允许 只能再前面加一个 老 字 整一点多年前的老漏洞拿来复现和分析 俗话说得好 要善于总结前人的经验和智慧 才能在自己的前进道路上走得
  • txpro服务器维护,EFIFieryproServer和EFIFieryXF第7版发布说明

    新型纯软件保护系统 第 7 版不需要 USB 加密狗 而是采用灵活的软件保护 允许终端用户免费从一个 Fiery 到另一个 Fiery 重新托管许可证 第 7 版的重要变化 Fiery XF 服务器 macOS 版已终止 现在的 Fiery
  • Selenium Grid 简易安装--(selenium-server-standalone-*.jar)

    Selenium Grid Selenium Grid允许同时并行地 在不同的环境上运行多个测试任务 这里主要演示一下怎么使用Selenium Grid 准备 1 需要两台机子 2 两台机子分别安装好JDK环境 3 两台机子需要从 http
  • 【C++】矩阵的乘法

    先复习一下矩阵的乘法 已知 求AB 因为矩阵A是2 3矩阵 矩阵B是3 3矩阵 A的列数等于B的行数 所以矩阵A与B可以相乘 乘积AB是一个2 3矩阵 矩阵相乘时需要注意两点 一点是矩阵1的列数要等与矩阵2的行数 一点是矩阵相乘后的矩阵 c
  • Node.js配置别名alias的两种方法

    Node js配置别名alias的两种方法 什么是别名 import xxx from xxx import xxx from xx xx xxx 可以省去 xxx 直接从配置的目录开始找文件 环境准备 Node js 此文章使用v12 1
  • JAVA注释、标识符和变量

    JAVA正确注释和标识符 java的注释 java的注释就是用特殊规定的符号来说明在代码中对代码功能的解释 总共分为三种 1 这个为单行注释 2 这种为多行注释 3 用于文档注释 在类 成员变量以及方法功能的说明上 给与说明 提示功能 ja
  • 适用于windows的ubuntu子系统出现WSL2:Temporary Failure in Name Resolution解决方法

    WSL2 Temporary Failure in Name Resolution In WSL2 run remove existing resolv conf symlink that is pointing to a wrong na
  • ald计算机应用,人工智能可以优化ALD半导体制造工艺

    为了制造计算机芯片 全世界的技术专家都依赖原子层沉积 ALD 法 它可以创造出细到一个原子厚的薄膜 企业通常使用ALD制造半导体设备 但它也应用于太阳能电池 锂电池和其他能源相关领域 今天 制造商越来越多地依靠ALD来制造新型薄膜 但弄清楚
  • 挂机宝和网站服务器,挂机宝SSD硬盘vs普通硬盘访问官网哪个快?

    原标题 挂机宝SSD硬盘vs普通硬盘访问官网哪个快 秒开云硬盘篇 SSD固态硬盘vs机械硬盘 硬盘读写速度越快结构类型 网络服务器中的固态盘 SSD 比SATA磁盘驱动器给予更高的电脑磁盘读 写强度 也称之为键入 导出 I O 性能指标 具
  • 联邦计算在百度观星盘的实践

    导读 本文简短综述联邦计算领域的核心技术点 随着联邦计算在产业界的应用及普及 保护数据隐私与解决数据孤岛 二者可以兼得 为数字广告营销等领域提供了一个全新思路 一 导语 众所周知 数据是AI技术的燃料 更多高质量的数据意味着可以训练出更好性
  • nodejs生成token

    首先安装jsonwebtoken 命令 npm i jsonwebtoken save 代码如下所示 const fs require fs 文件模块 const path require path 路径模块 const jwt requi
  • Spring Cloud配置(四)熔断器

    在Spring Cloud中使用了Hystrix 来实现断路器的功能 Hystrix是Netflix开源的微服务框架套件之一 该框架目标在于通过控制那些访问远程系统 服务和第三方库的节点 从而对延迟和故障提供更强大的容错能力 Hystrix
  • 这些lodash方法真香!!

    前言 Lodash 是一个一致性 模块化 高性能的 JavaScript 实用工具库 Lodash官网 Lodash 通过降低 array number objects string 等等的使用难度从而让 JavaScript 变得更简单
  • Asp.net读取AD域信息的方法<转>

    1 首先新建一个页面 Login aspx 前台代码 Login aspx
  • 怎么解决kafka的数据丢失

    producer端 宏观上看保证数据的可靠安全性 肯定是依据分区数做好数据备份 设立副本数 broker端 topic设置多分区 分区自适应所在机器 为了让各分区均匀分布在所在的broker中 分区数要大于broker数 分区是kafka进
  • 理解gradle和gradlew

    前言 最近在跑grpc官方示例程序的时候 用到了在命令行中使用gradle编译生成代码 对gradle和gradlew做了一些了解 gradle 现在android项目普遍使用androidstudio进行开发 项目的构建和编译都用到了gr
  • MultiValueMap是什么?怎么使用?

    MultiValueMap 可以同一个key下面放多个value 此类来自spring 在spring core里面 代码 public static void main String args MultiValueMap
  • arma模型平稳性和可逆性的条件_时间序列预测模型ARIMA实现

    前段时间整理了一个预测的基本思考框架和常见的方法 其中提到了ARIMA模型 在 大数据预测 那本书里 ARIMA是单独开辟一章讲的 比较复杂和难理解的一个模型 自己最近找了点资料粗浅学习了一下理论 并尝试用Python实现一下 一 时间序列
  • 解决Android Studio运行时报Error:java.lang.NullPointerException (no error message)错误

    今天遇到一个问题 电脑突然关机了 然后重启电脑打开Android studio时 运行程序跑不起来 然后报 Gradle tasks Error Error java lang NullPointerException no error m
  • 【C++】string类的使用

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 目录 一 string 1 string的介绍 2 为什么str