string模板类介绍

宇树机器人G1二次开发:语音对话、打断与激活功能实现指南 宇树机器人G1是一款功能强大的四足机器人,其开放的SDK和API为开发者提供了广阔的二次开发空间。其中,语音交互是提升机器人智能化水平和用户体验的关键功能。本文将详细介绍如何在宇树机器人G1上进行二次开发,实现。语音打断允许用户在机器人说话时随时中断并输入新指令,这是提升交互自然度的关键功能。三大核心功能,帮助你构建更自然、更智能的人机交互系统。语音识别是将用户的语音输入转换为文本的过程。识别文本后,需要理解用户意图并生成回复。将文本回复转换为语音输出。 阅读详情

string类是基于下述模板定义的:


     template<class charT,class traits = char_traits<charT>,
               class Allocator = allocator<charT> >
     class basic_string { ... };

 

     其中,charT是存储在字符串中的类型;traits参数是一个类,它定义了类型要被表示为字符串时,所必须具备的特征。


     例如,它必须有length()方法,该方法返回被表示为charT数组的字符串的长度。这种数组结尾用charT(0)值(广义的空值字符)表示(表达式charT(0)将0转换为charT类型。它可以像类型为char时那样为零,也可以是charT的一个构造函数创建的对象)。这个类还包含用于对值进行比较等操作的方法。


    Allocator参数是用于处理字符串内存分配的类。默认的allocator<char>模板按标准方式使用new和delete。

 

两种预定义的具体化:
typedef basic_string<char> string;
typedef basic_string<wchar_t> wstring;

 

上述具体化又使用下面的具体化:
char_traits<char>
allocator<char>
char_traits<wchar_t>
allocator<wchar_t>

 

     除char和wchar_t外,还可以通过定义traits类和使用basic_string模板来为其他一些类型创建一个string类。

 

13种类型和一个常量

basic_string模板定义了几种类型,供以后定义方法时使用:
typedef traits                                                     traits_type;
typedef typename traits::char_type                  value_type;
typedef Allocator                                               allocator_type;
typedef typename Allocator::size_type             size_type;
typedef typename Allocator::difference_type    difference_type;
typedef typename Allocator::reference              reference;
typedef typename Allocator::const_reference   const_reference;
typedef typename Allocator::pointer                 pointer;
typedef typename Allocator::const_pointer      const_pointer;

 

     traits是一个将对应于某个具体类型(如char_traits<char>)的模板参数;traits_type将成为该具体类型的typedef。下述表示法:
     typedef typename traits::char_type            value_type;
意味着char_type是traits表示的类中定义的一个类型名。关键字typename告诉编译器:表达式traits::char_type是一种类型。例如,对于字符串具体化,value_type为char 。

 

     size_type与size_of的用法相似,只是它根据存储的类型返回字符串的长度。对于string具体化,将根据char返回字符串的长度,在这种情况下,size_type与size_of等效。size_type是一种无符号类型。

 

     difference_type用于度量字符串中两个元素之间的距离(单位为元素的长度)。通常,它是底层类型size_type有符号版本。

 

     对于char具体化来说,pointer的类型为char * ,而reference的类型为char & 。不过,如果要为自己设计的类型创建具体化,则这些类型(pointer和reference)可以指向类,与基本指针和引用有相同的特征。

 

为将标准模板库(STL)算法用于字符串,该模板定义了一些迭代器类型:
typedef (models random access iterator)           iterator;
typedef (models random access iterator)           const_iterator;
typedef std::reverse_iterator<iterator>             reverse_iterator;
typedef std::reverse_iterator<const_iterator>   const_reverse_iterator;

 

该模板还定义了一个静态常量:
static const size_type npos = -1;
由于size_type是无符号的,因此将-1赋给npos相当于将最大的无符号值赋给它,这个值比可能的最大数组索引大1。

 

数据信息

     下表列出了一些方法,他们的返回值可用来描述构造函数和其他方法的效果。其中大部分术语来自STL。

 

 

string数据方法

 

 

     begin()、rend()、data()和c_str()它们都与字符串的第一个字符相关,但相关的方式不同。


     begin()和rend()方法返回一个迭代器,这是一种广义指针。begin()返回一个正向迭代器模型,而rend()返回反转迭代器的一个副本。这两种方法都引用了string对象管理的字符串(由于string类使用动态内存分配,因此实际的string内容不一定位于对象中,因此,我们使用术语“管理”来描述对象和字符串之间的关系)。


     可以将返回迭代器的方法用于基于迭代器的STL算法中。例如,使用STL reverse()函数来反转字符串的内容:
