c++之享元模式

C++设计模式之——享元模式详解和代码案例 享元模式(Flyweight Pattern)是一种用于性能优化的设计模式,它通过共享对象来有效支持大量的细粒度对象,以减少内存消耗。这种模式适用于那些对象中大部分状态可以外部化,而只有少量内部状态(不随环境改变而改变的状态)的对象。在C++中实现享元模式案例展示 阅读详情

享元模式属于结构型模式。

定义:运用共享技术有效地支持大量细粒度的对象。

优点:减少单个实例的数目,来避免相似类的开销。

主要用于减少创建对象的数量,以减少内存的占用消耗和提高软件性能。

享元模式尝试重用现有的对象,如果没有找到,才会创建新的对象。
因为我们知道,对象是占据一定内存的,即使是一个空类,在c++中也占据1个字节的大小。
重复利用可以减少浪费,还能维护上一次的状态。

享元模式主要使用场景:
1、在设计之初,考虑到当系统中可能有很多对象的时候
2、这些对象还很占内存、操作重复

怎么使用:
一般会建立对应的关系表,维护已经创建的对象,通过创建对象时给他们的唯一标识,
从而通过标识从关系表中再次取出。

UML类图:

栗子场景:人在江湖飘,哪有不挨刀,加入一个门派接受保护成为了武林人士的首选。

其中Sects对应Flyweight,concreteSects对应concreateFlyweight,SectsFactory对应FlyweightFactory。

#include <iostream>
#include <map>

using namespace std;

//侠客类
class KnightErrant
{
public:
	KnightErrant(string n) :m_name("")
	{
		m_name = n;
	}
	string getName()
	{
		return m_name;
	}
private:
	string m_name;	//侠客的名字
};

//抽象门派
class Sects{
public:
	virtual void JoinSects(KnightErrant ke) = 0;
};

//具体门派
class ConcreteSects:public Sects
{
public:
	ConcreteSects(string n) :m_name("")
	{
		m_name = n;
	}
	void JoinSects(KnightErrant ke)
	{
		cout <<"大侠:"<< ke.getName().c_str() 
			<< " 加入" << m_name.c_str()<< endl;
	}

private:
	string m_name;
};

//享元工厂类
class SectsFactory
{
public:
	~SectsFactory()
	{
		auto it = m_sectsMap.begin();
		for (; it != m_sectsMap.end(); it++)
		{
			if (it->second)
			{
				delete it->second;
				it->second = nullptr;
			}
		}
	}
	Sects* getSects(string name)
	{
		if (m_sectsMap.find(name) == m_sectsMap.end())
		{
			m_sectsMap[name] = new ConcreteSects(name);
		}
		return m_sectsMap[name];
	}
	int getSectsCount()
	{
		int cnt = 0;
		auto it = m_sectsMap.begin();
		for (; it != m_sectsMap.end(); it++)
		{
			cnt++;
		}
		return cnt;
	}
private:
	map<string, Sects*> m_sectsMap;
};

//客户端
int main()
{
	SectsFactory *sectsFac = new SectsFactory;
	Sects *sects = sectsFac->getSects("华山派");
	sects->JoinSects(KnightErrant("令狐冲"));
	sects->JoinSects(KnightErrant("任你行"));

	sects = sectsFac->getSects("嵩山派");
	sects->JoinSects(KnightErrant("鸠摩智"));

	sects = sectsFac->getSects("峨眉派");
	sects->JoinSects(KnightErrant("宋青书"));

	cout << "当前武林门派的个数:" << sectsFac->getSectsCount() << endl;

	if (sectsFac)
	{
		delete sectsFac;
		sectsFac = nullptr;
	}

	return 0;
}

效果:

令狐冲和任你行都加入了华山派,鸠摩智和宋青书分别加入嵩山和峨眉。其中华山派已经已经存在,所以不会再new对象。

C++ 中的 `it->second` 和 `it.second`:迭代器与对象访问的微妙区别 在 C++ 中,迭代器和对象访问的语法取决于it如果it是一个指针类型的迭代器(例如),那么可以使用it->second。如果it是一个对象(例如pair的引用),那么必须使用it.second。在实际编程中,我们通常使用auto关键字来推导it的类型。如果你不确定it的类型,可以通过查看编译器的错误信息或使用typeid来确认。希望这篇文章能帮助你更好地理解 C++ 中的迭代器和对象访问机制。如果你还有其他问题,欢迎在评论区留言讨论! 阅读详情

相关推荐

C++ 享元模式

享元模式(Flyweight Pattern)运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象,而这些对象都很相似,状态变化很小,可以实现对象的多次复用。

青春不老,奋斗不止! 9452

C++中使用map时,it->second是什么意思?

C++ map unordered_map

qq_38860340的博客 1万+

C++享元模式:优化内存占用的利器——flyweight cpp

