C++ string 完整笔记

在 C++ 中, 用于处理字符串的类 string 虽然有用很多和 STL 相似的性质和用法, 但是一般来说, 我们不认为它是 STL 的一份子, 因为实际上, string 并不是模板, 它其实是某个模板的实例, 即 basic_string<char>. 因此, 这里我们单独讨论关于 string 类的一系列方法和属性, 但是需要知道, string 类在很多地方都与模板的函数或者属性很相似.

成员函数

元素访问

at() 返回char类型的字符

[] 返回char类型的字符

操作

push_back: 将字符添加到字符串结尾

pop_back: 移除末尾字符

类型转换

单个字符 char 转换到 string

单个字符无法直接转换成 string:
可以通过以下两种方式间接转换:

  1. 字符数组

    1
    2
    char c = 'c'
    char s1[2] = {c, '\0'}
  2. 新建 string 对象

    1
    2
    3
    char c = 'c';
    std::string str = "a";
    str[0] = c;

string 转换到其他类型

1
2
3
4
5
6
7
8
9
10
#include <string>
// 别忘了加 std::
stod()
stof()
stoi()
stol()
stold()
stoll()
stoul()
stoull

char 转换到其他类型

1
2
3
4
5
// 这些函数不在 stirng 头文件中, 是 C 自身有的函数, 不需要加 std::
atof()
atoi()
atol()
atoll()

其他类型转换到 string

1
2
3
#include <string>
std::to_string()
std::to_wstring()

最简单的将int转换成string的方法

方法一:C风格的itoa

1
2
3
int a = 10;
char* intStr = itoa(a);
string str = string(intStr);

方法二:

1
2
3
4
int a = 10;
stringstream ss;
ss << a;
string str = ss.str();

方法三:C++风格的std::to_string

1
2
3
4
#include <string>

std::string s = std::to_string(42);
auto s = std::to_string(42);

字符串流

典型应用: 二叉树的序列化和反序列化

stringstream

控制流的输入输出操作

istringstream

控制流的输入

ostringstream

控制流的输出

不确定数目的整数输入

持续输入, 自动忽略输入中的空白符(空格, 回车, 制表符), 下面的程序当遇到 99 时终止输入

1
2
std::vector<int> vec;
for (int a; std::cin >> a and a != 99; vec.emplace_back(a));

仅仅输入一行, 自动忽略输入中的空白符, 注意, 如果输入中存在其他字符, 例如分号, 逗号等, 那么 istringstream 的输出会在其他字符之前停止

1
2
3
4
5
6
7
8
#include <string>
#include <sstream>

std::vector<double> vec;
string line;
std::getline(std::cin, line);
std::istringstream iss(line);
for (double v; iss > v; vec.emplace_back(v));