string word;
cin>>word;
reverse(word.begin(),word.end());

 

     data()和c_str()方法返回常规指针。返回的指针将指向存储字符串字符的数组的第一个元素。该数组可能(但不一定)是string对象管理的字符串的副本(string对象采用的内部表示可以是数组,但不一定非得是数组)。由于返回的指针可能指向原始数据,而原始数据是const,因此不能用它们来修改数据。另外,当字符串被修改后,将不能保证这些指针是有效的,这表明它们可能指向原始数据。


     c_str()指向的数组以空值字符(或与之等价的其他字符)结束。


     data()只是确保实际的字符串是存在的。

     因此,data()和size()可用作这种函数的参数,即指向数组元素的指针和表示要处理的元素数目的值:
string vampire("Do not stake me, oh my darling! ");
int vlad = byte_check(vampire.data(), vampire.size());

 

     C++实现可能将string对象的字符串表示为动态分配的C-风格字符串,并使用char *指针来实现正向迭代器。这种情况下,实现可能让begin()、data()和c_str()都返回同样的指针,但返回指向3个不同的数据对象的引用也是合法的(虽然更复杂)。

 

6个构造函数和1个析构函数:
explicit basic_string(const Allocator & a = Allocator());

basic_string(const charT * s, const Allocator & a = Allocator());

basic_string(const basic_string & str, size_type pos = 0,size_type n = npos,

                   const Allocator & a = Allocator());

basic_string(const charT * s, size_type n,const Allocator & a = Allocator());

basic_string(size_type n, charT c, const Allocator & a = Allocator());

template<class InputIterator>
basic_string(InputIterator begin, InputIterator end,const Allocator & a = Allocator());

 

~basic_string();

 

其中每个构造函数都有参数: const Allocator & a = Allocator()

     Allocator是用于管理内存的allocator类的模板参数名;Allocator()是这个类的默认构造函数。因此,默认情况下,构造函数将使用allocator对象的默认版本,但它们使得能够选择用allocator对象的其他版本。

 

默认构造函数原型如下:
explicit basic_string(const Allocator & a = Allocator());

 

通常,接受allocator类的默认参数,并使用构造函数来创建空字符串:
string bean;
wstring theory;

 

该构造函数被调用后,存在下面的关系:
(1) data()方法返回一个非空指针,可以将该指针加上0 。
(2) size()方法返回 0 。
(3) capacity()的返回值是不确定的。


将data()返回的值赋值给指针str后,第一个条件意味着str+0是有效的。

 

使用数组的构造函数
    该方法让其能够将string对象初始化为一个C-风格字符串;从更普遍的意义来看,它使得能将charT具体化初始化为一个charT数组:

 

    basic_string(const charT * s, const Allocator & a = Allocator());

 

    为确定要复制的字符数,该构造函数将traits::length()方法用于s指向的数组(指针s不能为空值)。例如:

    string toast("here's looking at you,kid. ");


    使用指定的字符串来初始化toast对象。char类型的trsits::length()方法将使用空值字符来确定要复制多少个字符。

 

该构造函数被调用后,存在下面的关系:
(1) data()方法返回一个指针,该指针指向数组s的一个副本的第一个元素。
(2) size()方法返回的值等于trsits::length()的值。
(3) capacity()方法返回一个至少等于size()的值。

 

使用部分数组的构造函数
    该方法让其能够使用C-风格字符串的一部分来初始化string对象;从更广泛的意义上说,使得能够使用charT数组的一部分来初始化charT具体化:

 

    basic_string(const charT * s, size_type n,const Allocator & a = Allocator());

 

    该构造函数将s指向的数组中的n个字符复制到构造的对象中。如果n大于s的长度,该方法将把字符串后面的内存内容解释为charT类型的数据。

 

    该构造函数要求s不能是空值指针,同时n < npos(npos是一个静态类常量,它是字符串可能包含的最大元素数目)。如果n等于npos,将引发一个out_of_range异常(由于n的类型为size_type,而npos是size_type的最大值,因此n不能大于npos);否则,在该构造函数被调用后,存在下面的关系:
(1) data()方法返回一个指针,该指针指向数组s的一个副本的第一个元素。
(2) size()方法返回n 。
(3) capacity()方法返回一个至少等于size()的值。

 

复制构造函数

 

     basic_string(const basic_string & str, size_type pos = 0,size_type n = npos,

                      const Allocator & a = Allocator());

 

     调用复制构造函数时如果只提供一个basic_string参数,新对象将被初始化为该string参数:
