【C++】string类的使用③(修改器Modifiers || 非成员函数重载Non-member function overloads)

news2024/11/19 22:40:02

在这里插入图片描述

🔥个人主页: Forcible Bug Maker
🔥专栏: STL || C++

目录

  • 前言
  • 🔥修改器(Modifiers)
    • ==**operator+=**==
    • ==append==
    • ==push_back和pop_back==
    • ==assign==
    • ==insert==
    • ==erase==
    • ==replace==
    • ==swap==
  • 🔥非成员函数重载(Non-member function overloads)
    • ==operator+==
    • ==relation operators(string)==
    • ==swap(string)==
    • ==流插入和流提取重载==
    • ==getline==
  • 结语

前言

本篇博客主要内容:STL库中string的修改器(Modifiers)和非成员函数重载(Non-member function overloads)

来到string类的使用第三篇,继续我们的内容,本篇博客将介绍如何使用STL库中string的成员函数修改串,以及重载给string的几个非成员函数。

🔥修改器(Modifiers)

在这里插入图片描述
顾名思义,就是一批能改动string串中内容的成员函数。

operator+=

这是一个成员函数的运算符重载。
在这里插入图片描述

简单说就是在串的末尾追加字符或字符串。

(1) string string对象
string& operator+= (const string& str);
(2) c-string 字符串指针
string& operator+= (const char* s);
(3) character 字符
string& operator+= (char c);
以上三个重载的功能用一句话概括:在当前string串的末尾追加字符或字符串

共同的返回值:当前对象的引用(string&)

使用样例:

// string::operator+=
#include <iostream>
#include <string>
using namespace std;
int main()
{
	string name("John");
	string family("Smith");
	name += " K. ";         // c-string
	name += family;         // string
	name += '\n';           // character

	cout << name;
	return 0;
}

在这里插入图片描述

append

在这里插入图片描述

append的功能和操作符重载的+=类似,也是在串的末尾追加内容,不过append提供的重载更多,追加字符或字符串的方式也更多。

(1) string
string& append (const string& str);
在string对象串的末尾追加str串的拷贝
(2) substring
string& append (const string& str, size_t subpos, size_t sublen);
在string对象串的末尾追加一个str的子串,这个子串从str下标位置subpos开始取,取sublen个字符(如果sublen过大超出str串的范围,则取到str的末尾)
(3) c-string
string& append (const char* s);
在string对象串的末尾追加s指向的以’\0’字符结尾的字符串的拷贝
(4) buffer
string& append (const char* s, size_t n);
在string对象串的末尾追加s指向的前n个字符的拷贝
(5) fill
string& append (size_t n, char c);
在string对象串的末尾追加n个char类型的c字符
(6) range
template <class InputIterator>
string& append (InputIterator first, InputIterator last);
在string对象串的末尾按顺序追加迭代器区间[first,last)之间指向的字符序列

共同的返回值:当前对象的引用(string&)

使用案例:

// appending to string
#include <iostream>
#include <string>
using namespace std;
int main()
{
	string str;
	string str2 = "Writing ";
	string str3 = "print 10 and then 5 more";

	// used in the same order as described above:
	str.append(str2);                       // "Writing "
	str.append(str3, 6, 3);                   // "10 "
	str.append("dots are cool", 5);          // "dots "
	str.append("here: ");                   // "here: "
	str.append(10, '.');                    // ".........."
	str.append(str3.begin() + 8, str3.end());  // " and then 5 more"

	cout << str << endl;
	return 0;
}

在这里插入图片描述

push_back和pop_back

在这里插入图片描述
void push_back (char c);
在string对象串的末尾追加一个char类型的字符c
无返回值。
在这里插入图片描述
void pop_back();
在string对象串的末尾删除一个字符
无返回值和参数。

使用案例:

#include <iostream>
#include <string>
using namespace std;
int main()
{
	string str("hello world");
	str.push_back('!');
	cout << str << endl;

	str.pop_back();
	cout << str << endl;
	return 0;
}

在这里插入图片描述

assign

在这里插入图片描述

大体功能是给当前串赋新值,将原来的内容覆盖。

(1) string
string& assign (const string& str);
拷贝str
(2) substring
string& assign (const string& str, size_t subpos, size_t sublen);
拷贝str从下标subpos开始的sublen个字符(如果sublen过大超出str串的范围,则取到str的末尾)
(3) c-string
string& assign (const char* s);
拷贝s指向的以’\0’字符结尾的字符串
(4) buffer
string& assign (const char* s, size_t n);
拷贝s指向的前n个字符
(5) fill
string& assign (size_t n, char c);
拷贝n个字符c组成的字符串
(6) range
template <class InputIterator>
string& assign (InputIterator first, InputIterator last);
按顺序拷贝迭代器区间[first,last)内的字符序列

