一个简单的Heap实现

理解 heap --- 实现一个简单的 malloc 欢迎分享,微博 老和山小范 ,博客 wsfdl.com理解 Heap high address +---------------+ | | | Stack | | | +--------- 阅读详情

以下代码实现了一个堆,可以传入仿函数来决定生成最大堆或最小堆。

#ifndef _HEAP_
#define _HEAP_

#include"../Vector/Vector.h"
#include<string>
using namespace std;

template<typename T>
class Less{
public:
    bool operator()(const T& t1,const T& t2)
    {
        return t1<t2;
    }
};

template<typename T>
class Greater{
public:
    bool operator()(const T& t1,const T& t2)
    {
        return t1>t2;
    }
};

template<typename T,typename Compair=Less<T>>
class heap{
public:
    heap():_vector()
    {}
    heap(const MyVector<T>& v):_vector(v)
    {
        make_heap();
    }
    ~heap()
    {}
    heap(const heap& h)
    {
        _vector=h._vector;
    }
    heap& operator=(const heap& h)
    {
        _vector=h._vector;
    }
    const T& top()
    {
        if(empty())
            throw new string("heap is null!");
        return _vector[0];
    }
    void make_heap()
    {
        int i;
        int n=_vector.size();
        for(i=n/2;i>=0;--i)
        {
            _JustDown(i,n);
        }
    }
    void push_heap(const T& t)
    {
        Compair cp;
        _vector.push_back(t);
        int i=_vector.size()-1;
        for(;i>=0;)
        {
            if(cp(_vector[i],_vector[i/2]))
            {
                swap(_vector[i],_vector[i/2]);
                i=i/2;
            }
            else
            {
                break;
            }
        }
    }
    bool empty()
    {
        return _vector.empty();
    }
    size_t size()
    {
        return _vector.size();
    }
    T pop_heap()
    {
        if(empty())
            throw new string("heap is null!");
        swap(_vector[0],_vector[_vector.size()-1]);
        T tmp=_vector[_vector.size()-1];
        _vector.pop_back();
        _JustDown(0,_vector.size());
        return tmp;
    }
    void sort_heap()
    {
        if(empty())
            throw new string("heap is null!");
        int i=_vector.size()-1;
        for(;i>0;)
        {
            swap(_vector[0],_vector[i]);
            _JustDown(0,i);
            i--;
        }
    }
    void Print()
    {
        int i;
        for(i=0;i<_vector.size();++i)
        {
            cout<<_vector[i]<<" ";
        }
        cout<<endl;
    }
private:
    void _JustDown(int s,int n)
    {
        Compair cp;
        if(n<=1)
            return;
        if(s>=n)
            return;
        int i;
        for(i=s;i<n;)
        {
            if(i*2+2<n)
            {
                int select=cp(_vector[i*2+1],_vector[i*2+2])?i*2+1:i*2+2;
                select=cp(_vector[select],_vector[i])?select:i;
                if(i!=select)
                {
                    swap(_vector[i],_vector[select]);
                    i=select;
                }
                else
                {
                    break;
                }
            }
            else if(i*2+1<n)
            {
                if(cp(_vector[i*2+1],_vector[i]))
                    swap(_vector[i],_vector[i*2+1]);
                i=i*2+1;
            }
            else
            {
                break;
            }
        }
    }
private:
    MyVector<T> _vector;
};
#endif

以上

如果你有任何想法或是可以改进的地方,欢迎和我交流!

完整代码及测试用例在github上:点我前往

本文首发于www.sbrave.cn

【完】

