C++ Tips of the Week-01 string_view
阅读原文时间:2023年08月11日阅读:3

1: string_view

ref https://abseil.io/tips/1

函数参数需要是一个字符串的时候,通常的实现有以下几种:

// C Convention
void TakesCharStar(const char* s);

// Old Standard C++ convention
void TakesString(const std::string& s);

// string_view C++ conventions
void TakesStringView(absl::string_view s);    // Abseil
void TakesStringView(std::string_view s);     // C++17

如果不需要做类型转换的情况下,前两种通常可以满足要求,但是如果存在从char*string的相互转换时,就有明显的副作用。

void AlreadyHasString(const std::string& s) {
  TakesCharStar(s.c_str());               // explicit conversion
}

void AlreadyHasCharStar(const char* s) {
  TakesString(s); // compiler will make a copy
}

C++17中我们可以使用std::string_view来获取一个字符串的视图,字符串视图并不真正的创建或者拷贝字符串,而只是拥有一个字符串的查看功能。std::string_view比std::string的性能要高很多,因为每个std::string都独自拥有一份字符串的拷贝,而std::string_view只是记录了自己对应的字符串的指针和偏移位置。当我们在只是查看字符串的函数中可以直接使用std::string_view来代替std::string。

void AlreadyHasString(const std::string& s) {
  TakesStringView(s); // no explicit conversion; convenient!
}

void AlreadyHasCharStar(const char* s) {
  TakesStringView(s); // no copy; efficient!
}

需要注意的点:

  1. string_view使用值传递,开销很小

  2. const string_view 直影响string_view对象本身,对实际字符串没有影响;其实就是一个对实际字符串对象的指针的封装。

  3. string_view 不是0 结尾的。

    printf("%s\n", sv.data()); // DON’T DO THIS

  4. std::string_view操作,从头到尾其实只有一个字符串数据,其它皆为视图。这也是需要注意的地方,因为std::string_view是原始字符串的视图,如果在查看std::string_view的同时修改了字符串,或者字符串被消毁,那么将是未定义的行为。

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章