使用案例:

// string::assign
#include <iostream>
#include <string>
using namespace std;
int main()
{
	string str;
	string base = "The quick brown fox jumps over a lazy dog.";

	// used in the same order as described above:

	str.assign(base);
	cout << str << endl;

	str.assign(base, 10, 9);
	cout << str << endl;         // "brown fox"

	str.assign("pangrams are cool", 7);
	cout << str << endl;         // "pangram"

	str.assign("c-string");
	cout << str << endl;         // "c-string"

	str.assign(10, '*');
	cout << str << endl;         // "**********"
	
	str.assign(base.begin() + 16, base.end() - 12);
	cout << str << endl;         // "fox jumps over"

	return 0;
}

在这里插入图片描述

insert

在这里插入图片描述

大体功能是往串中插入字符或字符串

(1) string
string& insert (size_t pos, const string& str);
在pos位置之前插入str串的拷贝
(2) substring
string& insert (size_t pos, const string& str, size_t subpos, size_t sublen);
在pos位置之前插入str的子串的拷贝(由subpos开始,取sublen个字符组成的字符串。如果sublen过大超出str串的范围,则取到str的末尾)
(3) c-string
string& insert (size_t pos, const char* s);
在pos位置前插入s指向(由’\0’字符结尾)的字符串的拷贝
(4) buffer
string& insert (size_t pos, const char* s, size_t n);
在pos位置前插入s指向的前n个字符组成字符串的拷贝
(5) fill
string& insert(size_t pos,size_t n,char c);
void insert (iterator p,size_t n,char c);
在pos位置前(或迭代器p指向位置前,此时无返回值)插入n个char类型的c字符
(6) single character
iterator insert (iterator p, char c);
迭代器p指向位置前插入一个char类型的c字符
(7) range
template <class InputIterator>
void insert (iterator p, InputIterator first, InputIterator last);
迭代器p指向的位置前按顺序插入迭代器区间[first,last)内的字符序列

使用样例:

// inserting into a string
#include <iostream>
#include <string>
using namespace std;
int main()
{
	string str = "to be question";
	string str2 = "the ";
	string str3 = "or not to be";
	string::iterator it;

	// used in the same order as described above:
	str.insert(6, str2);                 // to be (the )question
	str.insert(6, str3, 3, 4);             // to be (not )the question
	str.insert(10, "that is cool", 8);    // to be not (that is )the question
	str.insert(10, "to be ");            // to be not (to be )that is the question
	str.insert(15, 1, ':');               // to be not to be(:) that is the question
	it = str.insert(str.begin() + 5, ','); // to be(,) not to be: that is the question
	str.insert(str.end(), 3, '.');       // to be, not to be: that is the question(...)
	str.insert(it + 2, str3.begin(), str3.begin() + 3); // (or )

	cout << str << endl;
	return 0;
}

在这里插入图片描述

erase

在这里插入图片描述

将串中指定内容删除,使串的长度减少

(1) sequence
string& erase (size_t pos = 0, size_t len = npos);
将从pos开始的len个长度的字符删除(如果len过大超出串的范围或未提供第二个参数,则删到str的末尾)
(2) character
iterator erase (iterator p);
删除迭代器p指向的一个字符
(3) range
iterator erase (iterator first, iterator last);
删除迭代器区间[first,last)之间的元素

注:除了第一个返回当前对象,其他两个的返回值为第一个被删除字符位置的迭代器,如果此时这个位置没有字符,则返回指向末尾的迭代器string::end。

使用案例:

// string::erase
#include <iostream>
#include <string>
using namespace std;
int main()
{
    std::string str("This is an example sentence.");
    cout << str << '\n'; 
                                             // "This is an example sentence."
    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."
    return 0;
}

在这里插入图片描述

replace

在这里插入图片描述

函数大体功能是将当前对象串中的一段字符串或字符用另一段字符串或字符替换。

