看动画,轻松学习23种C++设计模式

2022-12-21 0 906

专业课程镜像:https://www.itwangzi.cn/4944.html

看动画,轻松学习23种C++设计模式

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 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;

其他核心理念表达式:

substrremove_prefixcomparefind…

从c++20开始支持starts_with、ends_with、contains,这三个在leveldb的slice中一开始就支持了。

char*的string_view字面量:

constexpr basic_string_viewoperator “” sv( const char *str, size_t len ) noexcept;

constexpr basic_string_viewoperator “” sv( const wchar_t *str, size_t len ) noexcept;

constexpr basic_string_viewoperator “” sv( const char16_t *str, size_t len ) noexcept;

constexpr basic_string_viewoperator “” sv( const char32_t *str, size_t len ) noexcept;

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变成了悬空提及。

举报/反馈

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务