STL vector 容器介绍

【C++】STL和vector容器 质变算法,是指运算过程中会更改区间内的元素的内容,例如拷贝、替换、删除等;长久以来,软件届一直希望建立一种可重复利用的东西,C++的面向对象和泛型编程思想,目的就是复用性的提升,大多情况下,数据结构和算法都未能有一套标准,导致被迫从事大量重复工作,为了建立数据结构和算法的一套标准,诞生了STL。容器和算法之间的粘合剂,提供一种方法,使之能够依序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表示方式,每个容器都有自己专属的迭代器,迭代器使用非常类似于指针,初学阶段可以理解为指针。 阅读详情
STL vector 容器介绍
翻译 masterlee
介绍 std::vector ,并且讨论它在 STL 中的算法和条件函数 remove_if() 。
 
 
介绍
这篇文章的目的是为了介绍 std::vector ,如何恰当地使用它们的成员函数等操作。本文中还讨论了条件函数和函数指针在迭代算法中使用,如在 remove_if() 和 for_each() 中的使用。通过阅读这篇文章读者应该能够有效地使用 vector 容器,而且应该不会再去使用 C 类型的动态数组了。
 
Vector 总览
vector 是 C++ 标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。 vector 之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说, vector 是一个能够存放任意类型的动态数组,能够增加和压缩数据。
为了可以使用 vector ,必须在你的头文件中包含下面的代码:
# include <vector>
 
vector 属于 std 命名域的,因此需要通过命名限定,如下完成你的代码:
using std::vector;
vector< int > vInts;
 
或者连在一起,使用全名:
std::vector< int > vInts;
 
建议使用全局的命名域方式:
using namespace std;
 
在后面的操作中全局的命名域方式会造成一些问题。 vector 容器提供了很多接口,在下面的表中列出 vector 的成员函数和操作。
 
Vector 成员函数
函数
表述
c.assign(beg,end)
c.assign(n,elem)
将 [beg; end) 区间中的数据赋值给 c 。
将 n 个 elem 的拷贝赋值给 c 。
c.at(idx)
传回索引 idx 所指的数据,如果 idx 越界,抛出 out_of_range 。
c.back()
传回最后一个数据,不检查这个数据是否存在。
c.begin()
传回迭代器重的可一个数据。
c.capacity()
返回容器中数据个数。
c.clear()
移除容器中所有数据。
c.empty()
判断容器是否为空。
c.end()
指向迭代器中的最后一个数据地址。
c.erase(pos)
c.erase(beg,end)
删除 pos 位置的数据,传回下一个数据的位置。
删除 [beg,end) 区间的数据,传回下一个数据的位置 。
c.front()
传回地一个数据。
get_allocator
使用构造函数返回一个拷贝。
c.insert(pos,elem)
c.insert(pos,n,elem)
c.insert(pos,beg,end)
在 pos 位置插入一个 elem 拷贝,传回新数据位置。
在 pos 位置插入 n 个 elem 数据。无返回值。
在 pos 位置插入在 [beg,end) 区间的数据。无返回值。
c.max_size()
返回容器中最大数据的数量。
c.pop_back()
删除最后一个数据。
c.push_back(elem)
在尾部加入一个数据。
c.rbegin()
传回一个逆向队列的第一个数据。
c.rend()
传回一个逆向队列的最后一个数据的下一个位置。
c.resize(num)
重新指定队列的长度。
c.reserve()
保留适当的容量。
c.size()
返回容器中实际数据的个数。
c1.swap(c2)
swap(c1,c2)
将 c1 和 c2 元素互换。
同上操作。
vector<Elem> c
vector <Elem> c1(c2)
vector <Elem> c(n)
vector <Elem> c(n, elem)
vector <Elem> c(beg,end)
c.~ vector <Elem>()
创建一个空的 vector 。
复制一个 vector 。
创建一个 vector ,含有 n 个数据,数据均已缺省构造产生 。
创建一个含有 n 个 elem 拷贝的 vector 。
创建一个以 [beg;end) 区间的 vector 。
销毁所有数据,释放内存。
 
