📌  相关文章
📜  std :: C++中的字符串类(1)

📅  最后修改于: 2023-12-03 15:20:20.875000             🧑  作者: Mango

字符串类(String Class)在C++标准库的使用介绍

1. 为什么要引入字符串类?

在C++中,字符串是一个非常常用的数据类型,但是C++中的字符串处理并不是非常方便,需要手动维护字符串的长度、分配空间等等。为了简化字符串操作,C++标准库中引入了字符串类,也就是std::string。使用字符串类可以方便的处理字符串的长度,可以动态分配内存,以及有许多方便的成员函数可以使用。

2. 如何定义和初始化字符串类对象?

定义和初始化字符串类对象非常简单,只需要通过标准构造函数和初始化函数即可。

2.1 声明和初始化
#include <string>
using namespace std;

int main()
{
  // 声明和初始化
  string str = "Hello world!"; // 将字符串常量“Hello world!”赋值给std::string对象str
  string str2("Hello world!"); // 使用构造函数初始化
  string str3 = string("Hello world!"); // 同样是使用构造函数初始化

  return 0;
}
2.2 多种初始化方式

除了上面的方法,你还可以给string类的构造函数传入一些参数来初始化对象。例如:

int main()
{
  // 各种初始化方式
  string str1(10, 'a');      // 这个string对象中存储的是'a' * 10个
  string str2(str1);         // 复制构造函数
  string str3(str1, 3, 5);   // str3存储的是str1中索引为3-7的子串
  string str4("Hello world", 5); // str4存储的是“Hello”子串

  return 0;
}
3. 常用成员函数

经过初始化的串后,我们来看一些常用的string类成员函数。

3.1 字符串长度

我们可以通过length()size()capacity()函数三个函数来获取字符串的长度和容量。

int main()
{
  string str = "Hello world!";

  cout << "length = " << str.length() << endl;     // 12
  cout << "size = " << str.size() << endl;         // 12
  cout << "capacity = " << str.capacity() << endl; // 15

  return 0;
}

size()length()是等价的,都返回字符串的长度。capacity()返回的是字符数组的最大容量(不包括字符串末尾的\0),一般情况下它要大于等于字符串实际长度,这是因为string类为了避免每次改变字符串时重新分配内存,它会为其扩充一些预留空间,这些空间并不会使用,但是可以用于存储后续的字符。

3.2 字符串查找和替换

我们可以使用find()replace()两个函数来查找和替换字符串中的子串。

int main()
{
  string str = "Hello world!";

  // 查找子串
  int pos = str.find("world");  // 6
  if (pos != string::npos) {
    cout << "Found at " << pos << endl;
  }

  // 替换子串
  str.replace(pos, 5, "C++");
  cout << str << endl;          // Hello C++!

  return 0;
}

find()函数返回找到的子串在原字符串中的第一个字符的索引,如果没有找到则返回string::nposreplace()函数第一个参数代表要替换的子串在主串中的起始位置;第二个参数是要替换的子串长度;第三个参数是要替换成的新子串。

3.3 字符串拼接和插入

我们可以使用+=append()函数来进行字符串的拼接,使用insert()函数来插入子串。

int main()
{
  string str1 = "Hello ";
  string str2 = "world!";

  // 字符串拼接
  str1 += str2;
  cout << str1 << endl;         // Hello world!

  // append()函数也可用于字符串拼接
  str1.append(" I am C++ programmer!");
  cout << str1 << endl;         // Hello world! I am C++ programmer!

  // 插入子串
  str1.insert(13, "almost ");
  cout << str1 << endl;         // Hello world! almost I am C++ programmer!

  return 0;
}

+=append()函数可以用于字符串拼接,它们的作用相同。insert()函数用法和replace()函数类似,用于插入子串。

3.4 字符串截取

我们可以使用substr()函数来截取字符串中的子串。

int main()
{
  string str = "Hello world!";

  // 截取子串
  string substr = str.substr(6, 5);  // world
  cout << substr << endl;

  return 0;
}

substr()函数第一个参数表示要截取的子串的起始位置,第二个参数表示要截取的子串长度。

4. 总结

string类是C++标准库中使用最多的类之一,可以极大的方便程序员的字符串操作,包括字符串的初始化、查找、替换、插入、截取等操作。对于有C++编程基础的程序员,建议多多使用string类,以提高代码的开发效率和可读性,减少编写代码的时间和成本。