【C++初阶】C++STL详解(一)—— string类(下)

简介: 【C++初阶】C++STL详解(一)—— string类(下)

11.string中运算符的使用

1、operator=

 string类中对=运算符进行了重载,重载后的=运算符支持string类的赋值、字符串的赋值以及字符的赋值。

#include <iostream>
#include <string>
using namespace std;
int main()
{
  string s1;
  string s2("CSDN");
  //支持string类的赋值
  s1 = s2;
  cout << s1 << endl; //CSDN
  //支持字符串的赋值
  s1 = "hello";
  cout << s1 << endl;  //hello
  //支持字符的赋值
  s1 = 'x';
  cout << s1 << endl; //x
  return 0;
}

2、operator+=

 string类中对+=运算符进行了重载,重载后的+=运算符支持string类的复合赋值、字符串的复合赋值以及字符复合的赋值。

#include <iostream>
#include <string>
using namespace std;
int main()
{
  string s1;
  string s2("hello");
  //支持string类的复合赋值
  s1 += s2;
  cout << s1 << endl; //hello
  //支持字符串的复合赋值
  s1 += " CSDN";
  cout << s1 << endl; //hello CSDN
  //支持字符的复合赋值
  s1 += '!';
  cout << s1 << endl; //hello CSDN!
  return 0;
}

其实,operator+=的底层就是调用的push_back和append

3、operator+

string类中对+运算符进行了重载,重载后的+运算符支持以下几种类型的操作:

 string类 + string类

 string类 + 字符串

 字符串 + string类

 string类 + 字符

 字符 + string类

它们相加后均返回一个string类对象。

#include <iostream>
#include <string>
using namespace std;
int main()
{
  string s;
  string s1("super");
  string s2("man");
  char str[] = "woman";
  char ch = '!';
  //string类 + string类
  s = s1 + s2;
  cout << s << endl; //superman
  //string类 + 字符串
  s = s1 + str;
  cout << s << endl; //superwoman
  //字符串 + string类
  s = str + s1;
  cout << s << endl; //womansuper
  //string类 + 字符
  s = s1 + ch;
  cout << s << endl; //super!
  //字符 + string类
  s = ch + s1;
  cout << s << endl; //!super
  return 0;
}

4、operator>> 和 operator<<

 string类中也对>>和<<运算符进行了重载,这就是为什么我们可以直接使用>>和<<对string类进行输入和输出的原因。


istream& operator>> (istream& is, string& str);

ostream& operator<< (ostream& os, const string& str);

#include <iostream>
#include <string>
using namespace std;
int main()
{
  string s;
  cin >> s; //输入
  cout << s << endl; //输出
  return 0;
}

5、!=、<、<=、>等

 string类中还对一系列关系运算符进行了重载,它们分别是==、!=、<、<=、>、>=。重载后的关系运算符支持string类和string类之间的关系比较、string类和字符串之间的关系比较、字符串和string类之间的关系比较。

#include <iostream>
#include <string>
using namespace std;
int main()
{
  string s1("abcd");
  string s2("abde");
  cout << (s1 > s2) << endl; //0
  cout << (s1 < s2) << endl; //1
  cout << (s1 == s2) << endl; //0
  return 0;
}

注意:这些重载的关系比较运算符所比较的都是对应字符的ASCII码值

12.string中与迭代器相关的函数


1、与正向迭代器相关的函数

begin函数:返回一个指向字符串第一个字符的迭代器。

函数原型:

iterator begin();

 const_iterator begin() const;

end函数:返回一个指向字符串结束字符的迭代器,即’\0’。

函数原型:

iterator end();

 const_iterator end() const;

使用示例:

#include <iostream>
#include <string>
using namespace std;
int main()
{
  string s("hello");
  //正向迭代器
  string::iterator it = s.begin();
  while (it != s.end())
  {
    cout << *it;
    it++;
  }
  cout << endl; //hello
  return 0;
}