(1) string
string& replace (size_t pos, size_t len, const string& str);
string& replace (iterator i1, iterator i2, const string& str);
将当前对象相应位置替换为str
(2) substring
string& replace (size_t pos, size_t len, const string& str, size_t subpos, size_t sublen);
将当前对象相应位置替换为str对象由subpos位置开始,跨越sublen的子串(如果len过大超出串的范围,则取到str的末尾)
(3) c-string
string& replace (size_t pos, size_t len, const char* s);
string& replace (iterator i1, iterator i2, const char* s);
将当前对象相应位置替换为s指向(由’\0’字符结尾)的字符串
(4) buffer
string& replace (size_t pos, size_t len, const char* s, size_t n);
string& replace (iterator i1, iterator i2, const char* s, size_t n);
将当前对象相应位置替换为s指向的前n个字符组成字符串
(5) fill
string& replace (size_t pos, size_t len, size_t n, char c);
string& replace (iterator i1, iterator i2, size_t n, char c);
将当前对象相应位置替换为n个char类型的c字符
(6) range
template <class InputIterator>
string& replace (iterator i1, iterator i2, InputIterator first, InputIterator last);
将当前对象相应位置替换为迭代器区间[first,last)内的字符序列*。

使用案例:

// replacing in a string
#include <iostream>
#include <string>
using namespace std;
int main()
{
	string base = "this is a test string.";
	string str2 = "n example";
	string str3 = "sample phrase";
	string str4 = "useful.";

	// replace signatures used in the same order as described above:

	// Using positions:                 0123456789*123456789*12345
	string str = base;           // "this is a test string."
	str.replace(9, 5, str2);          // "this is an example string." (1)
	str.replace(19, 6, str3, 7, 6);     // "this is an example phrase." (2)
	str.replace(8, 10, "just a");     // "this is just a phrase."     (3)
	str.replace(8, 6, "a shorty", 7);  // "this is a short phrase."    (4)
	str.replace(22, 1, 3, '!');        // "this is a short phrase!!!"  (5)

	// Using iterators:                                               0123456789*123456789*
	str.replace(str.begin(), str.end() - 3, str3);                    // "sample phrase!!!"      (1)
	str.replace(str.begin(), str.begin() + 6, "replace");             // "replace phrase!!!"     (3)
	str.replace(str.begin() + 8, str.begin() + 14, "is coolness", 7);    // "replace is cool!!!"    (4)
	str.replace(str.begin() + 12, str.end() - 4, 4, 'o');                // "replace is cooool!!!"  (5)
	str.replace(str.begin() + 11, str.end(), str4.begin(), str4.end());// "replace is useful."    (6)
	cout << str << '\n';
	return 0;
}

在这里插入图片描述

swap

在这里插入图片描述
void swap (string& str);
交换两个string对象的内容

使用案例:

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string str1("hello");
	string str2("world");
	cout << str1 << endl;
	cout << str2 << endl;

	str1.swap(str2);

	cout << endl;
	cout << str1 << endl;
	cout << str2 << endl;
	return 0;
}

在这里插入图片描述

注:此函数比algorithm提供的swap交换更优,是string交换的最优方式。故交换string对象时尽量使用此方法。

🔥非成员函数重载(Non-member function overloads)

在这里插入图片描述

非成员函数重载,是作为string类的友元函数,在类的外面定义和实现,通过类型来匹配非成员函数。

operator+

在这里插入图片描述
这里其实不用过多赘述,六个重载实现了string对象相加的功能(string对象+字符串,string对象+字符,字符串+string对象,字符+string对象,string对象+string对象)。

注:没有 -> 字符串+字符串

代码案例:

// concatenating strings
#include <iostream>
#include <string>
using namespace std;
int main()
{
	string firstlevel("com");
	string secondlevel("cplusplus");
	string scheme("http://");
	string hostname;
	string url;

	hostname = "www." + secondlevel + '.' + firstlevel;
	url = scheme + hostname;

	cout << url << '\n';
	return 0;
}

在这里插入图片描述

relation operators(string)

在这里插入图片描述

重载了string对象之间进行比较大小的功能,比较规则就是字典序。

代码案例:

// string comparisons
#include <iostream>
#include <vector>
using namespace std;
int main()
{
	string foo = "alpha";
	string bar = "beta";

	if (foo == bar) cout << "foo and bar are equal\n";
	if (foo != bar) cout << "foo and bar are not equal\n";
	if (foo < bar) cout << "foo is less than bar\n";
	if (foo > bar) cout << "foo is greater than bar\n";
	if (foo <= bar) cout << "foo is less than or equal to bar\n";
	if (foo >= bar) cout << "foo is greater than or equal to bar\n";

	return 0;
}

在这里插入图片描述

swap(string)

在这里插入图片描述
交换strirng对象

代码案例:

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string str1("hello");
	string str2("world");
	cout << str1 << endl;
	cout << str2 << endl;

	swap(str1, str2);

	cout << endl;
	cout << str1 << endl;
	cout << str2 << endl;
	return 0;
}

在这里插入图片描述

