引言
std::string_view
是C++17引入的一个轻量级、非拥有字符串引用类,它主要用于高效地传递和操作字符串数据,而无需复制字符串本身。
声明和初始化
// 从 std::string 初始化
std::string str = "Hello, world!";
std::string_view sv = str;
// 从 C 风格字符串(字符数组)初始化
const char arr[] = "Hello, world!";
std::string_view sv2(arr);
// 从字符数组范围初始化
const char* ptr = "Hello, world!";
std::string_view sv3(ptr, strlen(ptr)); // 第二个参数指定长度
// 直接指定字符和长度
std::string_view sv4("text", 4);
常用操作
接口名 | 功能 |
---|---|
size() / length() | 字符串视图的长度,不包含结束符 |
empty() | 判空 |
data() | 返回指向字符串的const指针 |
front() / back() | 获取首/尾字符 |
operator[] | 通过索引获取字符 |
迭代器 | 支持const迭代器访问 |
比较 | 支持>、<、<=、>=、==、!=这些关系运算符 |
compare() | 同std::string |
查找 | 同std::string,提供find、rfind、find_first_of、find_last_of等 |
substr() | 同std::string,区别在于前者会生成string副本,产生拷贝,后者则不会发生字符串拷贝 |
std::string
使用详解参考此处。
使用场景
适合作为函数参数,当函数仅需要查看传入字符串而不打算修改它时,使用string_view
类型作为参数可以避免不必要的字符串复制开销。
#include <string>
#include <string_view>
#include <iostream>
const char* g_str = "hellllohsadjhaxvsadagafxxqsgshaaghwaalhdaqabsaxdqqfa";
template<class T>
T testFunc(const T& str)
{
int pos = str.find('x');
return str.substr(pos);
}
int main()
{
// 自定义的计算程序运行时间的函数
costTimeByMs([](){
for (int i = 0; i < 100000; ++i) {
testFunc<std::string>(g_str);
}
}, "string");
costTimeByMs([](){
for (int i = 0; i < 100000; ++i) {
testFunc<std::string_view>(g_str);
}
}, "string_view");
return 0;
}
执行结果如下
string total cost 17.1417ms
string_view total cost 1.68675ms
上述耗时区别主要在于:
- 实参
const char*
要拷贝到形参string对象内部,string_view
则不需要拷贝; string::substr
会生成string副本,产生字符串拷贝,string_view::substr
则不需要拷贝,只发生了指针偏移。
总结
string_view
是一种非常实用的数据结构,它允许开发者安全、高效地处理字符串数据,尤其是在性能敏感的场景中。string_view
不负责管理它所引用的内存,因此确保在其引用的原始字符串生命周期内使用它,否则可能导致悬挂指针或访问无效内存。- 如果需要修改或延长
string_view
所引用的字符串的生命周期,可以将其转换为std::string
对象。