string_view
函数参数需要是一个字符串的时候,通常的实现有以下几种:
// 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!
}
需要注意的点:
string_view
使用值传递,开销很小
const string_view
直影响string_view
对象本身,对实际字符串没有影响;其实就是一个对实际字符串对象的指针的封装。
string_view
不是0 结尾的。
printf("%s\n", sv.data()); // DON’T DO THIS
std::string_view操作,从头到尾其实只有一个字符串数据,其它皆为视图。这也是需要注意的地方,因为std::string_view是原始字符串的视图,如果在查看std::string_view的同时修改了字符串,或者字符串被消毁,那么将是未定义的行为。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章