专业课程镜像:https://www.itwangzi.cn/4944.html
C++这些事之string_view
0.难题
string_view为c++17后再次出现,只不过是leveldb中的slice,其目地是化解缓存复本、高效率的substr。
但,也导入了操作方式符与提及的难题,虽然string_view不保有对准文本的采用权,对照于Rust,实际上是转作,假如保有文本的第一类提早释放出来,便会再次出现装设提及难题。像Rust在校对时能预测表达式的开发周期,确保转作的天然资源在采用时不能释放出来。不过C++没检查和,须要育苗确保。
1.外部同时实现
string_view是两个basic_string_view类别,能看见_Traits选用预设的char_traits,那个很关键,前面的许多表达式都选用char_traits的许多核心理念成员表达式继续执行核心理念操作方式。
template
class _LIBCPP_TEMPLATE_VIS basic_string_view;
typedef basic_string_view
basic_string_view外部核心理念成员:
private:
const value_type* __data;
size_type __size;
构造兼容 string与const char*
constexpr basic_string_view() noexcept;
constexpr basic_string_view(const basic_string_view&) noexcept = default;
basic_string_view& operator=(const basic_string_view&) noexcept = default;
template
constexpr basic_string_view(const charT* str);
constexpr basic_string_view(const charT* str, size_type len);
迭代器支持:
constexpr const_iterator begin() const noexcept;
constexpr const_iterator end() const noexcept;
constexpr const_iterator cbegin() const noexcept;
constexpr const_iterator cend() const noexcept;
const_reverse_iterator rbegin() const noexcept;
const_reverse_iterator rend() const noexcept;
const_reverse_iterator crbegin() const noexcept;
const_reverse_iterator crend() const noexcept;
其他核心理念表达式:
从c++20开始支持starts_with、ends_with、contains,这三个在leveldb的slice中一开始就支持了。
char*的string_view字面量:
constexpr basic_string_view
constexpr basic_string_view
constexpr basic_string_view
constexpr basic_string_view
2.采用陷阱
2.1 \0
string_view不关心\0,会关心实际的字符个数。
std::string_view s = “abc\0\0def”sv;
std::cout << “s: ” << s.size() << ” \”” << s << “\”\n”;
输出:s: 8 “abcdef”
std::string_view str{“hello”, 1};
std::cout << str.data() << std::endl; // 输出 hello,而不是h
这里预期输出hello,但却输出了h。
2.2 开发周期
string_view foo() {
std::string s{“hello world”};
return string_view{s};
}
在该示例中,s出了作用域,string_view变成了悬空提及。