此非成员函数也可以实现string对象的交换,但是这个实现与重载在string类中的不同,string对象在交换串的时候是改变指针指向交换的。而这里的swap是使用tmp存储临时对象的方式实现交换,增大了内存开销。

流插入和流提取重载

在这里插入图片描述
控制台输入将内容读取到string对象中
在这里插入图片描述
将内容输入到控制台

使用案例:

// inserting strings into output streams
#include <iostream>
#include <string>
using namespace std;
int main()
{
	string str;
	cin >> str;
	cout << str << '\n';
	return 0;
}

在这里插入图片描述

注:cin的读入是按照空格和换行进行分隔的,当你输入hello world时,使用上面的cin只能读取到hello。
如下:
在这里插入图片描述
当面对这种情况时,就需要我们的getline出手了。

getline

在这里插入图片描述

功能和cin相同,但可以通过此函数更改字符串读取时的分隔方式。

(1)
istream& getline (istream& is, string& str, char delim);
当你传第三个参数时,调用此函数,会以delim为分隔符进行分隔
(2)
istream& getline (istream& is, string& str);
当不传第三个参数,会默认以’\n’为分隔符

使用案例:

// extract to string
#include <iostream>
#include <string>
using namespace std;
int main()
{
	string name;

	cout << "Please, enter your full name: ";
	getline(cin, name);
	cout << "Hello, " << name << "!\n";

	return 0;
}

在这里插入图片描述

结语

本篇博客,介绍了关于string的修改器,能修改string串中的内容;以及非成员函数的重载,实现了一些成员函数无法完成的功能和任务
博主会继续分享关于string类的使用以及STL更多的内容,感谢大家的支持。♥

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

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

相关文章

10 | 如何使用异步设计提升系统性能?