Vector 操作
函数
描述
operator []
返回容器中指定位置的一个引用。
 
创建一个 vector
vector 容器提供了多种创建方法,下面介绍几种常用的。
创建一个 Widget 类型的空的 vector 对象:
vector<Widget> vWidgets;
//     ------
//      |
//      |- Since vector is a container, its member functions
//         operate on iterators and the container itself so
//         it can hold objects of any type.
 
创建一个包含 500 个 Widget 类型数据的 vector :
vector<Widget> vWidgets(500);
 
创建一个包含 500 个 Widget 类型数据的 vector ,并且都初始化为 0 :
vector<Widget> vWidgets(500, Widget(0));
 
创建一个 Widget 的拷贝:
vector<Widget> vWidgetsFromAnother(vWidgets);
 
向 vector 添加一个数据
vector 添加数据的缺省方法是 push_back() 。 push_back() 函数表示将数据添加到 vector 的尾部,并按需要来分配内存。例如:向 vector<Widget> 中添加 10 个数据,需要如下编写代码:
for (int i= 0;i<10; i++)
    vWidgets.push_back(Widget(i));
 
获取 vector 中制定位置的数据
很多时候我们不必要知道 vector 里面有多少数据, vector 里面的数据是动态分配的,使用 push_back() 的一系列分配空间常常决定于文件或一些数据源。如果你想知道 vector 存放了多少数据,你可以使用 empty() 。获取 vector 的大小,可以使用 size() 。例如,如果你想获取一个 vector v 的大小,但不知道它是否为空,或者已经包含了数据,如果为空想设置为 -1 ,你可以使用下面的代码实现:
int nSize = v.empty() ? -1 : static_cast < int >(v.size());
 
访问 vector 中的数据
使用两种方法来访问 vector 。
1、   vector::at()
2、   vector::operator[]
operator[] 主要是为了与 C 语言进行兼容。它可以像 C 语言数组一样操作。但 at() 是我们的首选,因为 at() 进行了边界检查,如果访问超过了 vector 的范围,将抛出一个例外。由于 operator[] 容易造成一些错误,所有我们很少用它,下面进行验证一下:
分析下面的代码:
vector< int > v;
v.reserve(10);
 
for ( int i=0; i<7; i++)
    v.push_back(i);
 
try
{
  int iVal1 = v[7]; // not bounds checked - will not throw
  int iVal2 = v.at(7); // bounds checked - will throw if out of range
}
catch ( const exception& e)
{
 cout << e.what();
}
 
我们使用 reserve() 分配了 10 个 int 型的空间,但并不没有初始化。如下图所示:
你可以在这个代码中尝试不同条件,观察它的结果,但是无论何时使用 at() ,都是正确的。
 
删除vector中的数据
vector 能够非常容易地添加数据,也能很方便地取出数据,同样 vector 提供了 erase() , pop_back() , clear() 来删除数据,当你删除数据的时候,你应该知道要删除尾部的数据,或者是删除所有数据,还是个别的数据。在考虑删除等操作之前让我们静下来考虑一下在 STL 中的一些应用。
 
Remove_if()算法
现在我们考虑操作里面的数据。如果要使用 remove_if() ,我们需要在头文件中包含如下代码::
# include <algorithm>
 
         Remove_if() 有三个参数:
1、   iterator _First :指向第一个数据的迭代指针。
2、   iterator _Last :指向最后一个数据的迭代指针。
3、   predicate _Pred :一个可以对迭代操作的条件函数。
 
条件函数
条件函数是一个按照用户定义的条件返回是或否的结果,是最基本的函数指针,或者是一个函数对象。这个函数对象需要支持所有的函数调用操作,重载 operator()() 操作。 remove_if() 是通过 unary_function 继承下来的,允许传递数据作为条件。
例如,假如你想从一个 vector<CString> 中删除匹配的数据,如果字串中包含了一个值,从这个值开始,从这个值结束。首先你应该建立一个数据结构来包含这些数据,类似代码如下:
# include <functional>
enum findmodes
{
 FM_INVALID = 0,
 FM_IS,
 FM_STARTSWITH,
 FM_ENDSWITH,
 FM_CONTAINS
};
typedef struct tagFindStr
{
 UINT iMode;
 CString szMatchStr;
} FindStr;
typedef FindStr* LPFINDSTR;
 
