STL 容器一些底层机制

错误操作和STL容器迭代器底层实现机制的探索 然而,这是错误的,因为在删除元素后,迭代器的状态会变得无效,使用它来继续遍历将导致未定义的行为。STL容器的迭代器是指向容器中元素的对象。STL迭代器通常是使用指针实现的,尽管这种实现方式可能因不同的容器类型而有所不同。STL容器通常提供了一些方法来处理元素的添加和删除,这些方法会正确地处理与迭代器相关的问题。在本文的示例中,我们展示了如何避免错误的操作并正确地使用STL容器迭代器。然而,这是错误的,因为在添加元素后,迭代器的状态会变得无效,使用它来继续遍历将导致未定义的行为。 阅读详情

1、vector 容器

vector 的数据安排以及操作方式,与 array 非常相似。两者的唯一区别在于空间的运用的灵活性。array 是静态空间,一旦配置了就不能改变,vector 是动态数组。在堆上分配空间。vector 是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素(有保留内存,如果减少大小后内存也不会释放。如果新值>当前大小时才会再分配内存,这大大影响了 vector 的效率,)。因此,vector 的运用对于内存的合理利用与运用的灵活性有很大的帮助,我们再也不必因为害怕空间不足而一开始要求一个大块的 array。

vector 动态增加大小,并不是在原空间之后持续新空间(因为无法保证原空间之后尚有可供配置的空间),而是以原大小的两倍另外配置一块较大的空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新元素,并释放原空间。因此,对 vector 的任何操作,一旦引起空间重新配置,同时指向原vector 的所有迭代器就都失效了。

对最后元素操作最快(在后面添加删除最快),此时一般不需要移动内存。对中间和开始处进行添加删除元素操作需要移动内存。如果你的元素是结构或是类,那么移动的同时还会进行构造和析构操作,所以性能不高(最好将结构或类的指针放入 vector 中,而不是结构或类本身,这样可以避免移动时的构造与析构)。访问方面,对任何元素的访问都是 O(1),也就是常数时间的。 

总结:

 vector 常用来保存需要经常进行随机访问的内容,并且不需要经常对中间元素进行添加删除操作。


2、list 容器

相对于 vector 的连续空间,list 就显得复杂许多,它的好处是每次插入或删除一个元素,就配置或释放一个元素空间,元素也是在堆中。因此,list 对于空间的运用有绝对的精准,一点也不浪费。而且,对于任何位置的元素插入或元素移除,永远是常数时间。STL 中的list 底层是一个双向链表,而且是一个环状双向链表。这个特点使得它的随即存取变的非常没有效率,因此它没有提供 [] 操作符的重载。

总结:

如果你喜欢经常添加删除大对象的话,那么请使用 list;
要保存的对象不大,构造与析构操作不复杂,那么可以使用 vector 代替。
list<指针> 完全是性能最低的做法,这种情况下还是使用 vector<指针> 好,因为指针没有构造与析构,也不占用很大内存


3、deque 容器

deque 是一种双向开口的连续线性空间,元素也是在堆中。所谓双向开口,意思是可以在队尾两端分别做元素的插入和删除操作。deque 和 vector 的最大差异,一在于 deque 允许于常数时间内对起头端进行元素的插入或移除操作,二在于deque没有所谓容量观念,因为它是动态地以分段连续空间组合而成,随时可以增加一段新的空间并链接在一起。换句话说,像 vector 那样“因旧空间不足而重新配置一块更大空间,然后复制元素,再释放旧空间”这样的事情在 deque 是不会发生的。它的保存形式如下:
[堆1] --> [堆2] -->[堆3] --> ...
deque 是由一段一段的定量连续空间构成。一旦有必要在 deque 的前端或尾端增加新空间,便配置一段定量连续空间,串接在整个 deque 的头端或尾端。deque 的最大任务,便是在这些分段的定量连续空间上,维护其整体连续的假象,并提供随机存取的接口。避开了“重新配置,复制,释放”的轮回,代价则是复杂的迭代器架构。因为有分段连续线性空间,就必须有中央控制器,而为了维持整体连续的假象,数据结构的设计及迭代器前进后退等操作都颇为繁琐。