image.png2、与反向迭代器相关的函数

rbegin函数:返回指向字符串最后一个字符的反向迭代器。

函数原型:

reverse_iterator rbegin();

 const_reverse_iterator rbegin() const;

rend函数:返回指向字符串第一个字符前面的理论元素的反向迭代器。

函数原型:

reverse_iterator rend();

 const_reverse_iterator rend() const;

使用示例:

#include <iostream>
#include <string>
using namespace std;
int main()
{
  string s("hello");
  //反向迭代器
  string::reverse_iterator rit = s.rbegin();
  while (rit != s.rend())
  {
    cout << *rit;
    rit++;
  }
  cout << endl; //olleh
  return 0;
}

f6fc2f619e7c4189b248a6979585dade.png

13.string与字符串之间的转换

1、将字符串转换为string

 将字符串转换为string很简单,在前面讲string的定义方式时就有说到。

#include <iostream>
#include <string>
using namespace std;
int main()
{
  //方式一
  string s1("hello world");
  //方式二
  char str[] = "hello world";
  string s2(str);
  cout << s1 << endl; //hello world
  cout << s2 << endl; //hello world
  return 0;
}

2、使用c_str或data将string转换为字符串

const char* c_str() const;

const char* data() const;

区别:

在C++98中,c_str()返回 const char* 类型,返回的字符串会以空字符结尾。

在C++98中,data()返回 const char* 类型,返回的字符串不以空字符结尾。

但是在C++11版本中,c_str()与data()用法相同。

#include <iostream>
#include <string>
using namespace std;
int main()
{
  string s("hello world ");
  const char* str1 = s.data();
  const char* str2 = s.c_str();
  cout << str1 << endl;
  cout << str2 << endl;
  return 0;
}

兼容C语言,相互配合:f87071df951e485995b7ae74970169a5.pngC语言与C++中字符串读取结束的区别:image.png

14.string中子字符串的提取

1、使用substr函数提取string中的子字符串

string substr (size_t pos = 0, size_t len = npos) const;

#include <iostream>
#include <string>
using namespace std;
int main()
{
  string ur1 = "https://cplusplus.com/reference/string/string/";
  size_t pos1 = ur1.find("://");
  string protocol;//协议
  if (pos1 != string::npos)//找到了
  {
    protocol = ur1.substr(0, pos1);//substr(pos, n)提取pos位置开始的n个字符序列作为返回值
  }
  cout << protocol << endl;
  string domain;//域名
  string uri;//资源名
  size_t pos2 = ur1.find("/", pos1 + 3);
  if (pos1 != string::npos)//找到了
  {
    domain = ur1.substr(pos1 + 3, pos2 - (pos1 + 3));
    uri = ur1.substr(pos2 + 1);
  }
  cout << domain << endl;
  cout << uri << endl;
  return 0;
}

f5c9829688a5445baedbeac53cd7a350.png2、使用copy函数将string的子字符串复制到字符数组中

size_t copy (char* s, size_t len, size_t pos = 0) const;

#include <iostream>
#include <string>
using namespace std;
int main()
{
  string s("abcdef");
  char str[20];
  //copy(str, n, pos)复制pos位置开始的n个字符到str字符串
  size_t length = s.copy(str, 4, 2);
  //copy函数不会在复制内容的末尾附加'\0',需要手动加
  str[length] = '\0';
  cout << str << endl; //dcef
  return 0;
}

15.string中的getline函数

在使用>>进行输入操作时,当>>读取到空格便会停止读取,基于此,我们将不能用>>将一串含有空格的字符串读入到string对象中。

#include <iostream>
#include <string>
using namespace std;
int main()
{
  string s;
  cin >> s; //输入:hello CSDN
  cout << s << endl; //输出:hello
  return 0;
}

这时,我们就需要用getline函数完成一串含有空格的字符串的读取操作了。

用法一:

istream& getline (istream& is, string& str);