然后处理条件判断:
class FindMatchingString
    : public std::unary_function<CString, bool >
{
   
public :
 FindMatchingString( const LPFINDSTR lpFS) : m_lpFS(lpFS) {}
   
  bool operator()(CString& szStringToCompare) const
 {
     bool retVal = false ;
 
     switch (m_lpFS->iMode)
     {
     case FM_IS:
       {
         retVal = (szStringToCompare == m_lpFDD->szMatchStr);
         break ;
       }
     case FM_STARTSWITH:
       {
         retVal = (szStringToCompare.Left(m_lpFDD->szMatchStr.GetLength())
               == m_lpFDD->szWindowTitle);
          break ;
       }
     case FM_ENDSWITH:
       {
         retVal = (szStringToCompare.Right(m_lpFDD->szMatchStr.GetLength())
               == m_lpFDD->szMatchStr);
         break ;
       }
      case FM_CONTAINS:
       {
         retVal = (szStringToCompare.Find(m_lpFDD->szMatchStr) != -1);
         break ;
       }
     }
       
     return retVal;
 }
       
private :
    LPFINDSTR m_lpFS;
};
 
通过这个操作你可以从 vector 中有效地删除数据:
// remove all strings containing the value of
// szRemove from vector<CString> vs.
 
FindStr fs;
fs.iMode = FM_CONTAINS;
fs.szMatchStr = szRemove;
 
vs.erase(std::remove_if(vs.begin(), vs.end(), FindMatchingString(&fs)), vs.end());
 
Remove_if()能做什么?
你可能会疑惑,对于上面那个例子在调用 remove_if() 的时候还要使用 erase() 呢?这是因为大家并不熟悉 STL 中的算法。 Remove(),remove_if( ) 等所有的移出操作都是建立在一个迭代范围上的,那么不能操作容器中的数据。所以在使用 remove_if() ,实际上操作的时容器里数据的上面的。思考上面的例子:
1、   szRemove = “o”.
2、   vs 见下面图表中的显示。
观察这个结果,我们可以看到 remove_if() 实际上是根据条件对迭代地址进行了修改,在数据的后面存在一些残余的数据,那些需要删除的数据。剩下的数据的位置可能不是原来的数据,但他们是不知道的。
调用 erase() 来删除那些残余的数据。注意上面例子中通过 erase() 删除 remove_if() 的结果和 vs.enc() 范围的数据。
 
压缩一个臃肿的vector
很多时候大量的删除数据,或者通过使用 reserve() ,结果 vector 的空间远远大于实际需要的。所有需要压缩 vector 到它实际的大小。 resize() 能够增加 vector 的大小。 Clear() 仅仅能够改变缓存的大小,所有的这些对于 vector 释放内存等九非常重要了。如何来解决这些问题呢,让我们来操作一下。
我们可以通过一个 vector 创建另一个 vector 。让我们看看这将发生什么。假定我们已经有一个 vector v ,它的内存大小为 1000 ,当我们调用 size() 的时候,它的大小仅为 7 。我们浪费了大量的内存。让我们在它的基础上创建一个 vector 。

std::vector<CString> vNew(v);
cout << vNew.capacity();

 
vNew.capacity() 返回的是 7 。这说明新创建的只是根据实际大小来分配的空间。现在我们不想释放 v ,因为我们要在其它地方用到它,我们可以使用 swap() 将 v 和 vNew 互相交换一下?

    vNew.swap(v);
    cout << vNew.capacity();
    cout << v.capacity();

 
有趣的是: vNew.capacity() 是 1000 , 而 v.capacity() 是 7 。
现在是达到我的目的了,但是并不是很好的解决方法,我们可以像下面这么写:

    std::vector<CString>(v).swap(v);

     
你可以看到我们做了什么?我们创建了一个临时变量代替那个命名的,然后使用 swap() , 这样我们就去掉了不必要的空间,得到实际大小的 v 。
 
