查看: 131|回复: 0

C++20 中 string 和 string_view(十一)

[复制链接]

5

主题

11

帖子

21

积分

新手上路

Rank: 1

积分
21
发表于 2023-3-6 14:37:11 | 显示全部楼层 |阅读模式
还有一个 string_view 构造函数,它接收任意原始缓冲区和长度。

这可用于从字符串缓冲区(并非以NULL终止)构建 string_view。

如果确实有一个以 NULL 终止的字符串缓冲区,但你已经知道字符串的长度,构造函数不必再次统计字符数目,这也是有用的。
const char* raw {/* ... */ };
size_t length {/* ...*/};
cout << format("Raw:{}",extractExtension({ raw,length })) << endl;
最后一行代码也可以写成这样:
cout << format("Raw:{}",extractExtension(string_view{ raw,length }))<< endl;
注意:

在每当函数需要将只读字符串作为一个参数时,可使用 std::string_view 替代 const stc::string& 或const char*。

无法从 string view 隐式构建一个 string。要么使用一个显式的 string 构造函数,要么使用string_view::data() 成员。

例如,假设有以下接收 const string& 的函数。
void handleExtension(const strings extension) { /* ... */ }
不能采用如下方式调用该函数:
handleExtension(extractExtension("my file.ext"));
下面是两个可供使用的选项:
handleExtension(extractExtension("my file.ext").data());      
handleExtension( string { extractExtension("my file.ext")});     
由于同样的原因,无法连接一个 string 和一个 string_view。

下面的代码将无法编译:
string str { "Hello"};
string_view sv { " world"};
auto result { str + sv };
可以对 string_view 使用 data() 方法,如下所示:
auto resultl{ str + sv.data() };
或者可以使用 append():
string result2 { str };
result2.append(sv.data(),sv.size();
注意:

返回字符串的函数应返回 const std::string& 或 string,但不应返回 string_view。

返回 string_view 会带来使返回的 string_view 无效的风险,例如当它指向的字符串需要重新分配时。

注意:

将 const string& 或 string view 存储为类的数据成员需要确保它们指向的字符串在对象的生命周期内保持有效状态。存储 std::string 更安全。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表