deque 采用一块所谓的 map 作为主控。这里的 map 是一小块连续空间,其中每个元素都是指针,指向另一段连续线性空间,称为缓冲区。缓冲区才是 deque 的存储空间主体。( 底层数据结构为一个中央控制器和多个缓冲区)SGI STL 允许我们指定缓冲区大小,默认值 0 表示将使用 512 bytes 缓冲区。

支持[]操作符,也就是支持随即存取,可以在前面快速地添加删除元素,或是在后面快速地添加删除元素,然后还可以有比较高的随机访问速度和vector 的效率相差无几。deque 支持在两端的操作:push_back,push_front,pop_back,pop_front等,并且在两端操作上与 list 的效率也差不多。
在标准库中 vector 和 deque 提供几乎相同的接口,在结构上区别主要在于在组织内存上不一样,deque 是按页或块来分配存储器的,每页包含固定数目的元素;相反 vector 分配一段连续的内存,vector 只是在序列的尾段插入元素时才有效率,而 deque 的分页组织方式即使在容器的前端也可以提供常数时间的 insert 和 erase 操作,而且在体积增长方面也比 vector 更具有效率。

总结
:

vector 是可以快速地在最后添加删除元素,并可以快速地访问任意元素;
list 是可以快速地在所有地方添加删除元素,但是只能快速地访问最开始与最后的元素;

deque 在开始和最后添加元素都一样快,并提供了随机访问方法,像vector一样使用 [] 访问任意元素,但是随机访问速度比不上vector快,因为它要内部处理堆跳转。deque 也有保留空间。另外,由于 deque 不要求连续空间,所以可以保存的元素比 vector 更大,这点也要注意一下。还有就是在前面和后面添加元素时都不需要移动其它块的元素,所以性能也很高。

因此在实际使用时,如何选择这三个容器中哪一个,应根据你的需要而定,一般应遵循下面的原则:

1、如果你需要高效的随即存取,而不在乎插入和删除的效率,使用 vector;
2、如果你需要大量的插入和删除,而不关心随即存取,则应使用 list;

3、如果你需要随即存取,而且关心两端数据的插入和删除,则应使用deque。


4、stack

stack 是一种先进后出(First In Last Out , FILO)的数据结构。它只有一个出口,stack 允许新增元素,移除元素,取得最顶端元素。但除了最顶端外,没有任何其它方法可以存取stack的其它元素,stack不允许遍历行为。
以某种容器( 一般用 list 或 deque 实现,封闭头部即可,不用 vector 的原因应该是容量大小有限制,扩容耗时)作为底部结构,将其接口改变,使之符合“先进后出”的特性,形成一个 stack,是很容易做到的。deque 是双向开口的数据结构,若以 deque 为底部结构并封闭其头端开口,便轻而易举地形成了一个stack。因此,SGI STL 便以 deque 作为缺省情况下的 stack 底部结构,由于 stack 系以底部容器完成其所有工作,而具有这种“修改某物接口,形成另一种风貌”之性质者,称为 adapter(配接器),因此,STL stack 往往不被归类为 container(容器),而被归类为 container adapter。

5、 queue

queue 是一种先进先出(First In First Out,FIFO)的数据结构。它有两个出口,queue 允许新增元素,移除元素,从最底端加入元素,取得最顶端元素。但除了最底端可以加入,最顶端可以取出外,没有任何其它方法可以存取 queue 的其它元素。
以某种容器 (  一般用 list 或 deque 实现,封闭头部即可 ,不用 vector 的原因应该是容量大小有限制,扩容耗时 )作为底部结构,将其接口改变,使之符合“先进先出”的特性,形成一个 queue,是很容易做到的。deque 是双向开口的数据结构,若以 deque 为底部结构并封闭其底部的出口和前端的入口,便轻而易举地形成了一个 queue。因此,SGI STL 便以 deque 作为缺省情况下的 queue 底部结构,由于 queue 系以底部容器完成其所有工作,而具有这种“修改某物接口,形成另一种风貌”之性质者,称为 adapter(配接器),因此,STL queue 往往不被归类为container(容器),而被归类为 container adapter。