结论
我希望这个文档可以给那些使用 STL vector 容器的开发者很有价值的参考。我也希望通过阅读这篇文章你可以放心地使用 vector 来代替 C 语言中的数据了。
 
参考
Plauger, P.J. Standard C++ Library Reference. February, 2003. MSDN.
Schildt, Herbert. C++ from the Ground Up, Second Edition. Berkeley: 1998.
Sutter, Herb. More Exceptional C++. Indianapolis: 2002.
 

【C++】memcpy的致命诱惑:vector模拟实现中的深坑预警 介绍了vector的使用和模拟等知识点,其中重点讲vector的迭代器失效与vector模拟实现的各种注意事项 阅读详情

相关推荐

C++——STL之vector详解

学习了string之后,学习其他模板将会更容易上手,一起来看一下vector吧!vector是表示大小可以变化的数组的序列容器。

weixin_59055853的博客 2325

基于C#编程建立Vector数据类型及对应处理方法

以C#为例,讲解如何建立一个类,这其中需要考虑需要什么样的数据(成员),什么样的属性以及方法,以及提供给外部程序调用,最后考虑怎么样去实现这样的算法。例如对于一个向量Vector(类)而言,它需要一行数据,元素类型可以是int、double、float形式(或则是泛型);需要的方法:向量的构造、显示、增删改查、运算符重载、求和、均值、最大值、最小值等处理。本博客利用C#进行编程,新建了一个Vector类(向量),具备向量的常见运算操作和方法;

心网千劫 5773

STL源码剖析——序列容器之vector

在STL编程中,我们最常用到的就是容器,容器可分为序列容器和关联容器;本文记录的是我们经常使用的序列容器之vector,vector的数据安排和操作方式类似于C++内置数组类型array,唯一的区别就是在于空间的灵活运用。内置数组array是静态空间,一旦分配了内存空间就不能改变,而vector容器可以根据用户数据的变化而不断调整内存空间的大小。 vector容器有已使用空间和可用空间,已使用空间是指vector容器的大小,可用空间是指vector容器可容纳的最大数据空间capacity。ve

关注校招求职,微信号:job_campus 2497

C++编程语言STL之vector介绍

vector是C++编程语言的STL中的内容,是同一种类型的对象的集合,每个对象都有一个对应的整数索引值,和(C++编程语言中的)string对象一样,标准库负责管理与存储元素相关的内存。有时候会把vector称为容器,是因为它可以包含其他对象,能够存放任意类型的动态数组、增加和压缩数据。一个容器中的所有对象都必须是同一种类型的。vector不是一种数据类型,而是一个类模板(class template)。使用模板可以编写一个类定义或函数定义,用于多种不同的数据类型。

liitdar的博客 3333

C++STL容器之vector

STL新手入门:STL新手入门向 vector  在STL的&lt;vector&gt;头文件中定义了vector(向量容器模版类),vector向量容器不但能像数组一样对元素进行随机访问,还能在尾部插入元素,是一种简单,高效的容器,完全可以代替数组,vector具有自动管理功能,对于元素的插入和删除,可动态调整所占的内存空间 vector模版类需要两个模版参数,第一个参数是存储元素的数据类...

Mr.zhou 1261

使用C#的向量(Vector)的用法

本文介绍了在C#中使用向量的基本用法,包括创建向量、向量运算和向量化循环。向量可以提高代码的执行效率,并简化对一组数据的操作。通过合理地使用向量,可以优化代码的性能,特别是在处理大量数据时。向量(Vector)是C#中一个常用的数据结构,用于存储和操作一组相同类型的元素。在本文中,我们将详细介绍C#中向量的用法,并提供相应的源代码示例。在上述示例中,我们将数组的每个元素与向量的每个元素进行逐个相加,并将结果存回数组中。

Meta_C的博客 1723

C++STL之vector 容器

本文为作者对于STL中vector 容器的学习总结,希望对大家有帮助(*╹▽╹*)

B1ue还在专注 2427

R语言分段回归

