c++字符串常用语法特性查询示例文档(二)
在 C++中,除了std::string
和std::string_view
,还有其他一些与字符串相关的类型,它们各自针对不同的场景进行了优化。以下是一些常见的字符串类型及其使用方式和适用场景的汇总。
紧接上篇 c++字符串常用语法特性查询示例文档(一)
6.std::array<char, N>
和std::vector<char>
std::array<char, N>
和std::vector<char>
是用于处理字符数组的容器类型,适合处理固定大小或动态大小的字符数据。
6.1 特点
• std::array<char, N>
:固定大小的字符数组。
• std::vector<char>
:动态大小的字符数组。
• 提供容器操作接口,如迭代器、大小操作等。
6.2 使用示例
#include <iostream>
#include <array>
#include <vector>int main() {// 使用 std::array<char, N>std::array<char, 13> arr = {'H', 'e', 'l', 'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd', '!'};std::cout << "Array string: ";for (char c : arr) {std::cout << c;}std::cout << std::endl;// 使用 std::vector<char>std::vector<char> vec = {'H', 'e', 'l', 'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd', '!'};std::cout << "Vector string: ";for (char c : vec) {std::cout << c;}std::cout << std::endl;return 0;
}
输出
Array string: Hello, World!
Vector string: Hello, World!
6.3 适用场景
• 处理固定大小的字符数据。
• 处理动态大小的字符数据。
7.std::basic_string
std::basic_string
是 C++标准库中std::string
的模板类,它提供了泛化的字符串功能,支持不同的字符类型。
7.1 特点
• 是一个模板类,可以使用不同的字符类型(如char
、wchar_t
、char16_t
、char32_t
)。
• 提供了动态内存管理,支持字符串的动态扩展。
• 提供了丰富的字符串操作方法,如拼接、查找、替换等。
7.2 使用示例
#include <iostream>
#include <string>int main() {// 使用 std::basic_string<char>,等同于 std::stringstd::basic_string<char> str = "Hello, ";str += "World!";std::cout << "Concatenated string: " << str << std::endl;// 使用 std::basic_string<wchar_t>,等同于 std::wstringstd::basic_string<wchar_t> wstr = L"Hello, ";wstr += L"World!";std::wcout << L"Concatenated wstring: " << wstr << std::endl;return 0;
}
输出
Concatenated string: Hello, World!
Concatenated wstring: Hello, World!
7.3 适用场景
• 需要处理不同字符类型(如多语言支持)的场景。
• 需要自定义字符类型支持的场景。
8.std::span<char>
std::span
是 C++20 引入的轻量级视图类,用于表示连续的内存区域。它可以用于字符串数据的视图,类似于std::string_view
,但更通用。
8.1 特点
• 提供对连续内存的轻量级视图。
• 不拥有内存所有权,只是对已有数据的引用。
• 支持任意类型的连续内存,包括字符数组。
8.2 使用示例
#include <iostream>
#include <span>
#include <array>int main() {std::array<char, 13> arr = {'H', 'e', 'l', 'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd', '!'};std::span<char> span(arr);std::cout << "Span string: ";for (char c : span) {std::cout << c;}std::cout << std::endl;return 0;
}
输出
Span string: Hello, World!
8.3 适用场景
• 需要对连续内存进行高效访问的场景。
• 需要通用的内存视图,而不仅仅是字符串的场景。
9.std::optional<std::string>
std::optional
是 C++17 引入的类模板,用于表示可能为空的值。std::optional<std::string>
可以用于表示可能为空的字符串。
9.1 特点
• 提供了一种安全的方式来表示可能为空的值。
• 避免使用指针或特殊值来表示空值。
9.2 使用示例
#include <iostream>
#include <optional>
#include <string>int main() {std::optional<std::string> optStr = "Hello, World!";if (optStr) {std::cout << "Optional string: " << *optStr << std::endl;} else {std::cout << "Optional string is empty." << std::endl;}std::optional<std::string> emptyOptStr;if (emptyOptStr) {std::cout << "Optional string: " << *emptyOptStr << std::endl;} else {std::cout << "Optional string is empty." << std::endl;}return 0;
}
输出
Optional string: Hello, World!
Optional string is empty.
9.3 适用场景
• 需要表示可能为空的字符串的场景。
• 需要安全地处理空值的场景。
10.std::variant<std::string, int, double>
std::variant
是 C++17 引入的类模板,用于表示多种类型中的一个。std::variant<std::string, int, double>
可以用于表示一个变量,其值可以是字符串、整数或浮点数。
10.1 特点
• 提供了一种安全的方式来表示多种类型的值。
• 避免使用联合体(union
)或动态分配内存。
10.2 使用示例
#include <iostream>
#include <variant>
#include <string>int main() {std::variant<std::string, int, double> var = "Hello, World!";if (std::holds_alternative<std::string>(var)) {std::cout << "Variant contains string: " << std::get<std::string>(var) << std::endl;}var = 42;if (std::holds_alternative<int>(var)) {std::cout << "Variant contains int: " << std::get<int>(var) << std::endl;}var = 3.14;if (std::holds_alternative<double>(var)) {std::cout << "Variant contains double: " << std::get<double>(var) << std::endl;}return 0;
}
输出
Variant contains string: Hello, World!
Variant contains int: 42
Variant contains double: 3.14
10.3 适用场景
• 需要表示多种类型的值的场景。
• 需要安全地处理多种类型的场景。
11.std::unique_ptr<char[]>
std::unique_ptr
是 C++11 引入的智能指针,用于管理动态分配的内存。std::unique_ptr<char[]>
可以用于管理动态分配的字符数组。
11.1 特点
• 提供了自动内存管理,避免手动释放内存。
• 支持动态分配的字符数组。
11.2 使用示例
#include <iostream>
#include <memory>int main() {std::unique_ptr<char[]> ptr(new char[13]);std::strcpy(ptr.get(), "Hello, World!");std::cout << "Unique_ptr string: " << ptr.get() << std::endl;return 0;
}
输出
Unique_ptr string: Hello, World!
11.3 适用场景
• 需要动态分配字符数组的场景。
• 需要自动管理内存的场景。
总结
C++提供了多种与字符串相关的类型和工具,每种类型都有其独特的特点和适用场景。以下是一个简单的总结:
• std::array<char, N>
和std::vector<char>
:字符数组,适合处理固定大小或动态大小的字符数据。
• std::basic_string
:模板化的字符串类,支持自定义字符类型。
• std::span<char>
:轻量级内存视图,适合高效访问连续内存的场景。
• std::optional<std::string>
:表示可能为空的字符串,适合安全处理空值的场景。
• std::variant<std::string, int, double>
:表示多种类型的值,适合处理多种类型的场景。
• std::unique_ptr<char[]>
:管理动态分配的字符数组,适合需要自动管理内存的场景。
希望这篇教程能帮助你更好地理解和使用 C++中的各种字符串类型和工具。如果有任何问题,欢迎随时提问!