最后在主函数中,我们通过工厂类获取3个不同的享元对象,然后调用它们的operation方法,并传入不同的外部参数,可以看到虽然我们获取了3个对象,但其中有2个是具有相同内部状态的,这样就实现了内存占用的优化。flyweight cpp依据享元模式的理念,将大量相似的对象的共同部分提取出来,作为内部状态,而将不同部分提取出来,作为外部状态,在需要的时候再进行组装,减少了内存的占用。总之,flyweight cpp通过有效控制内存占用,提高了程序的性能稳定性,是C++开发中优化内存占用的利器。

CodeWhizZ的博客 144

C++中的iterator->second

原文链接 std::map<X, Y>实际储存了一串std::pair<const X, Y> std::map<std::string, int> m = /* fill it */; auto it = m.begin(); 这里,如果你用*it,那么你将得到map第一个元素的std::pair: 现在你可以接收std::pair的两个元素: (*it).first会得到key, (*it).second会得到value。 这等同于it->first和it-&

Pz_mstr's Blog 1070

什么是 ‘Flyweight Pattern’ (享元模式)?在 C++ 游戏开发中管理千万级粒子素材的内存优化

首先,我们需要一种方式来唯一标识一种粒子类型。这通常通过一个结构体或枚举来完成,其中包含创建该实例所需的所有可变参数。// 假设我们有TextureManager和ShaderManager来管理资源// 只是一个占位符,实际游戏中会更复杂// 曲线定义(简化,实际可能是Bezier或Catmull-Rom)// 粒子混合模式Additive,Alpha,Multiply,// ... 其他混合模式// 纹理UV动画帧// 用于定义一种粒子类型的配置。

weixin_41455464的博客 406

C++设计模式之享元模式(Flyweight)

主要为大家详细介绍了C++设计模式之享元模式Flyweight,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

C++设计模式——享元模式(flyweight pattern)

# 一、原理讲解 ## 1.1意图 运用共享技术有效地支持大量细粒度的对象。 ## 1.2应用场景 - 一个程序中使用了大量的对象; - 完全由于使用大量的对象造成很大的存储开销; - 对象的大多数状态都可变为外部状态; - 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象; - 应用程序不依赖于对象标识。 ## 1.3结构图(UML图) ![享元模式UML结构图](https://img-blog.csdnimg.cn/20200902222642384.jpg?x-oss-

净无邪博客 547

从CTFShow靶场实战,聊聊Node.js原型链污染漏洞的几种利用姿势(附详细复现步骤)

本文深入剖析Node.js原型链污染漏洞的原理与实战利用,通过复现CTFShow靶场题目(web338-web341),详细演示五种高级利用技巧,包括基础污染、多级污染、模板引擎RCE等,并提供防御方案与最佳实践,帮助开发者提升Web应用安全性。

weixin_30791095的博客 445

C++设计模式——享元模式(Flyweight Pattern)

C++设计模式——享元模式(Flyweight Pattern) 微信公众号:幼儿园的学霸 目录 文章目录C++设计模式——享元模式(Flyweight Pattern)目录定义定义结构代码示例总结对比优缺点适用场景参考资料 定义 定义 Flyweight Pattern: Use sharing to support large numbers of fine-grained objects efficiently. 使用共享对象可有效地支持大量的细粒度的对象 享元(Flyweight)模式的定义

leonardohaig的博客 1288

ROS 入门教程:小乌龟仿真器和基础操作

小乌龟仿真器和ros基础操作

zlflll的博客 4124

jason-2卫星介绍及其数据下载

两台仪器发射脉冲宽度均为105.6μs,带宽320MHz(C频段)和320/100MHz(Ku频段),脉冲重复频率1800Hz(Ku频段)和300Hz(C频段),功率78W,数据传输速率22.5kbit/s。共发射了3颗卫星(Jason - 1/2/3),星上有效载荷均主要为雷达高度计和微波辐射计。Jason - 1卫星主要有效载荷为波塞冬 - 2和“贾森微波辐射计”,Jason - 2卫星进行了改进,主要携带了波塞冬 - 3和先进微波辐射计,此外,Jason - 2卫星还携带了“多里斯”系统。

beautyaaaa的博客 1605

【c++设计模式14】结构型6:享元模式(Flyweight Pattern)

享元模式(Flyweight Pattern)是一种结构型设计模式,它通过共享对象来减少内存使用和提高性能。享元模式将对象分为两部分:内部状态(Intrinsic State)和外部状态(Extrinsic State)。其中,内部状态是可以共享的,而外部状态是不可共享的。

junxuezheng的博客 1135

Matlab实战:水声信号DEMON谱分析从入门到精通(附完整源码)

本文详细介绍了使用Matlab进行水声信号DEMON谱分析的完整流程,从基础理论到实战应用,涵盖信号预处理、包络提取、频谱分析等关键步骤,并附完整源码。特别针对水声通信中的低信噪比环境,提供了多种优化方案和性能提升技巧,帮助读者快速掌握这一水下目标检测的核心技术。