1.利用虚拟变量进行线性回归 (MEdata.csv的数据来源:https://github.com/ChenQihome9/优快云-Data-Library/blob/master/MEdata.csv) 问题13:针对TAX~GDP,使用分段回归方法,找到其回归方程。编程,并根据程序结果叙述如下几方面问题:(1)分几段最佳?(不超过5段内)(2)分段位置定在哪儿最佳?(3)写出最佳方...

ChenQihome9的博客 1万+

【C++】STL容器之vector

前言 C++引入了面向对象的思想,相比于C语言,一个类能更好地对一些数据结构进行管理和操作。 在C语言中,我们使用定长数组和malloc出来的动态数组来维护一段连续的相同类型数据的集合 在C++中,基于面向对象的思想,用来管理空间上连续的同类型数据集合的类便应运而生,从本质上讲,vector类就是一个被封装了的大小可变数组的序列容器 目录 1.vector的简介 2.vector的常见接口及模拟实现     2.1 vector类对象的常见构造  &

DanteKing的博客 1540

电赛控制组入门到实战:从电路板到PID算法的完整路径

本文详细介绍了电赛控制组从电路板制作到PID算法实战的完整学习路径。涵盖嘉立创电路设计、Keil5开发环境搭建、STM32F103C8T6核心板外设应用,重点解析PID算法在电机速度环与位置环中的调试技巧,并探讨OpenMV视觉模块与主控制器的协同工作,为电赛参赛者提供系统化的实战指南。

oauth7security的博客 745

从零开始:使用英伟达nx开发板部署目标检测算法的全过程

英伟达nx开发板烧录、依赖安装、开发板联网

weixin_51192760的博客 3761

STL vector容器

STL中的容器: vector容器的常用接口及用法: vector:STL 中最常用的容器,和数组结构非常类似,也被称作单端数组; vector 容器和普通数组的区别:它们的不同之处在于,数组是静态空间(一旦给定了初始长度,无法修改),而 vector 容器可以动态扩展; 动态扩展:并不是在原有空间的后面续接新空间,而是找到在内存中一块更大的空间,先将原数据拷贝到新空间,后释放原空间; 图片转自于黑马程序员,是在学习的过程中截图下来的 各种函数接口具体如何使用,下面的代码块中会有详细的使用方法 vec

weixin_51196603的博客 514

手把手教你逆向抖店滑块验证码:从抓包到生成captchaBody的完整流程(附Python复现代码)

本文详细解析了抖店滑块验证码的逆向过程,从抓包分析到参数生成,最终用Python完整复现验证流程。涵盖关键接口分析、指纹参数生成、轨迹加密逻辑及核心加密算法实现,帮助开发者突破抖店的多重安全机制,实现高效的人机验证绕过。

weixin_30681121的博客 424

C++ STL之vector容器

vector容器的介绍 vector容器的使用 [1.vector的构造函数 2.vector的赋值操作 3.vector的容量与大小 4.vector的插入和删除 5.vector的数据存取 6.vector的互换容器 7.算法模块在vector的应用①find算法(std)②sort算法(std)]

咸鱼势力登场 3019

【ubuntu24.04】auto remove后,重启,kernel panic ,please reboot your computer vfs unable to mount root fs

Ubuntu 24.04系统在运行auto remove后出现内核恐慌(kernel panic)无法启动,显示"VFS: unable to mount root fs"错误。该问题是由于当前内核被清除导致系统无法挂载根分区。解决步骤包括:1)尝试用GRUB菜单中的旧内核启动;2)在GRUB中临时编辑启动参数;3)使用Ubuntu启动盘进行chroot修复;4)使用Boot-Repair工具一键修复。成功启动后,需要重新安装linux-generic等元包,重建initramfs并更新

突围 1209

STM32F407最小系统硬件设计与CubeMX工程实践

