当前位置: 首页 > news >正文

c++字符串常用语法特性查询示例文档(二)

在 C++中,除了std::stringstd::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 特点

• 是一个模板类,可以使用不同的字符类型(如charwchar_tchar16_tchar32_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++中的各种字符串类型和工具。如果有任何问题,欢迎随时提问!

相关文章:

  • 【MySQL】使用文件进行交互
  • C++之函数模板类模板
  • MySQL 故障排查与生产环境优化
  • 科技行业智能化升级经典案例—某芯片公司
  • Java 泛型详解
  • VR 互动实训与展示,借科技开启沉浸式体验新篇​
  • 使用excel 工具做数据清洗
  • excel:时间戳格式与日期格式的互转
  • vue2.0 组件之间的数据共享
  • nginx 漏洞修复 CVE-2024-7347 CVE-2025-23419
  • Java实现PDF加水印功能:技术解析与实践指南
  • luckysheet的使用——17.将表格作为pdf下载到本地
  • Node-Red通过Profinet转ModbusTCP采集西门子PLC数据配置案例
  • BGP综合实验(2)
  • 高项-挣值管理TCPI
  • 软件设计师“测试用例”考点分析——求三连
  • ip与mac-数据包传输过程学习
  • 社交平台推出IP关联机制:增强用户体验与网络安全的新举措
  • 紫光同创FPGA实现AD9238数据采集转UDP网络传输,分享PDS工程源码和技术支持和QT上位机
  • 解决报错 Flask-SQLAlchemy TypeError: ‘float‘ object is not callable
  • 哈马斯与以色列在多哈举行新一轮加沙停火谈判
  • 上海市第二十届青少年科技节启动:为期半年,推出百余项活动
  • 新城市志|GDP万亿城市,一季度如何挑大梁
  • 嫩黑线货物列车脱轨致1名路外人员死亡,3人被采取刑事强制措施
  • 侵害孩子者,必严惩不贷!3名性侵害未成年人罪犯被执行死刑
  • 赡养纠纷个案推动类案监督,检察机关保障特殊群体胜诉权