gamma的博客 295

【C++】享元模式

享元模式(Flyweight Pattern)是一种【结构型】设计模式,它通过共享对象来减少内存使用和提高性能。该模式将对象的状态分为**内部状态**(可共享的不变部分)和**外部状态**(不可共享的变化部分),通过共享内部状态对象并动态注入外部状态,实现对象的高效复用。

AAADiao的博客 831

软件测试工程师笔试题

这里写目录标题全套软件测试面试笔试题(附答案)二、选折三、添空四、简答(资料是搜集整理的,感谢前辈的解题)无1.区别阶段评审的与同行评审2.什么是软件测试3. 简述集成测试的过程4 怎么做好文档测试5 白盒测试有几种方法6 系统测试计划是否需要同行审批,为什么7Alpha 测试与 beta 的区别8 比较负载测试,容量测试和强度测试的区别。性能测试从使用方便的角度来说,9 测试结束的标准是什么?10 描述软件测试活动的生命周期?11 软件的缺陷等级应如何划分? 软件测试工程师笔试题(附答案) 全套软件测试面

m0_46446002的博客 2548

电子系统设计与创新实践作品:简易电子琴

题目 4:简易电子琴 (1)具有8个音阶按键,每个音阶按键频率如表1所示。 (2)每个按键对应LED显示。 (3)音阶信号经功放连接8欧姆扬声器,输出功率可达1W。 (4)每个音阶输出音量一样。 (5)扬声器输出音量可调节,音量调节分为高、中、低三档,并进行档位显示。

weixin_47510497的博客 2856

C++ 设计模式——享元模式

享元模式也称为蝇量模式旨在解决面向对象程序设计中的性能问题。享元的英文名“Flyweight”意为“轻量级”,源于拳击比赛中较轻的选手。该模式的核心目标是让对象变得“轻”,即减少内存占用。在需要某个对象时,尽量共享已经创建的同类对象,以避免频繁使用 `new` 创建同类或相似的对象。在对象数量非常庞大的情况下,这种共享可以显著节省内存占用并提升程序运行效率。

慢慢记录,慢慢更新。 2027

VSCode + Latex 配置

1. 安装VSCode VSCode下载 next,next就安装好了。 2. 配置VSCode 2.1 安装LaTeX Workshop插件 install,安装LaTeX Workshop插件 2.2 修改 user setting 点击左下角,进入用户设置 点击上图标记的部分,选择 打开settings.json 具体配置文件如下: { "latex-workshop.la...

一只特立独行的猪 10万+

(二)结构型模式:7、享元模式(Flyweight Pattern)(C++实例)

介绍享元模式的含义,应用场景,优缺点,以及C++实现的一个实例。

bigger_belief的博客 643

2篇1章1节:数据的基本概念以及 R 中的数据结构、向量与矩阵的创建及运算

本文详细介绍了R语言中常见的数据结构的向量和矩阵。通过掌握这些数据结构的基本概念和操作技巧,可以更高效地处理和分析数据。

MD Code 1243

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

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

C++ 设计模式:享元模式(Flyweight Pattern)

C++ 设计模式:享元模式(Flyweight Pattern)

冀晓武的博客 837

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

享元模式C++

享元模式(Flyweight Pattern)是一种结构型设计模式,它通过共享技术有效地支持大量细粒度对象的复用,从而减少内存消耗和对象创建开销。这种模式特别适合处理大量相似对象,这些对象中包含可共享的"内部状态"和不可共享的"外部状态"。

melonbo的专栏 321

深度学习工具包 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")

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

[C++]享元模式

// 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // // 参考大话设计模式 #include <iostream> #include <vector> using namespace std; class Flyweight { public: virtual void Operation(int num) = 0; }; class ConreteFlyweight : public Flyweight { public: void Ope...

就是那个党伟 222

设计模式:享元模式 C++实现

文章目录前言1. 享元模式的理解2. 享元模式的c++实现总结参考 前言 今天复习了享元模式,它对于减少冗余类的对象很有帮助,进而能够降低资源消耗,这里跟大家分享下。 1. 享元模式的理解 享元模式,个人理解,就是应用共享技术来减少类的对象创建,节省计算机资源消耗,而且能够减少维护成本(可以参考《大话设计模式》创建多个相似网站的例子)。 享元模式比较正规的定义和类图结构(引用《大话设计模式》)如下所示: 从类图可以看出,享元模式应用简单工厂模式来创建享元对象并保存每一个创建的享元对象,当工厂之前创建过

DU_YULIN的博客 963

c++实现享元模式(附带源码)

享元模式通过共享相同的对象来减少内存的使用,适用于大量重复对象的场景。它使得多个对象可以共享相同的状态(内部状态),而将变化的部分(外部状态)分离出来进行单独管理。

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 709
上一篇: c++之适配器模式
下一篇: c++之桥接模式
Qt上位机开发
Qt上位机开发 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄9年 9664粉丝 178原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值