string mel("i'm ok! ");
string ida(mel);
其中,ida将是mel管理的字符串副本。

 

     参数pos指定了源字符串中的位置,将从这个位置开始进行复制:
string att("Telephone home.");
string et(att,4);

位置编号从0开始。et被初始化为"phone home" 。

 

     参数n指定要复制的最大字符数目:
string att("Telephone home.");
string pt(att,4,5);

将pt初始化为字符串"phone"。

 

     该构造函数不能跨越源字符串的结尾。因此,实际复制的字符数量等于n和str.size()-pos中较小的一个。

 

     该构造函数要求pos不大于str.size(),就是说,被复制的初始位置必须位于元字符串中。否则将引发out_of_range异常。

 

该构造函数被调用后,copy_len将是n和str.size()-pos中较小的一个,并存在下面的关系:
(1) data()方法返回一个指向字符串str的指针,该字符串包含copy_len个元素,这些元素是从str的pos位置开始复制而得到的。
(2) size()方法返回copy_len。
(3) capacity()方法返回一个不小于size()的值。

 

使用一个字符的n个副本的构造函数

 

     basic_string(size_type n, charT c, const Allocator & a = Allocator());

 

     该构造函数要求n < npos ,否则将引发out_of_range异常。

 

该构造函数被调用后,将存在下面的关系:
(1) data()方法返回一个指向字符串第一个元素的指针,该字符串有n个元素组成,其中每个元素的值都为c 。
(2) size()方法返回n 。
(3) capacity()方法返回一个不小于size()的值。

 

使用区间的构造函数

     该方法使用一个用迭代器定义的、STL-风格的区间:

 

     template<class InputIterator>
     basic_string(InputIterator begin, InputIterator end,const Allocator & a = Allocator());

 

     begin迭代器指向源字符串中药复制的第一个元素,end指向要复制的最后一个元素的后面。

 

     这种构造函数可用于数组、字符串或STL容器:

char cole[40] = "Old king Cole was a merry old soul.";
string title (cole+4,cole+8);
vector<char> input;
char ch;
while(cin.get(ch) && ch != '/n')
     input.push_back(ch);
string str_input(input.begin(),input_end() );

 

     上述第一种用法中,InputIterator的类型为const char * ;

     在第二种用法中,InputIterator的类型为vector<char>::iterator 。

 

该构造函数被调用后,将存在下面的关系:
(1) data()方法返回一个指向字符串第一个元素的指针,该字符串是通过复制区间[begin, end)中的元素得到的。
(2) size()方法返回begin到end之间的距离(度量距离时,使用的单位为迭代器解除引用得到的数据类型的长度)。
(3) capacity()方法返回一个不小于size()的值。

 

内存相关

 

下图列出了一些与内存相关的方法

 

 

string类内存有关的方法

MATLAB实战:纯电动汽车动力性仿真从入门到精通(附完整代码) 本文提供了一份基于MATLAB的纯电动汽车动力性仿真从入门到精通的实战指南。通过理论建模与代码实战相结合,详细讲解了如何构建行驶阻力模型、驱动力平衡方程,并利用MATLAB脚本完整实现了最高车速、加速时间和最大爬坡度三大核心性能指标的仿真计算。文章附有完整代码,帮助工程师快速掌握纯电动汽车动力性仿真的核心技能,为设计与优化提供高效的数字工具。 阅读详情

相关推荐

STM32CubeMX——循迹传感器TCRT5000的使用

前言 人生如逆旅,我亦是行人。 ————苏轼《临江仙·送钱穆父》 一、介绍 TCRT5000描述:(带有晶体管输出的反射光学传感器) TCRT5000是一种反射式光学传感器,它包括一个红外发射器和一个3.5mm引线封装的光电晶体管,可阻挡可见光。还具有1mA 典型被测输出电流,2.5mm峰值工作距离,可应用传感与仪表,工业等行业。 TCRT5000具有紧凑的结构,其中发射光源和探测器布置在同一方向,通过使用来自物体的反射红外光束来感知物体的存在。工作波长为950毫米,探测器由光电晶体管组成

W_Oilpicture的博客 1万+

了解string类

了解string类

weixin_53230235的博客 590

TOEIC托业词汇汇总(完整版)

1.appointment 约会,约定2.attendance 出席人数;出席3.cabinet 橱柜4.calendar 日历;月历;行事历5.clerk 办事员,书记6.directory 人名住址薄7.duplicte 复制;副本8.filing 归档9.in-tray 待处理文件盒10.monitor 检测;监视;追踪11.out-tray 已处理文件盒12.partition 分隔;分隔物(如墙壁等)13.postage 邮费。

