basic_string_view解析

src\rttr\string_view.h

对github项目rttr(C++反射库)解析,链接:https://github.com/rttrorg/rttr

template<typename CharT, typename Traits = std::char_traits > class basic_string_view

私有成员变量

  1. const value_type* m_data (value_type = CharT)
  2. size_type m_size (size_type = std::size_t)

实现文件:rttr/detail/impl/string_view_impl.h

typename Traits = std::char_traits 主要是对CharT类型进行获取并有相关一系列函数对获取的类型做相关处理操作。比如:

template<typename CharT, typename Traits>
RTTR_CXX14_CONSTEXPR int basic_string_view<CharT, Traits>::compare(basic_string_view v) const RTTR_NOEXCEPT
{const int cmp = traits_type::compare(m_data, v.m_data, (std::min)(m_size, v.m_size));return (cmp != 0 ? cmp : (m_size == v.m_size ? 0 : m_size < v.m_size ? -1 : 1));
}

traits_type::compare()函数就是对CharT类型数据做比较,std::char_traits就是获取CharT类型,让类中的相关函数都能获取CharT类型。这里相关STL源码后续对其进行分析解释,这里先描述一下作用。

成员函数解释:

  • template explicit operator std::basic_string<CharT, Traits, Allocator>() const

operator className() :basic_string_view类的转换函数,可通过强制类型转换将basic_string_view类型转换成为std::basic_string类型。

  • const_reverse_iterator rbegin() const RTTR_NOEXCEPT
template<typename CharT, typename Traits>
typename basic_string_view<CharT, Traits>::const_reverse_iterator
basic_string_view<CharT, Traits>::rbegin() const RTTR_NOEXCEPT
{return const_reverse_iterator(end());
}
template<typename CharT, typename Traits>
RTTR_CONSTEXPR typename basic_string_view<CharT, Traits>::const_iterator
basic_string_view<CharT, Traits>::end() const RTTR_NOEXCEPT
{return (m_data + m_size);
}

end()函数返回的是const CharT*类型,const_reverse_iterator = std::reverse_iterator<const_iterator>,使用的是std::reverse_iterator,其中std::reverse_iterator主要作用就是对const CharT *类型的数据进行相关的像指针一样的操作对数据进行“逆序遍历”。

  • RTTR_CONSTEXPR const_reference operator[](size_type pos) const RTTR_NOEXCEPT
template<typename CharT, typename Traits>
RTTR_CONSTEXPR typename basic_string_view<CharT, Traits>::const_reference
basic_string_view<CharT, Traits>::operator[](size_type pos) const RTTR_NOEXCEPT
{return m_data[pos];
}

直接通过下标方式进行访问当前pos位置的单字符

  • RTTR_CXX14_CONSTEXPR int compare(basic_string_view v) const RTTR_NOEXCEPT
template<typename CharT, typename Traits>
RTTR_CXX14_CONSTEXPR int basic_string_view<CharT, Traits>::compare(basic_string_view v) const RTTR_NOEXCEPT
{const int cmp = traits_type::compare(m_data, v.m_data, (std::min)(m_size, v.m_size));return (cmp != 0 ? cmp : (m_size == v.m_size ? 0 : m_size < v.m_size ? -1 : 1));
}

this->m_data和v.m_data在std::min(this->m_size, v.m_size)长度中比较字符ASCII值的大小

  • RTTR_INLINE RTTR_CXX14_CONSTEXPR bool operator==(basic_string_view<CharT, Traits> lhs, basic_string_view<CharT, Traits> rhs) RTTR_NOEXCEPT
RTTR_INLINE RTTR_CXX14_CONSTEXPR bool operator==(basic_string_view<CharT, Traits> lhs,basic_string_view<CharT, Traits> rhs) RTTR_NOEXCEPT
{if (lhs.size () == rhs.size ())return (lhs.compare(rhs) == 0);elsereturn false;
}

根据ASCII码值判断是否相等并且必须是一样的长度

  • template<typename CharT, typename Traits>

    RTTR_INLINE std::basic_string<CharT, Traits> operator+(basic_string_view<CharT, Traits> lhs,const std::basic_string<CharT, Traits>& rhs)