getline函数将从is中提取到的字符存储到str中,直到读取到换行符’\n’为止。

#include <iostream>
#include <string>
using namespace std;
int main()
{
  string s;
  getline(cin, s); //输入:hello CSDN
  cout << s << endl; //输出:hello CSDN
  return 0;
}

用法二:

istream& getline (istream& is, string& str, char delim);

getline函数将从is中提取到的字符存储到str中,直到读取到分隔符delim或换行符’\n’为止。

#include <iostream>
#include <string>
using namespace std;
int main()
{
  string s;
  getline(cin, s, 'D'); //输入:hello CSDN
  cout << s << endl; //输出:hello CS
  return 0;
}

16.总结:

今天我们认识并具体学习了STL中string类,开启了STL学习的大门。接下来,我们将进行STL中string类的模拟实现。希望我的文章和讲解能对大家的学习提供一些帮助。

当然,本文仍有许多不足之处,欢迎各位小伙伴们随时私信交流、批评指正!我们下期见~

c3ad96b16d2e46119dd2b9357f295e3f.jpg

相关文章
|
18天前
|
API 索引
String类下常用API
String类下常用API
31 1
|
18天前
for循环和String类下方法的一个练习题
for循环和String类下方法的一个练习题
42 1
|
20天前
|
Java API 索引
【Java基础面试二十四】、String类有哪些方法?
这篇文章列举了Java中String类的常用方法,如`charAt()`、`substring()`、`split()`、`trim()`、`indexOf()`、`lastIndexOf()`、`startsWith()`、`endsWith()`、`toUpperCase()`、`toLowerCase()`、`replaceFirst()`和`replaceAll()`,并建议面试时展示对这些方法的熟悉度,同时深入理解部分方法的源码实现。
【Java基础面试二十四】、String类有哪些方法?
|
12天前
|
编译器 C++ 容器
【C++】String常见函数用法
【C++】String常见函数用法
12 1
|
12天前
|
存储 算法 编译器
[C++] STL简介
[C++] STL简介
10 1
|
18天前
|
存储 算法 C++
C++ STL应用宝典:高效处理数据的艺术与实战技巧大揭秘!
【8月更文挑战第22天】C++ STL(标准模板库)是一组高效的数据结构与算法集合,极大提升编程效率与代码可读性。它包括容器、迭代器、算法等组件。例如,统计文本中单词频率可用`std::map`和`std::ifstream`实现;对数据排序及找极值则可通过`std::vector`结合`std::sort`、`std::min/max_element`完成;而快速查找字符串则适合使用`std::set`配合其内置的`find`方法。这些示例展示了STL的强大功能,有助于编写简洁高效的代码。
29 2
|
19天前
|
存储 SQL Java
Java 系类之 Java StringBuffer类详解
这篇文章详细介绍了Java中的StringBuffer类的使用,包括其构造方法、追加字符串、替换字符、反转字符串和删除字符串的方法,并提供了相应的示例代码。
|
19天前
|
安全 Java API
Java系类 之 String、StringBuffer和StringBuilder类的区别
这篇文章讨论了Java中`String`、`StringBuffer`和`StringBuilder`三个类的区别,其中`String`是不可变的,而`StringBuffer`是线程安全的可变字符串类,`StringBuilder`是非线程安全的可变字符串类,通常在单线程环境下性能更优。
Java系类 之 String、StringBuffer和StringBuilder类的区别
|
5天前
|
存储 C++
C++(五)String 字符串类
本文档详细介绍了C++中的`string`类,包括定义、初始化、字符串比较及数值与字符串之间的转换方法。`string`类简化了字符串处理,提供了丰富的功能如字符串查找、比较、拼接和替换等。文档通过示例代码展示了如何使用这些功能,并介绍了如何将数值转换为字符串以及反之亦然的方法。此外,还展示了如何使用`string`数组存储和遍历多个字符串。
|
12天前
|
缓存 安全 Java
Java String类
Java String类
12 0