用数组实现一个简单的heap(最大堆)结构 make_heap函数用来从给定的任意顺序的数组创建一个最大堆。 push_heap函数向堆中压入一个新的数据,并维持堆的形态。 pop_heap函数取出堆中最大的元素,并将该元素从堆结构中剔除,维持堆的形态。 使用了定长数组作为基本的存储数据的结构,当数组空间满时,重新申请一个两倍长于当前数组的新数组,将元素复制过去。 heap.cpp class heap { priva 阅读详情

相关推荐

堆(Heap)的原理与C++实现

堆(Heap)是一种特殊的树形数据结构,通常用于实现优先队列。最大堆(Max Heap):每个节点的值都大于或等于其子节点的值。最小堆(Min Heap):每个节点的值都小于或等于其子节点的值。堆通常是一个完全二叉树,这意味着除了最后一层,其他层都是完全填满的,并且最后一层的节点都尽可能地靠左排列。堆是一种非常高效的数据结构,特别适用于需要频繁获取最大或最小元素的场景。通过数组实现堆,可以充分利用其完全二叉树的性质,使得插入、删除和构建堆的操作都能在 O(log n) 的时间内完成。

Lostgreen的博客 2142

详解堆(heap)的实现

【代码】详解堆(heap)的实现。

工匠精神coding,终生学习 300

自己写的heap,C++实现

2010年9月23日 by pafone //自己写的一个二叉堆 //底层用vector 实现 实现的是小堆 2010年9月23日完成,经过初步的测试验证正确,没有对比过STL验证

heap的实现

binary heap是一种complete binary tree(完全二叉树)也就是说,整棵树binary tree除了最底层的叶节点之外,是填满的.而最底层的叶节点(s) 由左至右又不得有空隙 如图是一个complete binary tree. 使用了一个小技巧 就是将array数组的#0元素保留(或设为最大值或这无限小值),那么当complete bianry tree中的某个节点位于...

Zyong139064359的博客 697

写给音响工程师的科普文章(二)——从模电角度去了解调音台话放

    上一篇讲到调音台第一级放大电路为差分放大器,关于差分放大器的基础知识可以参考以下资料:https://wenku.baidu.com/view/e6a46aaa2af90242a995e537 在教材中的差分放大器基本形式是这样子的,在实际电路中把RE电阻换成两个2倍RE,于是变成这样 然后我们现在来对比调音台中的差分放大器和教材中的有什么区别,我就拿yamaha 01V 96来说...

huanghaoAudio的博客 7702

HPM6E00:PWM V2使用指南

HPM6E00:PWM V2使用指南

xikangsoon的博客 1733

数据结构——堆(Heap)功能的实现

什么是堆?简单来说,堆就是一个完全二叉树,在这个完全二叉树中,每一个子树的根节点总是大于它的左右孩子,那就称为大堆,反过来,每一个子树的根节点总是小于它的左右孩子,那就称为小堆。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。

2302_76267737的博客 1396

全国30米分辨率逐年植被覆盖度(FVC)数据集

植被覆盖度是描述地表植被的重要参数与生态环境的基本指标,在大气圈、土壤圈、水圈和生物圈中都占据着重要的地位,区域及全球范围的植被覆盖度估算对植被及相关领域的研究具有重要意义。分别对LANDSAT 5/7/8系列数据计算FVC,其中Landsat5 和Landsat 7NDVI计算利用 B4和B3波段,Landsat8 和Landsat9 NDVI计算利用 B5和B4波段。算法从当年所有观测数据中,以低云、低探测角度和最高NDVI值为标准,选择最佳的可用像元值,并进行换算。(3) FVC的计算。

地球资源数据云的官方博客 1808

【数据结构】堆(Heap)的概念、结构及其实现

堆排序是一种利用堆数据结构进行排序的算法。堆是一种特殊的完全二叉树,分为最大堆和最小堆两种形式。利用堆的性质,在建立堆的过程中,将待排序的序列重构为一个堆,然后每次将堆顶元素与末尾元素交换,并调整堆,直到完成排序。

muyuteacher的博客 2432

智能车竞赛走马观碑组:如何高效识别目标板并优化绕行策略(附实战代码)

本文深入探讨了智能车竞赛走马观碑组中,如何构建从图像识别到路径决策的全栈优化方案。针对目标板识别与绕行策略的核心难点,文章详细解析了基于MobileNetV2的高效识别流水线、结合预瞄点与纯追踪算法的平滑路径规划,以及横向与纵向协同控制策略,并提供了实战代码与调试指南,旨在全面提升小车的比赛表现。

o5p6q的博客 884

基于STM32设计的便携式心电信号监测系统_474

本课题设计并实现了一种基于STM32单片机的便携式心电信号监测系统。系统以STM32F103C8T6为核心控制单元,结合PulseSensor心率传感器,实现对人体心率信号的采集与处理。通过单片机内部ADC模块对传感器输出的模拟电压信号进行采样,并对采集数据进行分析处理,从而计算得到实时心率值。

159

数据结构之堆(Heap)的实现

堆数据结构是一种数组对象,它可以被视为一棵完全二叉树结构,所以堆也叫做二叉堆。二叉堆满足二个特性: 1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。 2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。 当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆。当父结点的键值总是小于或等于 任何一个子节点的键值时为最小堆。 最...

weixin_34111819的博客 813

NVIDIA Omniverse 技术浅析(三):NVIDIA RTX 技术

NVIDIA RTX 技术是 NVIDIA 推出的革命性图形渲染技术,旨在通过硬件加速和软件优化,实现高质量的实时图形渲染。RTX 技术在 NVIDIA Omniverse 平台中扮演着至关重要的角色,为其提供了强大的渲染能力。

m0_75253143的博客 351

python通过heapq实现的heap类的代码

下边代码是关于python通过heapq实现的heap类的代码。 import heapq class heap(list) : def pop(self) : return heapq.heappop(self) def push(self, item) : heapq.heappush(self, item) def pushpop(self, item) :...

weixin_44201346的博客 394

R数据分析:潜在剖面分析LPA的做法与解释

Latent Profile Analysis (LPA) tries to identify clusters of individuals (i.e., latent profiles) based on responses to a series of continuous variables (i.e., indicators). LPA assumes that there are unobserved latent profiles that generate patterns of resp.

Codewar的博客 1万+

YOLOv11改进策略【Neck】| PRCV 2023,SBA(Selective Boundary Aggregation):特征融合模块,描绘物体轮廓重新校准物体位置,解决边界模糊问题

SBA 模块在医疗图像分割中具有重要作用,其设计出发点是解决图像中物体边界模糊以及融合特征时的冗余和不一致问题。

Limiiiing的博客 1942

排序算法(四)、选择排序 —— 简单选择排序 和 堆排序

1、简单选择排序简单选择排序思想是:从头到尾(从后往前也行)遍历序列,先固定第一个位置的数据,将该位置后面的数据,依次和这个位置的数据进行比较,如果比固定位置的数据大,就交换。这样,进行一趟排序以后,第一个位置就是最小的数了。然后重复进行,第 2 次遍历并且比较后,第二个位置就是第二小的数字了,,依次类推比较简单,直接上代码吧:void selectsort(int a[], int n) { ...

denghe优快云的博客 660

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

数据结构—堆(Heap)的原理介绍以及Java代码的完全实现

详细介绍了—堆(Heap)这种数据结构的特点和原理,并且提供了Java代码的完全实现,包括大顶堆、小顶堆的构建,堆节点的添加、删除,大顶堆、小顶堆的排序等方法!

终生学习践行者 5952

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

堆(heap)的概念及其实现

堆的实现,各位大佬有什么意见或者建议,欢迎留在评论区讨论。

yao_yao0524的博客 387

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

小根堆(Heap)的详细实现

堆的介绍 Heap是一种数据结构具有以下的特点: 1)完全二叉树 2)heap中存储的值是偏序 Min-heap: 父节点的值小于或等于子节点的值 Max-heap: 父节点的值大于或等于子节点的值 堆的存储 一般都用数组来表示堆,i结点的父结点下标就为(i–1)/2。它的左右子结点下标分别为2 * i + 1和2 * i + 2。如第0个结点左右子结点下标分别为1和2。 由于堆...