嵌入式最小系统是MCU功能实现的物理基础,其核心涵盖供电网络、时钟架构、复位机制与调试接口四大模块。基于Cortex-M4内核的STM32F407对电源纹波、晶振稳定性及信号完整性提出严苛要求:模拟电源VDDA需<10mV纹波,HSE晶振布线须满足短距直连与匹配电容精准配置,SWD调试接口依赖50Ω阻抗控制与端接防护。这些硬件约束直接映射至STM32CubeMX配置——如RCC时钟树参数必须与实物晶振频率严格一致,GPIO模式需匹配外设电气特性(如I2C必选开漏),否则将引发通信失败或启动异常。典型应用场景

weixin_35592186的博客 173

STL容器之vector

capacity的代码在vs和g++下分别运行会发现,vs下capacity是按1.5倍增长的,g++是按2倍增长的。这个问题经常会考察,不要固化的认为,vector增容都是2倍,具体增长多少是根据具体的需求定义 的。vs是PJ版本STL,g++是SGI版本STL。reserve只负责开辟空间,如果确定知道需要用多少空间,reserve可以缓解vector增容的代价缺陷问 题。resize在开空间的同时还会进行初始化,影响size。

2301_79351530的博客 1191

【GameFramework扩展应用】6-5、GameFramework框架出包时增加版本信息Version.txt文件

框架在热更新的时候,会先去获取文件,然后获取版本号,对比版本号和资源大小,才会开始下载资源。但是,框架生成AssetBundle资源的包里面是没有这个文件的,只能我们新建一个文件,然后手动填入数据,非常麻烦。好消息是,框架把这些接口都留给我们了,我们只需要继承接口,重写函数,然后在打包的时候选择这个辅助器即可。下面就来看一下如何实现把。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 1039

STL常用容器—vector容器

整理归纳C++ STL的vector容器,主要包括对容器的增删改查操作,vector作为最常用的容器之一,需重点把握

weixin_46216674的博客 1128

Claude Code 安装指南(Windows / macOS)

本文介绍了Claude Code的安装准备和基本流程。作为开发者工具,安装前需具备命令行操作能力、可用的Claude账号和稳定网络环境。Windows和macOS的安装都需通过终端完成,安装后以命令行形式运行。首次使用建议在熟悉项目中执行简单任务,逐步建立使用习惯。强调安装只是开始,后续需学习如何有效使用工具,包括任务提交流程和上下文提供方法。核心要点是:Claude Code是开发者工具,网络和终端环境是关键,建议先运行再深入理解。

sg_knight的专栏 4482

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

STL之容器vector

一些vector的基本知识

2401_83008408的博客 811

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

STL里面的vector容器

vector作为序列容器,简化了数组的使用,除了保留c++的数组优点外,还提供了方便而灵活的函数,不少算法也可以运用到vector中。值得注意的是vector v4(v1.begin(), v1.end());这种使用迭代器范围来初始化 vector 的方式,在一定条件下可以用于将其他序列容器转化为vector。(v.begin()是获取第一个元素位置,v.end()是获取最后一个元素的位置)先来介绍一下vector的构造和赋值吧。在熟悉vector的构造和赋值后我们再来学习vector的增加和删除。

m0_59858691的博客 656

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

STL之vector容器

1.vector是可变大小数组的容器2.像数组一样,采用连续的空间存储,也就意味着可以通过下标去访问,但它的大小可以动态改变3.每次的插入都要开空间吗?开空间就要意味着先开临时空间,然后在拷贝旧的到新的上面,在释放原来的,就时间而言,这是一个相对代价很高的任务;显然这是不行的,vector的分配策略:会分配一些而外的空间以适应可能的增长,例如我们平时说的以1.5或者2倍的方式增容,不同的库选择不同的策略权衡空间的使用和重新分配,以至于在插入一个元素时能在常数时间内插入;

Laydya的博客 1409

【C++】STL—容器—vector介绍

文章目录一、vector的介绍1、概念2、分配空间策略3、特点二、vector的使用1、vector的定义2、vector iterator 的使用3、vector 空间增长4、vector 增删查改5、vector 迭代器失效问题三、vector的模拟实现 一、vector的介绍 1、概念 vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它

zhao_leilei的博客 969
上一篇: 深度探索C++对象模型
下一篇: #pragma 预处理指令详解
daneric
博客等级 码龄19年 1粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值