计算机

字符串 string

标准模板库中的 <string> 头文件提供了一系列和字符串有关的操作,它可以定义一个动态内存的字符串。

基本操作

字符串的初始化

使用 std::string s 定义一个字符串。当指定 using namespace std 后,std:: 可省略。字符串有如下常用初始化方法:

  • string s1 = "Hello World" 或 string s1("Hello World") 从字面量 "Hello World" 初始化字符串,但标准模板库的 string 不包含最后的 \0。
  • string s2 = s1 从其他字符串创建拷贝
  • string s3(5, 'a') 初始化为连续 5 个 a 字符,即 aaaaa

字符串的操作

基本操作

  • std::cin >> s 和 std::cout << s:输入输出
  • getline(std::cin, s) 从标准输入读取一行赋给 s
    • getline 读取时,包括 stdin 的换行符也会被读取,但换行符不会赋给 s
  • s.size() 返回字符串字符数
  • s[i] 返回第 i 个字符的引用
  • s1 < s2 按字典序比较字符串
    • 该比较从两个字符串开头开始,返回第一对相异字符的比较
    • 如果 s1 的长度 m 小于 s2 的长度 n,而两者前 m 个字符相等,则 s1 小于 s2

拼接

定义 s1 和 s2 后,使用 s = s1 + s2 可以实现两个字符串的拼接。

两个操作数中允许其中一个是字面量,如 s = s1 + "abc",但不能两个都是字面量,因为 C 的字符数组没有定义加法,此时应该先将一个转化为 string,例如:

// string s = "abc" + "123"; 错误
string s = string("abc") + "123";

搜索 find

流行实现是 KMP 算法,设 s 的长度是 n,则查找的平均复杂度是 O(n),与子串长度无关。

  • s.find(s1) 在字符串 s 中寻找 s1 第一次出现的位置。
  • s.find(s1, pos) 从字符串 s 的第 pos 个位置开始寻找。

与数值进行转换

C++11 开始,<string> 库中提供了 to_string 函数,用于将整数和浮点数转换为字符串;也提供了 stoi、stoll、stoull 用于将字符串转换为整数(int、long long 和 unsigned long long 类型)

这种转换不需要手动编写函数,也不需要经过 stringstream 绕一圈,更加方便。

stoi 等函数还可以指定参数的进制,使用格式为:

stoi(s, pos, base)

其中第二个参数默认为 nullptr,第三个参数可以指定进制。

BEYOND THE ARTICLE

读完了,有什么想法?

阅读已保存的问答示例,并循着引用回到原文。

查看公开问答示例
— 本文完 — 返回文章列表