stack 和 queue 其实是适配器,而不叫容器,因为是对容器的再封装。

6、heap

heap 并不归属于 STL 容器组件,它是个幕后英雄,扮演 priority queue(优先队列)的助手。priority queue 允许用户以任何次序将任何元素推入容器中,但取出时一定按从优先权最高的元素开始取。按照元素的排列方式,heap 可分为 max-heap 和 min-heap 两种,前者每个节点的键值(key)都大于或等于其子节点键值,后者的每个节点键值(key)都小于或等于其子节点键值。因此, max-heap 的最大值在根节点,并总是位于底层array或vector的起头处;min-heap 的最小值在根节点,亦总是位于底层array或vector起头处。STL 供应的是 max-heap,用 C++ 实现。
堆排序 C++ 语言实现: 点击这里。

7、priority_queue

priority_queue 是一个拥有权值观念的 queue,它允许加入新元素,移除旧元素,审视元素值等功能。由于这是一个 queue,所以只允许在底端加入元素,并从顶端取出元素,除此之外别无其它存取元素的途径。priority_queue 带有权值观念,其内的元素并非依照被推入的次序排列,而是自动依照元素的权值排列(通常权值以实值表示)。权值最高者,排在最前面。缺省情况下 priority_queue 系利用一个 max-heap 完成,后者是一个以vector 表现的 complete binary tree.max-heap 可以满足 priority_queue 所需要的“依权值高低自动递减排序”的特性。
priority_queue 完全以底部容器(一般为vector为底层容器)作为根据,再加上 heap 处理规则,所以其实现非常简单。缺省情况下是以 vector 为底部容器。queue 以底部容器完成其所有工作。具有这种“修改某物接口,形成另一种风貌“”之性质者,称为 adapter(配接器),因此,STL priority_queue 往往不被归类为 container(容器),而被归类为 container adapter。

8、set 和 multiset 容器

set 的特性是,所有元素都会根据元素的键值自动被排序。set 的元素不像 map 那样可以同时拥有实值(value)和键值(key),set 元素的键值就是实值,实值就是键值,set不允许两个元素有相同的值。set 底层是通过红黑树(RB-tree)来实现的,由于红黑树是一种平衡二叉搜索树,自动排序的效果很不错,所以标准的 STL 的 set 即以 RB-Tree 为底层机制。又由于 set 所开放的各种操作接口,RB-tree 也都提供了,所以几乎所有的 set 操作行为,都只有转调用 RB-tree 的操作行为而已。

multiset的特性以及用法和 set 完全相同,唯一的差别在于它允许键值重复,因此它的插入操作采用的是底层机制是 RB-tree 的 insert_equal() 而非 insert_unique()。

9、map 和 multimap 容器

map的特性是,所有元素都会根据元素的键值自动被排序。map 的所有元素都是 pair,同时拥有实值(value)和键值(key)。pair 的第一元素被视为键值,第二元素被视为实值。map不允许两个元素拥有相同的键值。由于 RB-tree 是一种平衡二叉搜索树,自动排序的效果很不错,所以标准的STL map 即以 RB-tree 为底层机制。又由于 map 所开放的各种操作接口,RB-tree 也都提供了,所以几乎所有的 map 操作行为,都只是转调 RB-tree 的操作行为。


multimap 的特性以及用法与 map 完全相同,唯一的差别在于它允许键值重复,因此它的插入操作采用的是底层机制 RB-tree 的 insert_equal() 而非 insert_unique。 


10、hash_set 和 hash_multiset 容器

hash_set 底层数据结构为 hash 表,无序,不重复。


hash_multiset 底层数据结构为 hash 表,无序,不重复。 


