跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C++ 字符串视图
”︁(章节)
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= C++字符串视图(`std::string_view`) = == 介绍 == '''C++字符串视图'''(`std::string_view`)是C++17引入的一个轻量级、非拥有的字符串引用类,用于高效地访问和操作字符串数据,而无需复制或分配内存。它适用于需要读取字符串但不修改其内容的场景,尤其适合处理大型字符串或频繁传递字符串参数的场景。 `std::string_view`的主要特点包括: * '''非拥有''':不管理字符串的内存,仅提供对现有字符串的视图。 * '''高效''':避免了不必要的字符串拷贝。 * '''兼容性''':可以接受`std::string`、C风格字符串(`const char*`)和字符串字面量作为输入。 == 基本用法 == 以下是一个简单的`std::string_view`示例: <syntaxhighlight lang="cpp"> #include <iostream> #include <string_view> int main() { std::string str = "Hello, C++ String View!"; std::string_view sv(str); // 从std::string构造 std::cout << "String View: " << sv << std::endl; std::cout << "Length: " << sv.length() << std::endl; std::cout << "First character: " << sv[0] << std::endl; return 0; } </syntaxhighlight> '''输出:''' <pre> String View: Hello, C++ String View! Length: 22 First character: H </pre> == 构造与初始化 == `std::string_view`可以通过多种方式构造: <syntaxhighlight lang="cpp"> #include <string_view> int main() { // 从C风格字符串构造 std::string_view sv1("Hello"); // 从std::string构造 std::string str = "World"; std::string_view sv2(str); // 从字符串字面量构造 std::string_view sv3 = "C++17"; // 从子字符串构造 std::string_view sv4(sv1.data(), 3); // "Hel" return 0; } </syntaxhighlight> == 常用操作 == `std::string_view`提供了一系列与`std::string`类似的操作: === 访问元素 === <syntaxhighlight lang="cpp"> std::string_view sv = "Example"; char c = sv[2]; // 'a' char front = sv.front(); // 'E' char back = sv.back(); // 'e' </syntaxhighlight> === 子字符串操作 === <syntaxhighlight lang="cpp"> std::string_view sv = "Hello, World!"; std::string_view sub = sv.substr(7, 5); // "World" </syntaxhighlight> === 比较操作 === <syntaxhighlight lang="cpp"> std::string_view sv1 = "Apple"; std::string_view sv2 = "Banana"; bool isEqual = (sv1 == sv2); // false bool isLess = (sv1 < sv2); // true </syntaxhighlight> == 实际应用场景 == === 1. 函数参数传递 === 使用`std::string_view`作为函数参数可以避免不必要的字符串拷贝: <syntaxhighlight lang="cpp"> #include <iostream> #include <string_view> void print(std::string_view message) { std::cout << message << std::endl; } int main() { print("Hello"); // 字符串字面量 std::string str = "World"; print(str); // std::string print(str.c_str()); // C风格字符串 return 0; } </syntaxhighlight> === 2. 解析大型文本 === 在处理大型文本文件时,`std::string_view`可以高效地引用部分文本而不复制: <syntaxhighlight lang="cpp"> #include <vector> #include <string_view> std::vector<std::string_view> split(std::string_view text, char delimiter) { std::vector<std::string_view> result; size_t start = 0; size_t end = text.find(delimiter); while (end != std::string_view::npos) { result.push_back(text.substr(start, end - start)); start = end + 1; end = text.find(delimiter, start); } result.push_back(text.substr(start)); return result; } </syntaxhighlight> == 注意事项 == * '''生命周期管理''':`std::string_view`不拥有其引用的字符串,必须确保原始字符串在`string_view`使用期间有效。 * '''修改限制''':`std::string_view`是只读视图,不能用于修改字符串内容。 * '''性能优势''':在频繁传递字符串参数的场景下,`std::string_view`比`std::string`更高效。 == 与`std::string`的比较 == {| class="wikitable" |+ `std::string_view` vs `std::string` |- ! 特性 !! `std::string_view` !! `std::string` |- | 内存所有权 || 非拥有 || 拥有 |- | 修改能力 || 只读 || 可修改 |- | 性能 || 高效(无拷贝) || 可能涉及拷贝 |- | 适用场景 || 只读访问 || 需要修改或长期存储 |} == 高级用法 == === 与标准算法结合 === `std::string_view`可以与标准库算法无缝协作: <syntaxhighlight lang="cpp"> #include <algorithm> #include <string_view> bool hasDigit(std::string_view sv) { return std::any_of(sv.begin(), sv.end(), ::isdigit); } </syntaxhighlight> === 自定义字面量 === C++14引入了用户定义字面量,可以为`std::string_view`创建便捷的字面量后缀: <syntaxhighlight lang="cpp"> #include <string_view> constexpr std::string_view operator"" _sv(const char* str, size_t len) { return std::string_view(str, len); } auto greeting = "Hello"_sv; // 类型为std::string_view </syntaxhighlight> == 总结 == `std::string_view`是C++17中引入的强大工具,为字符串处理提供了高效、灵活的只读视图。它特别适合以下场景: * 需要频繁传递字符串参数 * 处理大型文本而不想复制 * 需要与多种字符串类型(`std::string`、`const char*`等)交互 正确使用`std::string_view`可以显著提升程序性能,但必须注意其生命周期限制。 <mermaid> graph TD A[字符串数据源] -->|创建视图| B[std::string_view] B --> C[各种只读操作] C --> D[不涉及内存分配] </mermaid> [[Category:编程语言]] [[Category:C++]] [[Category:C++ 字符串]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)