weixin_39676449的博客 1万+

Java 字符串模板尝鲜:丑?快点端上来吧

我们介绍了 JDK 21 里即将进入预览阶段的字符串模板。大体上其语法就是字符串处理器."字符串模板", 例如或是。语法抛开审美不谈看起来可能的确还行。实现上也通过和留出了用户自定义的空间。另外,编译器也对内置的STR等处理器进行了各种各样的优化,性能不比普通的字符串拼接差。Java 天下苦字符串拼接久矣!我个人还是非常期待这个特性的正式上线的。虽然之前还是对\{的语法不太满意,但写到这里我已经被我自己说服了。你怎么看?

BASK2312的博客 3000

UWB灵犀遥控器方案介绍

UWB灵犀指向遥控器的技术原理和方案介绍

xiongdauwb的博客 3898

【即插即用模块】注意力篇 | TGRS 2025 | MFA聚特征+HPDown保细节+HFF融层级,三大模块各司其职,性能翻倍!

本文介绍了MTMLNet网络中的三大核心模块:MFA(多阶段特征聚合)、HPDown(混合池化下采样)和HFF(分层特征融合)。MFA通过双尺度深度卷积和注意力机制增强特征提取能力;HPDown结合平均池化和最大池化,有效保留下采样过程中的特征信息;HFF采用三注意力机制实现自适应特征融合。这三个模块协同工作,在红外小目标检测与分割任务中取得了SOTA效果。实验表明,各模块在特征提取、信息保留和融合方面均优于传统方法,可灵活应用于各类视觉任务中。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 285

string类模板(上集)

string类

m0_69126768的博客 139

嵌入式工程师成长之路(1)——元件基础(试读版)

上拉电阻阻值选错导致MCU反复重启?0欧电阻竟然能“背锅”信号干扰?高精密采样电阻的温漂毁了整个控制系统?——这些问题,都是基础不牢!优快云硬件领域头部博主十年经验汇总,涵盖电阻分类、封装、实战选型、避坑指南,附带职业进阶路径,助你从小白进阶为“电路医生”!

云轩阁 34万+

【c++】:STL模板中string的使用

文章目录 STL简介 一.认识string 二.string中基本功能的使用 总结 STL简介 STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。 STL的版本 原始版本 Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费

Sxy_wspsby的博客 1863

开放平台实现安全的身份认证与授权原理与实战:使用OAuth 2.0实现授权码模式

作者:禅与计算机程序设计艺术 1.背景介绍 随着互联网应用的飞速发展,各种网站、App、小程序等都将逐渐向用户提供了丰富的功能和服务。在这些应用中,用户通常需要登录才能使用这些服务,这就涉及到用户信息的安全问题。如果用户的信息被泄露或篡改,那么可能造成严重后果。因此,为这些应用提供安全且健壮的身份验

AI天才研究院 494

vue3 - vite报错TypeError: crypto.hash is not a function(vue3+vite启动运行提示错误,项目无法启动且打包报错失败,详细解决排查方案教程)

vue3 vite 报错,vue3+vite启动报错:TypeError: crypto.hash is not a function,创建vue3+vite项目时报错TypeError: crypto.hash is not a function,如何解决这个问题,VUE3+VITE报错crypto.hash,vue3运行报错,vite运行报错,vue3打包报错,vite打包报错,vue3新建项目无法运行,vue3 vite创建项目直接报错了,node版本不兼容,修改了node版本还是不行,依旧报错,一直

✅ 精选推荐文章 1万+

字符串和流

字符串一、char_traits 字符特征类1)意义:包装特定串元素的通用行为界面,以便容器实现时依据特征信息而执行特定行为2)定义了通用类型名typedef _Elem char_type;typedef int int_type;typedef streampos pos_type;typedef streamoff off_type;typedef mbstate_t state_t

jia_xiaoxin的专栏 2474

5.3-集群电源模式解析

DSU-120 DynamIQ™集群支持9种电源模式,包括正常运行(ON)、完全断电(OFF)、三种数据保持模式(FUNC_RET、FULL_RET、MEM_RET)、两种调试模拟模式(OFF_EMU、MEM_RET_EMU),以及系统恢复模式(WARM_RST、DBG_RECOV)。这些模式通过智能管理电源状态,在保持数据完整性的同时实现功耗优化,并为系统调试和故障恢复提供支持。不同模式在RAM保持、逻辑断电和调试能力方面各有侧重,满足从正常运行到深度调试等不同场景需求。