dielu7895的博客 3462

Heap 的原理与实现

文章目录原理实现 原理 &nbsp; &nbsp; &nbsp; &nbsp; 堆是一种数状数据结构,若是满足以下特性,即可称为堆:“给定堆中任意节点 P 和 C,若 P 是 C 的母节点,那么 P 的值会小于等于(或大于等于) C 的值”。若母节点的值恒小于等于子节点的值,此堆称为最小堆(min heap);反之,若母节点的值恒大于等于子节点的值,此堆称为最大堆(max heap)。在堆中最顶端...

star的博客 1650

(第七步) STL: heap算法实现

该算法内容放在Algorithm.h中 heap并不归属于STL容器组件,用于辅助实现priority queue。priority queue允许用户以任何次序将任何元素推入容器内,但取出时一定是从优先权最高(也就是数值最高)的元素开始取。binary max heap正是具有这样的特性,适合作为priority queue的底层机制。 选择方法的分析: list:虽然插入、删除可以常数时间,但是找极值需要遍历 红黑树:插入、找极值都是​,但是实现较为复杂 binar

xfy_von的博客 429

STL之heap实现详解(内部使用)

堆 先前的文章已经对堆说得足够清楚了,可以参考。 可以参考 libevent之最小堆 经典排序算法 堆无非就是分为最大堆(父节点大于等于子节点)和最小堆(父节点小于等于子节点)。STL里面实现的都是最大堆。还有就是堆一般通过数组实现。那么问题就有两个。假如不用数组索引0的位置,那么算法会很简单,那么N的父节点索引就是N/2;N的左右子节点分别是2N和2N+1。假如使用了索引0位置,那么N...

一个菜鸟的博客 2322

堆(Heap)的实现

什么是堆? 优先队列(Opriority Queue) 特殊的“队列”,取出元素的顺序是依照元素的优先权(关键字)大小,而不是元素进入队列的先后顺序。 堆有两大特性: 1,结构性:是一颗完全二叉树。 2, 有序性:每个叶子结点到根结点都是有序的,如果是升序,那么就是最大堆,否则为最小堆。 这些是堆: 下面的不是堆:   下面让我们来具体的来看堆是如何建立的 比如给定...

SJCHEN1221的博客 507

C 实现建堆(heap)的两种方式

#include&amp;lt;stdio.h&amp;gt; #include&amp;lt;stdlib.h&amp;gt; #define mindata -10001 #define maxsize 1000 typedef int ElemType; typedef struct { //堆的存储结构表示? Elem...

zjian's bolg 1910
上一篇: 一个简单的Stack实现
下一篇: 一个简单的List实现
SmartBrave
博客等级 码龄12年 25粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值