C++ StringView

在 C++17 中,引入了 std::string_view 类型,它是一个轻量级的、不可变的字符串视图,可以用来代替 const char*const std::string&,并且提供了许多方便的方法来操作字符串。
比如在一些新兴语言 rust 设计就直接支持&str 切片

创建 StringView

可以通过以下方式来创建 std::string_view

1
2
3
4
5
6
7
8
9
10
// 从字符串字面量创建
std::string_view sv1("Hello, world!");

// 从 std::string 创建
std::string str = "Hello, world!";
std::string_view sv2(str);

// 从部分 std::string 创建
std::string str2 = "Hello, world!";
std::string_view sv3(str2.c_str(), 5); // 只包含前五个字符

StringView 的基本操作

获取字符串长度

可以使用 size() 方法来获取字符串的长度:

1
2
std::string_view sv("Hello, world!");
std::cout << sv.size() << std::endl; // 输出 13

访问字符串中的字符

可以使用 operator[]at() 方法来访问字符串中的字符:

1
2
3
std::string_view sv("Hello, world!");
std::cout << sv[0] << std::endl; // 输出 'H'
std::cout << sv.at(1) << std::endl; // 输出 'e'

截取字符串

可以使用 substr() 方法来截取字符串:

1
2
3
std::string_view sv("Hello, world!");
std::string_view sv2 = sv.substr(0, 5); // 截取前五个字符
std::cout << sv2 << std::endl; // 输出 "Hello"

查找子字符串

可以使用 find() 方法来查找子字符串:

1
2
3
4
5
6
7
std::string_view sv("Hello, world!");
size_t pos = sv.find("world");
if (pos != std::string_view::npos) {
std::cout << "Found at position " << pos << std::endl;
} else {
std::cout << "Not found" << std::endl;
}

比较字符串

可以使用 operator==operator!= 来比较两个字符串是否相等:

1
2
3
4
5
6
7
std::string_view sv1("Hello, world!");
std::string_view sv2("Hello");
if (sv1 == sv2) {
std::cout << "Equal" << std::endl;
} else {
std::cout << "Not equal" << std::endl;
}

StringView 的优点

使用 std::string_view 的好处在于它是一个轻量级的、不可变的字符串视图,可以避免不必要的内存分配和拷贝。在需要操作字符串的场合,使用 std::string_view 可以提高程序的性能和效率。

C++17 以下解决方案

  1. absl::string_view
  2. tensorflow stringpiece 使用absl
  3. level db: Slice
  4. boost string_view
  5. brpc string_piece brpc 注释copy from chromium
  6. chromium sptring_piece

总结

std::string_view 是一个轻量级的、不可变的字符串视图,可以用来代替 const char*const std::string&,并且提供了许多方便的方法来操作字符串。在需要操作字符串的场合,使用 std::string_view 可以提高程序的性能和效率。