11、hash_map 和 hash_multimap 容器

hash_map 底层数据结构为 hash 表,无序,不重复。


hash_multimap 底层数据结构为 hash 表,无序,不重复。 

【RT-DETR涨点改进】独家注意力改进篇 | 手把手教你在RT-DETR上使用LSKAttention大核注意力机制(助力目标检测极限涨点)含多种创新改进点 本文提出了一种LSKA大核注意力机制优化RT-DETR模型的方法。LSKA通过将2D深度卷积核分解为级联的1D水平和垂直核,显著降低了计算复杂度和内存占用,尤其在处理大卷积核时优势明显。该模块在图像分类、目标检测等视觉任务中保持与LKA相当的性能,同时展现出更强的鲁棒性。文章详细介绍了LSKA的网络结构、核心代码实现方法,并提供了多种RT-DETR改进方案,包括rtdetr-r18-LSKA、rtdetr-l-LSKA等7种yaml配置文件,通过实验验证了该方法的有效性。 阅读详情

相关推荐

Vmware虚拟机克隆详解:固定ip + 修改uuid等内容

分两大步 设置固定ip 克隆后修改相关配置 本文引用的其他地方的图片。会附上链接 若侵权,删 一、设置静态ip 先进行虚拟网络的编辑 接下来的操作需要管理员权限。(给权限就完事了) 接下来设置网卡: 网络和共享中心→ 更改适配器设置→VMware Network Adapter VMnet8 -> 右键属性 修改TCP/Ipv4的配置,网上常见是这种,笔者是英文的...

Unknownfuture的博客 9070

STL常见容器和底层结构

C++ STL

fang_guobing的博客 357

安防相机宽动态(WDR)技术解析:从原理到实战应用

本文深入解析安防相机宽动态(WDR)技术原理,对比多次曝光与DOL-WDR等实现方式,并区分硬件WDR与数字WDR(DWDR)的本质差异。文章重点阐述了WDR在逆光出入口、夜间道路监控等五大典型场景的实战应用与调参技巧,旨在帮助用户根据实际需求正确选择与配置,确保监控系统在复杂光线下清晰成像。

weixin_29191081的博客 427

C++学习系列(10):STL 容器底层原理

✅vector适用于随机访问,但插入删除慢✅list适用于频繁插入删除,但访问慢✅map适用于有序存储查找 O(log N)✅适用于无序存储查找 O(1)下一篇C++学习系列(11),我们将探讨C++ 智能指针unique_ptrshared_ptr和weak_ptr,敬请期待!🚀💡。

Azperk的博客 940

TI电量计BQ40Z50R2循环学习实战:从量产文件生成到关键标志位解析

本文详细解析了TI电量计BQ40Z50R2的循环学习实战流程,从量产文件生成到关键标志位解析。通过实战案例和易错分析,帮助工程师避开常见陷阱,提升电量计配置效率。重点介绍了循环学习前的准备工作、量产文件生成步骤及关键标志位的深度解读,适用于电池管理系统开发人员。

weixin_30505225的博客 439

利用Matlab高效处理Comsol仿真数据的可视化技巧

本文详细介绍了如何将Comsol仿真数据高效导入Matlab并进行专业可视化与后处理。核心内容包括正确的数据导出格式设置、三维矩阵重构方法、二维截面与三维体渲染技巧,以及基于Matlab的定量分析与批处理自动化流程,帮助工程师和科研人员深度挖掘仿真数据价值,提升工作效率。

weixin_29065791的博客 362

C++常见STL的底层实现原理

Unorder_map和unorder_set: 使用哈希表将元素映射到元素中,提供了快速的查找,插入和删除。array:固定大小的数组容器,类似于原生数组,底层采用静态数组作为存储结构,提供了数组的各种操作方法。list:双向链表容器,底层由节点组成,每个节点包含元素值和指向后节点的指针,支持高效的插入和删除操作。vector:动态数组容器,底层使用连续的内存块存储元素,支持动态扩展和缩容,通过指针进行访问。set/map: 使用红黑树作为底层实现,保持元素的有序性,提供快速查找,插入和删除。