baron-周贺贺-代码改变世界ctw 116

string类和原始的basic_string的模板类

string类和原始的basic_string的模板类

ERAtime的博客 874

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

go使用接口类型实现“模板类”

C++支持多态,可以通过重载和模板实现多态,其中模板类这个功能我感觉很方便,比如想写一个栈类型,可以通过模板类,只定义一个类,就能让这个栈支持int,double,char等多种数据类型。 go语言呢,不支持多态,自然也就没有模板这个概念,但是没有关系,go语言的设计者自然知道多态的好处,只是觉得重载这个概念不好理解,所以把多态这个东西给去掉了,取而代之的是一种更简单的编程方式-接口。 下面我...

djqueen的博客 9958

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【C++】C++中关于string类的一些API总结

C++中关于STRING类的一些API总结

tangxz的博客 1252

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C++详解string(全面解析)

npos:实际上是‘-1’,底层存的是补码,也就是42亿九千万,换句话说’-1‘代表不可能开出这么大的连续空间,所以npos代表取到字符串的结尾。作用:可以在string后面追加字符串,而且有多种功能,例如:追加一个字符串的一部分,多个相同的字符等等,我们举一两个代码例子看一下。基于模板的出现,C++中就出现了各种模板类,而我们仅需要调用对应的模板类即可使用,十分的方便,今天我们来学习C++中第一个模板类——【】重载,在函数重载的那章见过,所以这里就不过多介绍,普通版本可读可写,const版本只读。

2301_77125473的博客 3855

【C++指南】string(一):string从入门到掌握

字符串处理无疑是一项极为基础且频繁的操作,从简单的文本输入输出,到复杂的文本分析与处理,字符串贯穿于程序的各个角落。 而 C++ 中的string类型,作为处理字符串的核心工具,为开发者提供了一种高效、便捷且安全的方式来操作字符序列。 本文将深入探讨 C++ 中string的奥秘,从其产生的根源basic_string模板类开始,逐步介绍std::string、wstring、u16string和u32string等相关类型,揭示它们之间的关系,以及它们与std库的紧密联系,并对basic_string

倔强的石头的博客 3286

C++ 模板类

类似vector<int> 这种带<int> 就是模板类 看这段代码#include <iostream> using namespace std; template <class T> class Man { private: T v; public: void setV(T vv); T getV(); };template <class T> void Man<T>::setV

more time 324

string类、string类的常用接口说明等的介绍

string类、string类的常用接口说明等的介绍string类、string类的常用接口说明等的介绍。

Farewell_me的博客 487

C++ 之 String类详解

String小引string类常用接口常见构造容量操作访问操作修改操作string类非成员函数 小引 C语言中,字符串是以\0结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP(面向对象)的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。 C++中就引入了String类,它可以看做是一个管理字符串的数据结构。...

giturtle's blog 1万+

string使用及模拟实现

string 类

2301_79108642的博客 891

c++ string类_C++|细说STL string类概貌及底层细节

C语言中的字符串称为C风格字符串,是一个以'0'结尾的字符数组,string.h库只提供了有限、不甚安全的字符串操作函数。char str[]只能定义编译期确定大小的字符串,而保存在堆内存的动态字符数组却需要考虑释放内存的问题,且想要实现自变长的弹性大小也存在诸多纷繁的操作细节。C++ STL中的string类一揽子解决了诸如此类的问题。除此以外,STL算法通过traits和iterator中间层...

weixin_39542514的博客 448

【C++】string

C语言中,字符串是以 ‘\0’ 结尾的一些字符的集合,为了操作方便,C标准库中提供了一些 str 系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。的时候,为了方便查看字符串,我们可以重载流插入和流提取,方便打印查看字符串;在以前讲过,我们为了方便我们的使用以及体现流插入和提取的使用价值,我们要在类外面实现,防止。或者容量是 0,我们就默认开 4 个容量。类的接口,在实现的过程中讲解用法,注意,我们只模拟比较常见和重要的接口。

YoungMLet的博客 962

【C++】string类

string类

yyf_优快云_blog的博客 2957

std::string实现说明

string的声明为:typedef basic_string&lt;char, char_traits&lt;char&gt;, allocator&lt;char&gt;&gt; string;从定义来看,string类型的本质是一个模板类,是basic_string&lt;char, char_traits&lt;char&gt;,allocator&lt;char&gt;&gt;的“简称”...

tiandao2009的博客 1848
上一篇: string类方法介绍
下一篇: 异常处理
TypeCool
博客等级 码龄22年 58粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值