博客主页:【夜泉_ly】
本文专栏:【C++】
欢迎点赞👍收藏⭐关注❤️
文章目录
- 💡前言
- 💡非成员函数
- 1.operator+
- 1.1函数原型
- 1.2使用
- 1.3注意
- 2.relational operators
- 3.swap
- 4.operator>>
- 5.operator<<
- 6.operator<<
- 💡转换
- 1.sto...
- 2.to_string
💡前言
在这篇文章中,我将继续简单探讨 C++
中 string
的基本用法。写这篇文章的主要目的是帮助我巩固所学的知识,同时也便于未来的复习和参考。
如果你想大致的了解 string
的基本用法,也可以留下来看看。
对于那些希望深入学习更多细节的读者,可以去看看这个网站:cplusplus.com,以获取更全面的参考资料。
💡非成员函数
1.operator+
1.1函数原型
string operator+ (const string& lhs, const string& rhs);
string operator+ (const string& lhs, const char* rhs);
string operator+ (const char* lhs, const string& rhs);
string operator+ (const string& lhs, char rhs);
string operator+ (char lhs, const string& rhs);
1.2使用
可以将一个 字符串 和 一个 字符串/字符数组/字符 拼成一个字符串。
例如:
void Test()
{
string str("Hello World!");
string str1 = str.substr(0, str.find(' ')) + str.substr(str.find(' ') + 1); // HelloWorld!
string str2 = str1 + "!"; // HelloWorld!!
string str3 = str2 + '!'; // HelloWorld!!!
cout << str1 << endl;
cout << str2 << endl;
cout << str3 << endl;
}
Output :
HelloWorld!
HelloWorld!!
HelloWorld!!!
1.3注意
未定义行为也是有的:
void Test()
{
string str("HelloWorld!");
char ch[3] = { '6','6','6' }; // 未以'\0'结尾的字符数组
string str4 = str1 + ch;
cout << str4 << endl;
}
2.relational operators
关系运算符重载:
注,这些函数底层调用的都是string::compare
。
如,operator<
:
再比如operator>=
:(先调operator<
,再调compare
)
3.swap
这个函数提供了一种高效的方式来交换字符串对象的内容,通过优化内部数据的所有权转移,减少了不必要的内存操作,使得交换操作更为高效。
-
交换字符串的值:
- 该函数的主要功能是交换两个字符串对象的值。调用此函数后,原来在 x 中的字符串值将转移到 y 中,反之亦然。
-
重载的
swap
函数:swap
是一个常见的算法,通常用于交换两个变量的值。这里提到的重载意味着这个函数的实现可能针对字符串对象进行了优化,使得它能更高效地进行值的交换。
-
性能优化:
- 通过交换字符串的内部数据的所有权,而不是逐字符复制,函数能显著提高性能。这种方法称为“移动语义”(
move semantics
),允许两个字符串对象仅仅交换它们的数据引用,而不是复制所有的字符数据。这样做的好处是减少了内存的使用和时间开销。
- 通过交换字符串的内部数据的所有权,而不是逐字符复制,函数能显著提高性能。这种方法称为“移动语义”(
-
行为类似于
x.swap(y)
:- 这个函数的行为类似于直接调用
x.swap(y)
,这意味着在使用该函数后,两个字符串的内容将被有效交换,而不涉及实际的数据复制,从而进一步提高效率。
- 这个函数的行为类似于直接调用
4.operator>>
这个函数通过重载操作符 >>
提供了一种简洁的方式,从输入流中提取字符串对象的内容。它使得字符串的输入变得直观,并且通过动态添加字符来构建字符串。同时,注意到提取操作的限制是只能提取单个单词,这在处理输入时需要加以考虑。
-
提取字符串:
- 该函数的作用是从输入流中提取字符,并将这些字符存储到一个字符串对象中。提取时,之前字符串中的内容会被新的字符序列替换。
-
重载操作符
>>
:- 在 C++ 中,操作符
>>
通常用于从输入流中读取数据。通过重载该操作符,字符串对象可以使用>>
来接收输入,方便用户从流中读取字符串内容。
- 在 C++ 中,操作符
-
字符追加:
- 每当从流中提取一个字符时,都会使用
push_back
方法将该字符追加到字符串对象中。这意味着字符串对象会动态地增长以容纳新字符。
- 每当从流中提取一个字符时,都会使用
-
使用空白字符作为分隔符:
- 输入流的提取操作默认使用空白字符(如空格、制表符和换行符)作为分隔符,这意味着该操作仅提取一个“单词”。如果用户希望读取整行文本,可以使用
getline
函数,这样可以读取到包括空格在内的整行内容。
- 输入流的提取操作默认使用空白字符(如空格、制表符和换行符)作为分隔符,这意味着该操作仅提取一个“单词”。如果用户希望读取整行文本,可以使用
5.operator<<
这个函数通过重载操作符 <<
提供了一种简单而直观的方式,将字符串对象的内容插入到输出流中。这种方式增强了字符串对象的可用性,使得它们可以与流操作(如打印到控制台或写入文件)无缝配合。
-
插入字符串:
- 该函数的作用是将一个字符串对象的内容(即字符序列)插入到输出流中,例如标准输出流
std::cout
或文件输出流。
- 该函数的作用是将一个字符串对象的内容(即字符序列)插入到输出流中,例如标准输出流
-
重载操作符
<<
:- 在 C++ 中,操作符
<<
通常用于将数据输出到流中。通过重载该操作符,字符串对象可以像基本数据类型(如整数或浮点数)一样,方便地使用<<
进行输出。
- 在 C++ 中,操作符
-
与 C 字符串的相似性:
- 该重载的实现模仿了
ostream::operator<<
在处理 C 风格字符串(即以 null 结尾的字符数组)时的行为。这意味着用户在使用<<
操作符输出字符串对象时,不需要进行额外的转换,使用起来非常简便。 - 需注意的是,与直接处理C风格的字符串还是有点区别的,比如这里不会遇到’\0’就停止:
Output :string str("Hello"); str+='\0'; str+="World"; cout << str << endl;
HelloWorld
- 该重载的实现模仿了
6.operator<<
可以读空白字符!
这个函数提供了一种方便的方式,从输入流中提取一行字符并将其存储到字符串对象中。通过处理分隔符和确保安全提取,它增强了字符串的输入能力,使得读取用户输入或文件内容变得更加灵活。
-
提取一行字符:
- 该函数的主要作用是从输入流中提取字符,直到遇到指定的分隔符或换行符,将提取的字符存储到字符串中。
-
处理结束条件:
- 提取操作会在达到流的末尾(EOF)时停止,也会在输入过程中出现任何错误时停止。这种安全性确保了程序的健壮性。
-
分隔符的处理:
- 如果在提取过程中遇到了指定的分隔符,该分隔符会被提取并丢弃,这意味着它不会被存储到字符串中,下一次的输入操作将会在分隔符之后开始。
-
替换现有内容:
- 在调用该函数之前,字符串
str
中的内容会被新提取的字符序列替换,这使得str
始终保存最新的提取结果。
- 在调用该函数之前,字符串
-
字符追加:
- 每个提取的字符会通过调用
push_back
方法被追加到字符串对象中,这样可以动态地构建字符串。
- 每个提取的字符会通过调用
💡转换
string
类提供了一系列函数进行类型转换。
1.sto…
用于将字符串转换为数字类型,涵盖了多种整数和浮点数类型。
-
int stoi (const string& str, size_t* idx = 0, int base = 10);
- 将字符串
str
转换为int
类型。 idx
是可选参数,用于指向转换后未处理部分的索引。base
指定转换的进制,默认为十进制(10)。
- 将字符串
-
long stol (const string& str, size_t* idx = 0, int base = 10);
- 将字符串
str
转换为long
类型。 - 与
stoi
相似,支持进制和未处理部分的索引。
- 将字符串
-
unsigned long stoul (const string& str, size_t* idx = 0, int base = 10);
- 将字符串
str
转换为无符号长整型unsigned long
。
- 将字符串
-
long long stoll (const string& str, size_t* idx = 0, int base = 10); unsigned long long stoull (const string& str, size_t* idx = 0, int base = 10); float stof (const string& str, size_t* idx = 0); double stod (const string& str, size_t* idx = 0); long double stold (const string& str, size_t* idx = 0);
- 这几个与上面类似。
在使用这些函数时,应确保输入字符串的格式正确,否则可能会抛出异常或返回不确定的值。
2.to_string
to_string
函数用于将各种基本数据类型转换为 string
类型,具体函数如下:
- string to_string(int val);
- string to_string(long val);
- string to_string(long long val);
- string to_string(unsigned val);
- string to_string(unsigned long val);
- string to_string(unsigned long long val);
- string to_string(float val);
- string to_string(double val);
- string to_string(long double val);
希望本篇文章对你有所帮助!并激发你进一步探索编程的兴趣!
本人仅是个C语言初学者,如果你有任何疑问或建议,欢迎随时留言讨论!让我们一起学习,共同进步!