qq_61084129的博客 671

QML教程04 - Image:搞定界面上的所有图片

本文是QML教程系列的第四篇,重点讲解Image控件的实战用法。文章从图片显示常见的变形、卡顿等问题入手,详细介绍了Image的核心属性和使用技巧。主要内容包括:图片路径的三种写法(相对路径、qrc资源、网络URL)、最重要的fillMode属性解析(PreserveAspectFit、PreserveAspectCrop、Stretch的适用场景)、性能优化方法(sourceSize设置)、异步加载(asynchronous)以及圆形头像的实现方案。

BenBierBa的博客 1608

【C++入门】STL容器--vector底层数据结构剖析

vector在C++中非常重要的容器,在刷题中也经常使用,它是一个动态的数组,提供了快速的随机访问和在尾部的插入和删除操作。vector的底层实现也是非常优秀的数据结构,值得我们去学习鉴赏,使用STL我们需要做到三个境界:能用,明理,能扩展;所以了解它的基本底层原理也是非常有必要的。在本文中,我们深入探讨了STL容器中的vector,以及它的底层数据结构。vector的底层设计也是比较好的,值得每位初学者借鉴学习;

2202_75605090的博客 2684

Altium Designer 超详细入门教程

本文是一份Altium Designer新手入门教程,详细介绍了从软件基础到PCB制版的全流程。主要内容包括:软件界面介绍与工程创建方法;原理图设计中的元件放置、电气连线、标注添加等操作;PCB设计的布局布线、铺铜和DRC检查;Gerber和钻孔文件的导出方法。教程还提供了分类整理的实用快捷键表和新手避坑指南,强调原理图编译和DRC检查的重要性。通过本教程,新手可以快速掌握AD基本操作,完成简单电路板的设计与制版文件导出。

学习中...... 821

51智能小车(双轮)

前几天接了个小单子,是一个基于51单品机的作品,发现自己对小车的认识还是不太🆗。也算是完成了任了的;欢迎各位小伙伴来多多交流,大家一起进步。最后有需要单片机课程设计的小伙伴滴滴我哦(有偿)。企鹅:2397746994。

qq_56992543的博客 2346

关于C++STL的总结(基础使用)

C++ STL六大组件大致总结

m0_62126248的博客 1951

sam3.1 部署笔记 推理封装

sam3.1 部署笔记

jacke121的专栏 423

从底层了解STL的vector容器的扩容机制

GCC 中 vector 的核心成员封装在private:// 指向第一个元素的指针// 指向最后一个元素之后的位置(已用内存的末尾)// 指向已分配内存的末尾// ... 其他成员和方法。

2401_84073201的博客 1971

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

深度剖析C++ STL容器底层源码实现机制

通过对vector、list和map这三种典型的STL容器底层源码的分析,我们可以看到不同的数据结构在C++中的巧妙实现。map的实现较为复杂,它利用红黑树的特性来保证树的平衡,从而实现高效的查找、插入和删除操作。当元素个数超过当前容量时,vector会重新分配一块更大的内存空间,通常是原容量的两倍,然后将原数组中的元素复制到新数组中,最后释放原数组的内存。深入了解STL容器的底层源码实现机制,不仅有助于我们编写出更高效、更健壮的代码,还能让我们对C++语言的特性有更深刻的理解。T* finish;

2501_91651722的博客 960

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C++ STL容器底层机制

1、vector容器 vector的数据安排以及操作方式,与array非常相似。两者的唯一区别在于空间的运用的灵活性。array是静态空间,一旦配置了就不能改变。vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。因此,vector的运用对于内存的合理利用与运用的灵活性有很大的帮助,我们再也不必因为害怕空间不足而一开始要求一个大块的array。vector动态增加大小...

weixin_30768175的博客 68

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

c++ STL 容器一些底层机制