异步设计如何提升系统性能? 同步实现的性能瓶颈 Transfer(accountFrom, accountTo, amount) {// 先从 accountFrom 的账户中减去相应的钱数Add(accountFrom, -1 * amount)// 再把减去的钱数加到 accountTo 的账户中Add

ICode国际青少年编程竞赛- Python-5级训练场-多参数函数

ICode国际青少年编程竞赛- Python-5级训练场-多参数函数 1、 def go(a, b):Spaceship.step(2)Dev.step(a)Spaceship.step(b)Dev.turnRight()Dev.step(b)Dev.turnLeft()Dev.step(-a) Dev.turnLeft() Dev.step(3) Dev.step(-3) go(3, 2) go(6, 1) go(5, 2) go(4, 3)2、 def go(…

学习神经网络基础架构

今日学习了解了常见的几种神经网络基础架构。 1.卷积神经网络 卷积神经网络CNN是一种人工神经网络&#xff0c;旨在处理和分析具有网格状拓扑结构的数据&#xff0c;如图像和视频。将 CNN 想象成一个多层过滤器&#xff0c;可处理图像以提取有意义的特征并进行推理预测。 想…

谷歌邮箱2024最新注册教程

大家好&#xff0c;我是蓝胖子&#xff0c;今天教大家如何注册谷歌邮箱 谷歌邮箱的注册后面的用途会经常用得到 首先&#xff0c;需要魔法自行解决 第一步&#xff1a;打开谷歌官网 www.google.com 确保谷歌官网能正常打开 第二步&#xff1a;创建账号 接下来可能会遇到这…

如何写好设计文档

一、明确目的 在编写设计文档之前&#xff0c;首先要明确为什么需要写这份文档。设计文档是软件开发过程中的重要沟通工具&#xff0c;它有助于确保团队成员对项目有共同的理解&#xff0c;促进协作&#xff0c;便于变更管理&#xff0c;并提供历史记录。 二、编写方法 为目…

springboot月度员工绩效考核管理系统

摘要 本月度员工绩效考核管理系统采用java语言做为代码编写工具&#xff0c;采用mysql数据库进行系统中信息的存储与处理。框架采用springboot。 本系统的功能分为管理员和员工两个角色&#xff0c;管理员的功能有&#xff1a; &#xff08;1&#xff09;个人中心管理功能&am…

SQL高级语句

主知识点八&#xff1a;窗口函数 新开窗口&#xff0c;不影响原数据的排序。且子句必须有order by。窗口结果返回到 且窗口函数必须写在select后面&#xff01; ● 【排序窗口函数】 ● rank()over()——1,1,3,4 ● dense_rank()over()——1,1,2,3 ● row_number(…

macOS Sonoma 14.5(23F79)发布

系统介绍 黑果魏叔5 月 14 日快报&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 14.5 正式版更新&#xff08;内部版本号&#xff1a;23F79 同 RC&#xff09;。这是去年 9 月发布的 macOS Sonoma 操作系统的第五次更新&#xff0c;距离上一次的 macOS Sonoma 14.4 更新已…

从CSDN搬家到微信公众号

博主将会在微信公众号里不断输出精品内容&#xff0c;陪伴大家共同成长。 如果你对博主的经历感兴趣&#xff0c;或者对博主的IT技术感兴趣&#xff0c;欢迎关注我的微信公众号&#xff0c;阅读我的技术文章&#xff0c;免费获取各种IT资源。也可以加我的微信成为我的好友&…

性能测试学习二

瓶颈的精准判断 TPS曲线 tps图 响应时间图 拐点在哪里呢? 这是一个阶梯式增加的场景,拐点在第二个压力阶梯上就出现了,因为响应时间增加了,tps增加的却不多,在第三个阶段时,tps增加的就更少了,响应时间也在不断增加,所以性能瓶颈在加剧,越往后越明显【tps的增长,…

线程纵横:C++并发编程的深度解析与实践

hello &#xff01;大家好呀&#xff01; 欢迎大家来到我的Linux高性能服务器编程系列之《线程纵横&#xff1a;C并发编程的深度解析与实践》&#xff0c;在这篇文章中&#xff0c;你将会学习到C新特性&#xff0c;并发编程&#xff0c;以及其如何带来的高性能的魅力&#xff0…

汇聚荣电商:拼多多开店需要多少费用?

想要在拼多多这个巨大的电商平台上开一家属于自己的店铺&#xff0c;很多创业者都会关心一个问题&#xff1a;开店需要多少费用?答案并不复杂&#xff0c;但背后的经营哲学和策略却值得深究。接下来&#xff0c;让我们从四个不同的方面来详细探讨这个问题。 一、开店成本分析 …

JSON在线解析及格式化验证 - JSON.cn网站

JSON在线解析及格式化验证 - JSON.cn https://www.json.cn/

Context Pattern上下文模式

使用情景 全局使用的配置&#xff0c;数据库的连接。MVC中的跨层数据传输携带请求ID&#xff0c;用户信息等用户权限信息线程上下文 跨层数据共享 统一调用参数 携带多个事务需要处理的对象 携带用户信息 使用ThreadLocal

【哔哩哔哩下载】Bilidown,B站下载工具网站,永久免费使用NO.98

本文一共:448 个字,需要阅读:2 分钟,更新时间:2024年5 月14日,部分内容具有时效性,如有失效请留言,阅读量:0 输入B站视频网址就可以下载了 除了可以下载视频&#xff0c;还能获取弹幕、查看封面&#xff0c;如果你想解锁1080P画质&#xff0c;就需要扫码登录。 点击右下角的齿…

【JavaWeb】Day77.Spring——SpringBoot原理(一)

SpringBoot原理 Spring是目前世界上最流行的Java框架&#xff0c;它可以帮助我们更加快速、更加容易的来构建Java项目。而在Spring家族当中提供了很多优秀的框架&#xff0c;而所有的框架都是基于一个基础框架的SpringFramework(也就是Spring框架)。而如果我们直接基于Spring框…

我和jetson-Nano的故事(10)——安装OpenCV3.2.0

1. 仓库地址 opencv https://opencv.org/releases/page/6/opencv_contrib https://github.com/opencv/opencv_contrib/tree/3.2.0 2. cmake-gui安装 安装指令 sudo apt-get install cmake-qt-gui如果安装过程中入到下面的问题 可以按照以下方法解决 sudo apt --fix-broke…

全方位入门git-慕课网 笔记

目录 【上传github忽略某些文件】【配置用户名和邮箱】【想要删除不需要的文件时如何进行操作】【想要给文件重命名如何操作】【想要移动文件到其他位置时如何操作】【文件有变化时&#xff0c;如何查看前后变化】【操作失误的情况下如何实现一键还原】【不再追踪时如何实现撤销…

css如何实现边框模糊的效果

其实并不难&#xff0c;用属性 filter: blur(数字px); 即可。效果如下&#xff1a; 图上的圆形内有色彩的渐变&#xff0c;同样也是用filter: blur(数字px); 实现的&#xff0c;代码如下&#xff1a;、 <template><div id"root" :style"{}">…

MM模块学习二 (供应商,物料后台相关配置)

公司代码配置 新建条目&#xff08;只是建了一个名字出来&#xff0c;后面很多表都是没有得&#xff09; 接下来定义公司代码&#xff1a; 公司代码复制完成&#xff08;后续修改交给财务顾问去做&#xff09; 复制工厂&#xff1a; 复制工厂完成&#xff1a; 修改复制过去的工…