string_view使用详解

引言

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

上述耗时区别主要在于:

  1. 实参const char*要拷贝到形参string对象内部,string_view则不需要拷贝;
  2. string::substr会生成string副本,产生字符串拷贝,string_view::substr则不需要拷贝,只发生了指针偏移。

总结

  • string_view是一种非常实用的数据结构,它允许开发者安全、高效地处理字符串数据,尤其是在性能敏感的场景中。
  • string_view󠁪不负责管理它所引用的内存,因此确保在其引用的原始字符串生命周期内使用它,否则可能导致悬挂指针或访问无效内存。
  • 如果需要修改或延长string_view󠁪所引用的字符串的生命周期,可以将其转换为std::string󠁪对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值