跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C++17 std::string view
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{DISPLAYTITLE:C++17 std::string_view}} '''std::string_view''' 是 C++17 引入的一个轻量级、非拥有(non-owning)的字符串视图类,用于高效地处理字符串数据而无需复制。它提供了一种安全且高效的方式来访问字符串,无论是 C 风格字符串(`const char*`)、C++ `std::string` 还是其他字符序列。 == 介绍 == `std::string_view` 是一个只读视图,它不管理内存,也不负责分配或释放内存。它仅仅是对现有字符串的引用,因此它的构造和操作非常高效。它的主要优点包括: * '''零拷贝''':避免不必要的字符串复制。 * '''高效''':构造和析构成本极低。 * '''兼容性''':可以接受多种字符串类型(`std::string`、`const char*`、字符数组等)。 * '''安全性''':提供边界检查(如 `substr` 方法)。 == 基本用法 == 以下是一个简单的示例,展示 `std::string_view` 的基本使用方式: <syntaxhighlight lang="cpp"> #include <iostream> #include <string> #include <string_view> int main() { std::string str = "Hello, C++17!"; std::string_view sv(str); // 从 std::string 构造 // 输出 string_view 的内容 std::cout << "string_view: " << sv << std::endl; // 获取子串 std::string_view sub = sv.substr(0, 5); std::cout << "substring: " << sub << std::endl; // 从 C 风格字符串构造 const char* cstr = "C-style string"; std::string_view sv2(cstr); std::cout << "C-string view: " << sv2 << std::endl; return 0; } </syntaxhighlight> '''输出:''' <pre> string_view: Hello, C++17! substring: Hello C-string view: C-style string </pre> === 关键特性 === * '''非拥有语义''':`std::string_view` 不管理内存,因此原始字符串的生命周期必须比 `string_view` 更长。 * '''高效构造''':构造 `string_view` 几乎不涉及内存分配或复制。 * '''支持标准操作''':如 `size()`、`empty()`、`substr()`、`find()` 等。 == 实际应用场景 == `std::string_view` 在以下场景中非常有用: 1. '''解析字符串''':避免复制大字符串。 2. '''函数参数''':代替 `const std::string&` 或 `const char*`,提高性能。 3. '''日志处理''':高效地传递和操作日志消息。 === 示例:解析 CSV 行 === 以下代码展示如何使用 `std::string_view` 高效解析 CSV 行: <syntaxhighlight lang="cpp"> #include <iostream> #include <string_view> #include <vector> std::vector<std::string_view> split_csv_line(std::string_view line) { std::vector<std::string_view> tokens; size_t start = 0; size_t end = line.find(','); while (end != std::string_view::npos) { tokens.push_back(line.substr(start, end - start)); start = end + 1; end = line.find(',', start); } tokens.push_back(line.substr(start)); return tokens; } int main() { std::string csv_line = "apple,banana,cherry,date"; auto tokens = split_csv_line(csv_line); for (const auto& token : tokens) { std::cout << "Token: " << token << std::endl; } return 0; } </syntaxhighlight> '''输出:''' <pre> Token: apple Token: banana Token: cherry Token: date </pre> == 与 `std::string` 的比较 == {| class="wikitable" |- ! 特性 !! `std::string` !! `std::string_view` |- | 内存管理 || 拥有内存(分配/释放) || 不拥有内存(仅引用) |- | 构造成本 || 可能涉及内存分配 || 极低(仅存储指针和长度) |- | 修改能力 || 可修改内容 || 只读视图 |- | 适用场景 || 需要修改或长期存储字符串 || 只读访问或临时处理字符串 |} == 注意事项 == * '''生命周期问题''':`std::string_view` 必须确保引用的字符串在其使用期间有效。 * '''不支持修改''':`string_view` 是只读的,不能用于修改原始字符串。 * '''不适用所有场景''':如果需要长期存储或修改字符串,仍应使用 `std::string`。 == 性能优势 == `std::string_view` 避免了不必要的内存分配和复制,特别适合高频调用的函数或处理大字符串的场景。例如: <syntaxhighlight lang="cpp"> // 低效:可能涉及临时 string 的构造 void process_string(const std::string& str); // 高效:避免复制 void process_string_view(std::string_view sv); </syntaxhighlight> == 总结 == `std::string_view` 是 C++17 引入的一个强大工具,用于高效处理字符串数据。它特别适合只读操作和临时字符串处理,但使用时需注意生命周期问题。在性能敏感的场景中,合理使用 `string_view` 可以显著提升程序的效率。 <mermaid> graph LR A[原始字符串] -->|引用| B(std::string_view) B --> C[高效访问] B --> D[零拷贝] B --> E[只读操作] </mermaid> [[Category:编程语言]] [[Category:C++]] [[Category:C++141720 特性]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)