template<typename CharT, typename Traits>
RTTR_INLINE std::basic_string<CharT, Traits> operator+(basic_string_view<CharT, Traits> lhs,const std::basic_string<CharT, Traits>& rhs)
{return (lhs.to_string() + rhs);
}

lhs和rhs字符串相连

类中支持什么?

支持构造、拷贝构造、赋值、交换、迭代器、反向迭代器、获取长度/大小、下标访问、std::basic_string<CharT, Traits, Allocator>类型转换、比较判断、operator+、operator<<

疑问:上述中std::string和basic_string_view有什么区别?

细心发现std::string中有扩容函数,但是这里没有扩容,只是对数据进行了一个浅拷贝(指针赋值),所以basic_string_view使用的初衷应该就是像类名一样只是对字符串做个查看等操作并没有对字符串修改的能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/1153.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安卓官方例程

https://learn.microsoft.com/zh-cn/shows/connecton-demand/202?sourcerecommendations https://learn.microsoft.com/zh-cn/visualstudio/cross-platform/cross-platform-mobile-development-in-visual-studio?viewvs-2022 https://learn.microsoft.com/zh-cn/shows/xamari…

pta L1-063 吃鱼还是吃肉

L1-063 吃鱼还是吃肉 分数 10 全屏浏览 切换布局 作者 陈越 单位 浙江大学 国家给出了 8 岁男宝宝的标准身高为 130 厘米、标准体重为 27 公斤&#xff1b;8 岁女宝宝的标准身高为 129 厘米、标准体重为 25 公斤。 现在你要根据小宝宝的身高体重&#xff0c;给出补充营养的…

Abstract Factory抽象工厂模式详解

模式定义 提供一个创建一系列相关或互相依赖对象的接口&#xff0c;而无需指定它们具体的类。 代码示例 public class AbstractFactoryTest {public static void main(String[] args) {IDatabaseUtils iDatabaseUtils new OracleDataBaseUtils();IConnection connection …

前端页面助手 (vue)

快速开发页面&#xff08;图形化开发页面&#xff09; 自主编辑 然后自己也可以修改属性 最后导出页面即可 github地址 ;https://github.com/opentiny/tiny-engine

图灵奖简介及2023年获奖者Avi Wigderson的贡献

No.内容链接1Openlayers 【入门教程】 - 【源代码示例300】 2Leaflet 【入门教程】 - 【源代码图文示例 150】 3Cesium 【入门教程】 - 【源代码图文示例200】 4MapboxGL【入门教程】 - 【源代码图文示例150】 5前端就业宝典 【面试题详细答案 1000】 文章目录 2023年的…

9月BTE第8届广州国际生物技术大会暨展览会,全媒体聚焦下的高精尖行业盛会

政策春风助力&#xff0c;共迎大湾区生物医药行业50亿红利 今年3月“创新药”首次写入国务院政府工作报告之后&#xff0c;广州、珠海、北京多地政府纷纷同步出台了多项细化政策&#xff0c;广州最高支持额度高达50亿元&#xff0c;全链条为生物医药产业提供资金支持&#xff…

service-mesh

01 架构的发展历史 1.1单机小型时代 1.2 垂直坼分 1.3 集群化负载均衡架构 用户量越来越大&#xff0c;就意味着需要更多的小型机&#xff0c;但是小型机价格昂贵&#xff0c;操作维护成本高。 此时更优的选择是采用多个 pc 机部署同一个应用的方案&#xff0c;但是此时就需…

P1039 [NOIP2003 提高组] 侦探推理

注意换行符&#xff01;&#xff01;&#xff01; 如果你使用getchar()系列函数读入&#xff0c;并且用换行符判定是否结束&#xff0c;则换行符会导致你WA掉&#xff01; linux下换行符为’\n’&#xff0c;windows下换行符为’\r\n’&#xff0c;如果数据是windows下造的&a…

单片机小项目——直流电机+按键

利用普中单片机的代码实现在按下第k个独立按键时&#xff0c;直流电机运作k秒 #include "reg52.h"typedef unsigned int u16; //对系统默认数据类型进行重定义 typedef unsigned char u8; sbit DC_MotorP1^0; //定义独立按键控制脚 sbit KEY1P3^1; sbit KEY2P3^0; sb…

