c++ std::basic_string_view、std::span使用笔记
c++ std::basic_string_view、std::span使用笔记
- `std::basic_string_view` (C++17) 和 `std::span` (C++20) 简介
- 1. `std::basic_string_view` (C++17)
- 2. `std::span` (C++20)
- 使用指南
- `std::basic_string_view` 使用指南
- `std::span` 使用指南
std::basic_string_view
(C++17) 和 std::span
(C++20) 简介
1. std::basic_string_view
(C++17)
std::basic_string_view
是一个轻量级的非拥有(non-owning)字符串视图类,用于表示一个字符串的只读视图。它不管理内存,只是对现有字符串的引用。
-
特点:
- 非拥有:不管理内存,只是对现有字符串的引用。
- 只读:不能通过
basic_string_view
修改字符串内容。 - 低成本:构造和操作的开销很低,适合传递字符串参数而不需要拷贝。
-
使用场景:
- 需要传递字符串参数而不需要拷贝。
- 需要高效的字符串操作,如查找、比较等。
-
简单使用:
#include <iostream> #include <string> #include <string_view> void print_string_view(std::string_view sv) { std::cout << "String view: " << sv << std::endl; } int main() { std::string str = "Hello, World!"; const char* cstr = "C-string"; // 基于 std::string 构造 std::string_view sv1(str); print_string_view(sv1); // 基于 C 字符串构造 std::string_view sv2(cstr); print_string_view(sv2); // 基于迭代器构造 std::string_view sv3(str.begin(), str.end()); print_string_view(sv3); // 操作接口 std::cout << "Size: " << sv1.size() << std::endl; std::cout << "First character: " << sv1.front() << std::endl; std::cout << "Last character: " << sv1.back() << std::endl; std::cout << "Substring: " << sv1.substr(0, 5) << std::endl; return 0; }
2. std::span
(C++20)
std::span
是一个轻量级的非拥有(non-owning)视图类,用于表示一个连续内存区域的视图。它可以是只读或可读写的。
-
特点:
- 非拥有:不管理内存,只是对现有内存区域的引用。
- 可读写:可以通过
span
修改内存区域的内容。 - 低成本:构造和操作的开销很低,适合传递数组或容器参数而不需要拷贝。
-
使用场景:
- 需要传递数组或容器参数而不需要拷贝。
- 需要高效的数组操作,如遍历、修改等。
-
简单使用:
#include <iostream> #include <span> #include <array> #include <vector> void print_span(std::span<int> s) { for (int elem : s) { std::cout << elem << " "; } std::cout << std::endl; } int main() { int carr[] = {1, 2, 3, 4, 5}; std::array<int, 5> arr = {6, 7, 8, 9, 10}; std::vector<int> vec = {11, 12, 13, 14, 15}; // 基于 C 数组构造 std::span<int> sp1(carr, 5); print_span(sp1); // 基于 std::array 构造 std::span<int> sp2(arr); print_span(sp2); // 基于 std::vector 构造 std::span<int> sp3(vec); print_span(sp3); // 操作接口 std::cout << "Size: " << sp1.size() << std::endl; std::cout << "First element: " << sp1.front() << std::endl; std::cout << "Last element: " << sp1.back() << std::endl; std::cout << "Element at index 2: " << sp1[2] << std::endl; // 修改元素 sp1[2] = 99; print_span(sp1); return 0; }
使用指南
std::basic_string_view
使用指南
-
构造:
- 基于
std::string
构造:std::string_view sv(str);
- 基于 C 字符串构造:
std::string_view sv(cstr);
- 基于迭代器构造:
std::string_view sv(begin, end);
- 基于
-
操作:
- 获取大小:
sv.size()
- 获取第一个字符:
sv.front()
- 获取最后一个字符:
sv.back()
- 获取子字符串:
sv.substr(pos, count)
- 查找字符或子字符串:
sv.find(ch)
或sv.find(substr)
- 获取大小:
-
注意事项:
basic_string_view
是只读的,不能修改字符串内容。basic_string_view
不管理内存,确保底层字符串在basic_string_view
使用期间有效。
std::span
使用指南
-
构造:
- 基于 C 数组构造:
std::span<int> sp(arr, size);
- 基于
std::array
构造:std::span<int> sp(arr);
- 基于
std::vector
构造:std::span<int> sp(vec);
- 基于 C 数组构造:
-
操作:
- 获取大小:
sp.size()
- 获取第一个元素:
sp.front()
- 获取最后一个元素:
sp.back()
- 获取指定索引的元素:
sp[index]
- 修改元素:
sp[index] = value;
- 获取大小:
-
注意事项:
span
是非拥有的,确保底层数组或容器在span
使用期间有效。span
可以是只读或可读写的,取决于模板参数类型。
通过使用 std::basic_string_view
和 std::span
,可以在不引入额外内存开销的情况下,高效地操作字符串和数组。