参考STL源码分析1、vector容器 vector的数据安排以及操作方式,与array非常相似。两者的唯一区别在于空间的运用的灵活性。array是静态空间,一旦配置了就不能改变。vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。因此,vector的运用对于内存的合理利用与运用的灵活性有很大的帮助,我们再也不必因为害怕空间不足而一开始要求一个大块的array。vect

没有对象就new一个呗~ 547

[转]STL 容器一些底层机制

1、vector 容器 vector 的数据安排以及操作方式,与 array 非常相似。两者的唯一区别在于空间的运用的灵活性。array 是静态空间,一旦配置了就不能改变,vector 是动态数组。在堆上分配空间。vector 是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素(有保留内存,如果减少大小后内存也不会释放。如果新值>当前大小时才会再分配内存,这大大影响了 ve...

weixin_33699914的博客 73

C++ 学习笔记:STL 容器一些底层机制

vector 容器 list 容器 deque 容器 stack queue heap priority_queue set 和 multiset 容器 map 和 multimap 容器 hash_set 和 hash_multiset 容器 hash_map 和 hash_multimap 容器

庚午步雲 5368

C++ STL 容器深入剖析:vector、list、map 等的底层实现

容器类型随机访问插入(中间)删除(中间)插入(末尾)删除(末尾)查找vectorO(1)O(n)O(n)O (1)(均摊)O(1)O(n)listO(n)O(1)O(1)O(1)O(1)O(n)mapO(log n)O(log n)O(log n)O(log n)O(log n)O(log n)O (1)(平均)O (1)(平均)O (1)(平均)O (1)(平均)dequeO(1)O(n)O(n)O(1)O(1)O(n)

数字魔方操控师的博客 1121

STL与数据结构

一. 各种容器的底层机制和常见面试题: 1.1 vector: 1.1.1 vector的底层原理: vector的底层实现是三个指针: struct _Vector_impl : public _Tp_alloc_type { pointer _M_start; pointer _M_finish; pointer _M_end_of_storage; }; start和finish之间是已经被使用的空间范围(即vector.size...

audio_algorithm的博客 782

STL源码剖析(侯捷版本) —— 第五章 关联式容器(二)

private:// set 的底层实现为 RB-tree// 红黑树表示 set// iterator 的类型为 const_iteratorset元素有序:插入的元素会根据键值自动排序。元素不能重复set中的元素是唯一的,插入相同的元素会被忽略。public:// 键值类型// 实值类型// 元素类型(键值/实值)// 键值比较函数private:// map 的底层机制 RB-tree// 红黑树表示 mappublic:// map 迭代器map。

weixin_42255569的博客 585

Day 4 学习计划:STL 底层实现与常用算法

每种容器底层结构 + 使用场景整理成表格sortmap用法和源码实现理解两道算法题题解(可打印 + 注释)策略模式的类图 + 代码总结。

苦哈哈的 C++ 程序员,写这个技术博客不是为了装逼,也不是为了立人设,是为了收割流量 996

容器删除元素后迭代器失效_(C++)错误的map删除操作和STL中容器的迭代器的底层实现机制...

1.错误的map删除操作假设有个map容器,用于存储大学班级中各个家乡省份对应的学生数,key为省份中文全拼,value为学生数。现需要删除人数为0的记录,删除代码如下:map countMap;for(map::iterator it=countMap.begin();it!=countMap.end();++it){if(it->second==0){countMap.erase(it)...

weixin_39586265的博客 1256

《C++容器适配器核心技术解构:stack的底层机制与工程实践(下)》

deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1)。与vector比较,头插效率高,不需要搬移元素。与list比较,空间利用率比较高。但是deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组,其底层结构如下图所示:deque的底层结构双端队列底层是一段假象的连续空间,实际是分段连续的,为了维护其“整体连续”以及随机访问的假象,落在了deque的迭代器身上。

chenyuhao2024的博客 697
上一篇: http中get与post的区别
下一篇: 排序算法总结
Solid7
博客等级 码龄11年 2粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值