深度剖析C++string(中)

devtools/2024/11/13 8:10:33/

目录

前言

1.string 类对象的部分修改操作

2.其他函数的部分讲解

结束语


前言

上篇博客我们对C++string的定义和一些函数接口做了讲解学习,接下来我们将继续对C++的函数进行学习

1.string 类对象的部分修改操作

函数名称功能说明

push_back    在字符串后尾插字符c              append    在字符串后追加一个字符串

operator+= (重点)在字符串后追加字符串     

void string5() {string s("Hello World");string s1("I love you");s.push_back('c');cout << s << endl;s.append(" and you");//字符串添加cout << s << endl;s1.append(s,6);//添加某字符串第n字符之后到另一字符串cout << s1 << endl;s1.append(5, 't');//添加n个字符cout << s1 << endl;s1.append("you", 2);//添加2个字符yo到s1cout << s1 << endl;string s2("Thanks");//加减字符串和字符s2 += " you";s2 += '!';s2 += s;cout << s2 << endl;}

str c_str(重点)返回C格式字符串   

string str;
str.push_back(' ');   // 在str后插入空格
str.append("hello");  // 在str后追加一个字符"hello"
str += 'w';           // 在str后追加一个字符'b'   
str += "orld";          // 在str后追加一个字符串"it"
cout << str << endl;
cout << str.c_str() << endl;   // 以C语言的方式打印字符串

find + npos(重 点) 从字符串pos位置开始往后找字符c, 返回该字符在字符串中的位置

rfind从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置

void string6() {// 获取file的后缀string file("string.cpp");string s("test.cpp.zip");size_t find1 = s.find('.');size_t find2 = s.rfind('.');cout << find1 << endl;cout << find2 << endl;size_t pos = file.rfind('.');string suffix(file.substr(pos, file.size() - pos));cout << suffix << endl;// npos是string里面的一个静态成员变量// static const size_t npos = -1;
}

 

substr在str中从pos位置开始,截取n个字符,然后将其返回

#include <iostream>
#include <string>
using namespace std;
int main ()
{string str="We think in generalities, but we live in details.";string str2 = str.substr (3,5);     // "think",第三个位置后的五个字符size_t pos = str.find("live");      // position of "live" in strstring str3 = str.substr (pos);     // get from "live" to the endcout << str2 << ' ' << str3 << '\n';return 0;
}

#include <iostream>
#include <string>
using namespace std;
int main ()
{string str ("This is an example sentence.");cout << str << '\n';//删除第10个字符后面8个             str.erase (10,8);                        cout << str << '\n';
// "This is an sentence."str.erase (str.begin()+9);               // 删除指向的字符          ^cout << str << '\n';// "This is a sentence."str.erase (str.begin()+5, str.end()-9);  //      cout << str << '\n';// "This sentence."string s("hello world");                  // 头删s.erase(0, 1);cout << s << endl;s.erase(s.begin());cout << s << endl;// 尾删s.erase(--s.end());cout << s << endl;s.erase(s.size()-1, 1);cout << s << endl;return 0;
}

swap() 函数
- 功能:交换两个字符串的内容。
- 参数:接收两个std::string类型的参数。
- 返回值:无返回值。
`swap()`函数允许交换两个字符串的内容,而不会影响原始字符串。这是一个无返回值的函数,因此不能直接获取交换后的字符串。
 replace() 函数
- 功能:用新的字符串替换字符串中的一个子串。
- 参数:
  - 第一个参数:起始迭代器,指定要替换的子串的起始位置。
  - 第二个参数:结束迭代器,指定要替换的子串的结束位置(不包括结束位置)。
  - 第三个参数:新的字符串,用于替换子串。
  -返回值:返回一个指向替换后的字符串的迭代器。
`replace()`函数允许用一个新的字符串替换字符串中的一个子串。如果新字符串的长度大于或等于旧子串的长度,它会替换整个子串;如果新字符串的长度小于旧子串的长度,它会在旧子串的末尾添加额外的空字符,以保持字符串的长度不变。
 

void string7() {/*string s1("hello world");string s2("I love you");string s3("thank you");s1.swap(s2);cout << s1 << endl;s3.replace(0, s3.size(), "Programming");cout << "After replace: " << s3 << std::endl;*///替换空格为指定字符string s("hello              world and today!");size_t pos = s.find(" ");while (pos != string::npos) {s.replace(pos, 1, "%%");cout << s << endl;pos = s.find(" ", pos + 2);}cout << s << endl;//s.replace(5, 1, "%%");
}
void string8() {string s("hello              world and today!");string temp;temp.reserve(s.size());for (auto ch :s) {if (ch == ' ')temp += "%%";elsetemp += ch;}//cout << temp << endl;s. swap(temp);cout << s << endl;
}

注意:replace参数的设置有很多种,对应了不同实现功能,可以通过上网查询资料进行学习

补充了解

 

查询一段字符中的任意一个字符。

void string9() {string str("Please, replace the vowels in this sentence by asterisks.");/*size_t found = str.find_first_not_of("abcdef");while (found != string::npos) {str[found] = '*';found = str.find_first_not_of("abcdef", found + 1);}cout << str << endl;*/size_t found = str.find_first_of("abcdef");while (found != string::npos) {str[found] = '*';found = str.find_first_of("abcdef", found + 1);}cout << str << endl;
}

abcdef都被替换成*

官网的样例:

2.其他函数的部分讲解

#include <iostream>
#include <string>
using namespace std;
int main(){string s1("hello");string s2("world");s1=s1+s2;cout<<s1<<endl;s1=s1+"and bit";cout<<s1<<endl;return 0;
}

 输入与输出运算符重载

#include <iostream>
#include <string>
using namespace std;
main ()
{string name;cout << "Please, enter your name: ";cin >> name;cout << "Hello, " << name << "!\n";return 0;
}

 请注意,istream 提取操作使用空格作为分隔符;因此,此操作只会从流中提取可被视为单词的内容

即当我们输入的数据有空格时,就相当于结束了,不会输出空格后面的了。

 为了克服这种情况,C++引入了getline函数,可以读取空格。

void string11() {string s;cout << "please enter your name:" << endl;getline(cin, s);cout << "name:" << s << endl;//自己设置终止符string s1;getline(cin, s1, '#');cout << s1 << endl;
}

 

下面是官方的比较运算符的代码

// string comparisons
#include <iostream>
#include <vector>int main ()
{std::string foo = "alpha";std::string bar = "beta";if (foo==bar) std::cout << "foo and bar are equal\n";if (foo!=bar) std::cout << "foo and bar are not equal\n";if (foo< bar) std::cout << "foo is less than bar\n";if (foo> bar) std::cout << "foo is greater than bar\n";if (foo<=bar) std::cout << "foo is less than or equal to bar\n";if (foo>=bar) std::cout << "foo is greater than or equal to bar\n";return 0;
}

 这个操作符大家可以在官网上进行查询了解,我就偷个懒哈哈!!!

结束语

本节内容就到此结束啦,下节我们将对string类的功能进行底层的模拟实现,最后感谢各位友友的支持!!! 


http://www.ppmy.cn/devtools/102265.html

相关文章

Linux 实时调度器:带宽限制

文章目录 1. 前言2. 概念3. 实时进程 的 带宽限制3.1 实时进程 带宽限制 初始化3.2 启动 实时进程 带宽 监测定时器3.3 累加 实时进程 消耗的带宽3.4 查看 实时进程 带宽消耗情况3.5 小结 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的…

配电房挂轨机器人巡检系统的主要优点包括

背景 配电房是724h工作的封闭环境&#xff0c;人工巡检无法在时间上和空间上对配电室进行全量监控。有限的巡检时间&#xff0c;必然带来设备运转的黑盒时间&#xff0c;设备故障和隐患无法及时监控与消缺。因而不可避免存在漏检、误检的情况&#xff0c;不仅容易隐藏电力系统…

探索深度学习的强大工具:PyTorch的torch.utils.data模块

探索深度学习的强大工具&#xff1a;PyTorch的torch.utils.data模块 在深度学习的世界里&#xff0c;数据是模型训练的基石。PyTorch&#xff0c;作为当前最流行的深度学习框架之一&#xff0c;提供了一个强大的torch.utils.data模块&#xff0c;它使得数据加载、处理和迭代变…

Nginx+ModSecurity(3.0.x)安装教程及配置WAF规则文件

本文主要介绍ModSecurity v3.0.x在Nginx环境下的安装、WAF规则文件配置、以及防御效果的验证&#xff0c;因此对于Nginx仅进行简单化安装。 服务器操作系统&#xff1a;linux 位最小化安装 一、安装相关依赖工具 Bash yum install -y git wget epel-release yum install -y g…

【MATLAB学习笔记】绘图——分割绘图背景并填充不同的颜色

目录 前言分割背景函数示例基本绘图分割背景函数的使用保存图片 总代码总结 前言 在MATLAB中&#xff0c;使用窗口对象的Color属性可以轻松地设置不同的背景颜色&#xff0c;但是只能设置一种单一颜色。若需要将绘图背景设置成多种颜色&#xff0c;比如左右两边不同的颜色&…

使用vueuse在组件内复用模板

1. 安装vueusae pnpm i vueuse/core2. 组件内复用模板 createReusableTemplate 是vueuse中的一个实用工具&#xff0c;用于在 Vue 3 中创建可重复使用的模板片段&#xff0c;同时保持状态的独立性。这对于需要在多个组件中重复使用相同的结构和逻辑时非常有用。 因为这些可复…

无人机及固定机巢自动化控制软件技术详解

随着科技的飞速发展&#xff0c;无人机技术已成为众多行业中不可或缺的一部分&#xff0c;特别是在航拍、环境监测、农业植保、应急救援等领域展现出巨大潜力。无人机及固定机巢自动化控制软件作为支撑无人机高效、安全、自主运行的核心&#xff0c;集成了先进的系统架构、飞行…

React 入门第四天:理解React中的路由与导航

在React学习的第四天&#xff0c;我将目光聚焦在React Router上。路由是任何单页应用&#xff08;SPA&#xff09;的核心部分&#xff0c;决定了用户如何在应用中导航&#xff0c;以及不同URL对应的内容如何渲染。通过学习React Router&#xff0c;我体会到了React处理路由的强…