代码学习记录45---单调栈

随想录日记part45 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.04.17 主要内容&#xff1a;今天开始要学习单调栈的相关知识了&#xff0c;今天的内容主要涉及&#xff1a;每日温度 &#xff1b;下一个更大元素 I 739. 每日温度 496.下一个更大元素 I Topic…

【力扣】55. 跳跃游戏 - 力扣(LeetCode)

Problem: 55. 跳跃游戏 记录自己解答的思路和代码 文章目录 问题思路复杂度Code 问题 思路 这个题的主要思路就是先找到0对应的位置&#xff0c;然后标记起来对应left&#xff0c;如果只有一个零&#xff0c;只需要left后面的数中有>1的数就能跳过去&#xff0c;如果是00&a…

静态成员与友元,内部类初识

一.静态成员 1.静态成员变量 &#xff08;1&#xff09;定义&#xff1a; 类的定义中以静态声明的变量 &#xff08;2&#xff09;写法&#xff1a; static 变量声明 &#xff08;3&#xff09;注意&#xff1a; 静态成员变量不在对象中&#xff0c;在静态区&#xff0c…

ROS仿真小车(二)——添加摄像头雷达传感器

文章目录 前言一、在 Rviz 中显示一个盒状机器人1.1 创建ROS功能包1.2 在 launch 文件中集成 URDF 与 Rviz1.3 在 Rviz 中显示机器人模型1.4 优化 rviz 启动 二、创建一个四轮圆柱状机器人模型2.1 配置urdf和launch文件2.2 URDF优化_xacro2.2.1 配置xacro文件2.2.2 编写 Xacro …

深度学习:Pytorch分布式训练

深度学习&#xff1a;Pytorch分布式训练 简介模型并行数据并行参考文献 简介 在深度学习领域&#xff0c;模型越来越庞大、数据量不断增加&#xff0c;训练这些大型模型越来越耗时。通过在多个GPU或多个节点上并行地训练模型&#xff0c;我们可以显著减少训练时间。此外&#…

【Canvas与艺术】绘制黑白山间野营Camping徽章

【说明】 中间的山月图是借用的网上的成图&#xff0c;不是用Canvas绘制的。 【成果图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head>…

Ocr识别

https://blog.csdn.net/qq_47571357/article/details/132017514 Tesserocr 的安装 https://cuiqingcai.com/31102.html https://digi.bib.uni-mannheim.de/tesseract/ https://zhuanlan.zhihu.com/p/642903270 https://segmentfault.com/a/1190000039929696

fdisk使用的MBR分区

MBR和GPT分区 MBR分区 MBR分区一般在分区的时候 &#xff0c;MBR分区格式只能支持2TB以下的硬盘容量。 分区最多为4个主分区 或 3个主分区和1个扩展分区&#xff0c;而创建扩展分区后可以分无数个逻辑分区&#xff0c;当然跟磁盘容量有关&#xff0c; 逻辑分区在扩展分区上…

Windows 下 bat 脚本调用 Git bash 环境 sh 脚本

1、先找到 Git 安装目录 D:\Install\Git 2、Git bash 编写 sh 脚本 start.sh脚本 3、编写 start.bat脚本 echo offcd /d %~dp0 "D:\Install\Git\bin\sh.exe" --login -i -c "./test/start.sh"pause4、执行 bat 脚本 双击 start.bat 我们下期见&#xf…

运算符介绍

运算符介绍 运算符是一种特殊的符号&#xff0c; 用以表示数据的运算、 赋值和比较等。 算术运算符赋值运算符关系运算符 [比较运算符]逻辑运算符位运算符 [需要二进制基础]三元运算符 算术运算符 算术运算符是对数值类型的变量进行运算的&#xff0c; 在 Java 程序中使用的…

Meta Llama 3 简介

文章目录 要点我们对 Llama 3 的目标最先进的性能模型架构训练数据扩大预训练规模指令微调与 Llama 3 一起建造系统级责任方法大规模部署 Llama 3Llama 3 的下一步是什么&#xff1f;立即尝试 Meta Llama 3 本文翻译自&#xff1a;https://ai.meta.com/blog/meta-llama-3/ 要点…