Qt(C/C++) 常用数据结构

QT是一个跨平台的图形化类库,常用数据结构就是对C++ STL的二次封装,使其更加易用

字符串容器

QString 追加/删除:

#pragma execution_character_set("utf-8")
#include <QCoreApplication>
#include <QString>
#include <QDebug>

int main(int argc, char* argv[])
{
    QCoreApplication a(argc, argv);

    // 定义两个字符串并将其拼接在一起
    QString Str1 = "hello", Str2 = "Pan", temp;
    temp = Str1 + Str2;
    qDebug() << temp.toStdString().data();
    qDebug() << (Str1 + Str2).toStdString().data();

    // 使用字符串追加与移除
    QString Str3 = "hello";
    Str3.push_front("to ");         //push_front头部追加方法
    Str3.prepend("Welcome ");       //prepend头部追加方法
    Str3.append("Pan ");            //append尾部追加方法
    Str3.push_back("!");            //push_back尾部追加方法
    Str3.remove("hello");           //remove删除
    qDebug() << Str3.toStdString().data();

    // 使用Sprintf/arg 将特定字符串连接
    QString Str4;
    Str4.sprintf("%s %s", "Welcome", "to you !");
    qDebug() << Str4.toStdString().data();

    QString Str5;
    Str5 = QString("%1 is age =  %2 . ").arg("Pan").arg("18");
    qDebug() << Str5.toStdString().data();
    qDebug() << (QString("1") + QChar('A')).toStdString().data();
    qDebug() << (QString("2") + QString('B')).toStdString().data();

    //计算字符串的长度
    qDebug() << Str5.count();
    qDebug() << Str5.size();
    qDebug() << Str5.length();

    //去空格
    QString Str6 = " hello  Pan   welcome !  ";
    Str6 = Str6.trimmed();          // 去掉首尾空格
    Str6 = Str6.simplified();       // 去掉所有空格,中间连续的只保留一个
    qDebug() << Str6.toStdString().data();

    Str6 = Str6.mid(2, 10);         //从索引第2位开始向后取10位
    qDebug() << Str6.toStdString().data();

    //移除1,3两个位置的字符
    qDebug() << (QString("123456").remove(1, 3)).toStdString().data();

    //超过10个字符就保留10个字符,否则不足替换为 '.'
    qDebug() << (QString("abcdefg").leftJustified(10, '.', true)).toStdString().data();

    qDebug() << (QString::number(100, 16)).toStdString().data();    // 100转16进制

    //转换为16进制不足8位前面补‘0’
    qDebug() << (QString("%1").arg(123, 8, 16, QLatin1Char('0'))).toStdString().data();

    //转为8进制
    qDebug() << QString("%1").arg(QString::number(100, 8)).toStdString().data();
    //小数点位数设置
    qDebug() << (QString("%1").arg(QString::number(.777, 'f', 1))).toStdString().data();

    //切割字符串
    qDebug() << (QString("1,2,3,4,5,6").split(',')[2]).toStdString().data();

    //类型转换QByteArray转换QString
    QByteArray byte;
    byte.resize(2);     //设置大小
    byte[0] = '1';
    byte[1] = '2';
    QString strs = byte;
    qDebug() << strs.toStdString().data();

    return a.exec();
}

QString 查询/替换: 字符串的查询,替换,扫描与切割

#pragma execution_character_set("utf-8")
#include <QCoreApplication>
#include <QString>
#include <QDebug>

int main(int argc, char* argv[])
{
    QCoreApplication a(argc, argv);
    //查询与替换
    QString str = "hello Pan welcome to world";
    int index;
    bool ref;

    //查询字符串中是否包含特定字符
    ref = str.contains("Pan", Qt::CaseInsensitive);     // 不区分大小写
    qDebug() << ref;

    ref = str.contains("PAN", Qt::CaseSensitive);       // 区分大小写
    qDebug() << ref;

    //判断是否以某个字符串开头或结束
    ref = str.startsWith("hello", Qt::CaseInsensitive); // 判断是否hello开头
    qDebug() << ref;

    ref = str.endsWith("to", Qt::CaseSensitive);      // 判断是否to结尾
    qDebug() << ref;

    //从字符串中取左边/右边多少个字符
    index = str.indexOf(" ");        //第一个空格出现的位置
    qDebug() << str.left(index).toStdString().data();

    index = str.lastIndexOf(" ");    //最后一个空格出现的位置
    qDebug() << str.right(str.size() - index - 1).toStdString().data();

    //替换字符串中所有的world为CSDN
    str = str.replace("world", "CSDN");
    qDebug() << str.toStdString().data();

    // 字符串的截取
    QString str2 = "uname,uage,usex";
    qDebug() << str2.section(",", 0, 0).toStdString().data();
    qDebug() << str2.section(",", 1, 1).toStdString().data();

    //indexOf第一个参数是查询起始位置,第二个参数是显示位数
    QString str3 = "192.168.1.10";
    qDebug() << str3.left(str3.indexOf(".")).toStdString().data();
    qDebug() << str3.mid(str3.indexOf(".") + 1, 3).toStdString().data();
    qDebug() << str3.mid(str3.indexOf(".") + 1, 1).toStdString().data();
    qDebug() << str3.right(str3.size() - (str3.lastIndexOf(".") +         1)).toStdString().data();

    // 判断字符串是否为空
    QString str4, str5 = "";
    qDebug() << str4.isNull();    // 为空则为True
    qDebug() << str5.isNull();    // \0不为空
    qDebug() << str5.isEmpty();   // 为空则为False,不为空为true

    return a.exec();
}

QString 字符串转换:

#pragma execution_character_set("utf-8")
#include <QCoreApplication>
#include <QString>
#include <QDebug>

int main(int argc, char* argv[])
{
    QCoreApplication a(argc, argv);

    QString str = "uname,uage,usex";
    QString int_str = "100,200,300";

    //大小写转换
    str = str.toUpper();            // 转为大写
    qDebug() << str.toStdString().data();
    str = str.toLower();            // 转为小写
    qDebug() << str.toStdString().data();

    //将字符串转为整数
    bool flag = false;
    QString x = int_str.section(",", 0, 0);   // 提取出第一个字符串

    int dec = x.toInt(&flag, 10);              // 转为十进制整数
    qDebug() << dec;

    int hex = x.toUInt(&flag, 16);            // 转为十六进制数
    qDebug() << hex;

    //将整数转为字符串
    int number = 100;
    QString number_str;
    number_str = number_str.setNum(number, 16);  // 转为十六进制字符串
    qDebug() << number_str.toStdString().data();

    //编码之间的转换
    QString str_string = "welcome to you !";

    QByteArray ba = str_string.toUtf8();
    qDebug() << ba.toStdString().data();

    //格式化输出转换
    float total = 3.1415926;
    QString str_total;

    //实例调用法
    str_total = str_total.sprintf("%.4f", total);
    qDebug() << str_total.toStdString().data();
    //静态调用法
    str_total = QString::asprintf("%2f", total);
    qDebug() << str_total.toStdString().data();

    return a.exec();
}

顺序容器
顺序容器 QList,QLinkedList,QVector,QStack,QQueue
qlist: 顺序容器,qlist是以下表的方式对数据进行访问的,可以使用下表索引的方式访问特定数据。

#include <QCoreApplication>
#include <QList>
#include <QDebug>


void Display(QList<QString> &ptr)
{
    qDebug() << "-----------------------------";
    for (qint32 x = 0; x < ptr.count(); x++)
    {
        qDebug() << (ptr.at(x)).toStdString().data();
    }
    qDebug();
}

int main(int argc, char* argv[])
{
    QCoreApplication a(argc, argv);

    QList<QString> StringPtrA;
    QList<QString> StringPtrB;

    // 添加三个成员
    StringPtrA.append("admin");
    StringPtrA.append("guest");
    StringPtrA.append("Pan");
    Display(StringPtrA);

    // 在首部插入hanter
    StringPtrA.prepend("hanter");
    Display(StringPtrA);

    // 在第0的位置插入lucy
    StringPtrA.insert(0, QString("lucy"));
    Display(StringPtrA);

    // 替换原来的admin为全拼
    StringPtrA.replace(1, "Administrator");
    Display(StringPtrA);

    // 删除第0个元素
    StringPtrA.removeAt(0);
    Display(StringPtrA);

    // 删除首部和尾部
    StringPtrA.removeFirst();
    StringPtrA.removeLast();
    Display(StringPtrA);

    // 移动两个变量
    StringPtrA.move(0, 1);
    Display(StringPtrA);

    // 将两个list容器对调交换
    StringPtrB = { "hello","hi" };
    StringPtrA.swap(StringPtrB);
    Display(StringPtrA);
    return a.exec();
}

qlist可以指定一个struct结构进行数据操作

#include <QCoreApplication>
#include <QLinkedList>
#include <QLinkedListIterator>
#include <QMutableLinkedListIterator>
#include <QDebug>

struct MyStruct
{
    qint32 uid;
    QString uname;
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QList<MyStruct> ptr;
    MyStruct str_ptr;

    str_ptr.uid = 1001;
    str_ptr.uname = "admin";
    ptr.append(str_ptr);

    str_ptr.uid = 1002;
    str_ptr.uname = "guest";
    ptr.append(str_ptr);

    //使用传统方式遍历数据
    for(qint32 x=0;x<ptr.count();x++)
    {
        qDebug() << ptr.at(x).uid;
        qDebug() << ptr[x].uname.toStdString().data();
    }

    //使用只读迭代器遍历
    QListIterator<MyStruct> x(ptr);
    while(x.hasNext())
    {
        // peeknext读取下一个节点,但不影响指针变化
        qDebug() << x.peekNext().uid;
        qDebug() << (x.peekNext().uname).toStdString().data();
        // 最后将x指针指向下一个数据
        x.next();
    }

    //使用读写迭代器:如果uid=1002则将guest改为Pan
    QMutableListIterator<MyStruct> y(ptr);
    while(y.hasNext())
    {
        if(y.peekNext().uid == 1002)
        {
            y.peekNext().uname = "Pan";
        }
        y.next();
    }
    return a.exec();
}

qlinklist:qlinklist就是动态链表结构,数据的存储非连续,访问时无法直接使用下标定位,只能通过迭代器迭代寻找,参数定义与qlist基本一致。

#include <QCoreApplication>
#include <QLinkedList>
#include <QLinkedListIterator>
#include <QMutableLinkedListIterator>
#include <QDebug>

struct MyStruct
{
    qint32 uid;
    QString uname;
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QLinkedList<MyStruct> ptr;
    MyStruct str_ptr;

    str_ptr.uid = 1001;
    str_ptr.uname = "admin";
    ptr.append(str_ptr);

    str_ptr.uid = 1002;
    str_ptr.uname = "guest";
    ptr.append(str_ptr);


    //使用只读迭代器遍历: 从前向后遍历
    QLinkedListIterator<MyStruct> x(ptr);
    while(x.hasNext())
    {
        qDebug() << x.peekNext().uid;
        x.next();
    }

    //使用只读迭代器遍历: 从后向前遍历
    for(x.toBack();x.hasPrevious();x.previous())
    {
        qDebug() << x.peekPrevious().uid;

    }

    // 使用STL风格的迭代器遍历
    QLinkedList<MyStruct>::iterator y;
    for(y=ptr.begin(); y!=ptr.end(); ++y)
    {
        qDebug() << (*y).uid;
    }

    //STL风格的只读迭代器
    QLinkedList<MyStruct>::const_iterator z;
    for(z=ptr.constBegin(); z!=ptr.constEnd(); ++z)
    {
        qDebug() <<((*z).uname).toStdString().data();
    }

    //使用读写迭代器: 动态生成列表,每次对二取余
    QLinkedList<int> Number = {1,2,3,4,5,6,7,8,9,10};
    QMutableLinkedListIterator<int> item(Number);

    //--> 从前向后输出一次
    for(item.toFront();item.hasNext();item.next())
        qDebug() << item.peekNext();

    //--> 将指针移动到最后然后判断
    for(item.toBack();item.hasPrevious();)
    {
        if(item.previous() % 2==0)
            item.remove();
        else
            item.setValue(item.peekNext() * 10);
    }

    //--> 最后输出出相加后的结果
    for(item.toFront();item.hasNext();)
    {
        qDebug() << item.peekNext();
        item.next();
    }
    return a.exec();
}

QVector:该容器在相邻内存中存储连续的数据,该方式的使用与Qlist完全一致,但性能要比Qlist更高,但在插入时速度最慢

#include <QCoreApplication>
#include <QDebug>
#include <QVector>
#include <QVectorIterator>
#include <QMutableVectorIterator>

struct MyStruct
{
    qint32 uid;
    QString uname;
};

int main(int argc, char* argv[])
{
    QCoreApplication a(argc, argv);

    QVector<MyStruct> ptr;
    MyStruct str_ptr;

    str_ptr.uid = 1001;
    str_ptr.uname = "admin";
    ptr.append(str_ptr);

    str_ptr.uid = 1002;
    str_ptr.uname = "guest";
    ptr.append(str_ptr);

    //使用传统方式遍历
    for (qint32 x = 0; x < ptr.count(); x++)
    {
        qDebug() << ptr.at(x).uid;
        qDebug() << ptr[x].uname.toStdString().data();
    }

    //使用只读迭代器遍历: C++ STL写法
    QVector<MyStruct>::const_iterator item;
    for (item = ptr.begin(); item != ptr.end(); ++item)
    {
        qDebug() << (*item).uid;
        qDebug() << (*item).uname.toStdString().data();
    }

    //使用读写迭代器修改: C++ STL写法
    QVector<MyStruct>::iterator write_item;
    for (write_item = ptr.begin(); write_item != ptr.end(); ++write_item)
    {
        if ((*write_item).uid == 1001)
        {
            (*write_item).uname = "xxxx";
        }
        qDebug() << (*write_item).uid;
        qDebug() << (*write_item).uname.toStdString().data();
    }

    return a.exec();
}

QStack:qstack时堆栈结构先进后出

#include <QCoreApplication>
#include <QDebug>
#include <QString>
#include <QStack>
#include <QQueue>

struct MyStruct
{
    qint32 uid;
    QString uname;
};

int main(int argc, char* argv[])
{
    QCoreApplication a(argc, argv);

    //定义并弹出QString类型数据
    QStack<QString> stack;

    stack.push("admin");
    stack.push("guest");

    qDebug() << (stack.top()).toStdString().data();
    while (!stack.isEmpty())
    {
        qDebug() << (stack.pop()).toStdString().data();
    }

    //定义并弹出一个结构类型数据
    QStack<MyStruct> struct_stack;
    MyStruct ptr;

    ptr.uid = 1001;
    ptr.uname = "admin";
    struct_stack.push(ptr);

    ptr.uid = 1002;
    ptr.uname = "guest";
    struct_stack.push(ptr);

    //分别弹出数据并输出
    while (!struct_stack.isEmpty())
    {
        MyStruct ref;

        ref = struct_stack.pop();
        qDebug() << "uid = " << ref.uid;
        qDebug() << "uname = " << ref.uname.toStdString().data();
    }

    return a.exec();
}

QQueue: qqueue 队列,先进先出

#include <QCoreApplication>
#include <QDebug>
#include <QString>
#include <QQueue>

struct MyStruct
{
    qint32 uid;
    QString uname;
};

int main(int argc, char* argv[])
{
    QCoreApplication a(argc, argv);

    QQueue<MyStruct> ptr;
    MyStruct queue_ptr;

    //实现对结构体的入队
    queue_ptr.uid = 1001;
    queue_ptr.uname = "admin";
    ptr.enqueue(queue_ptr);

    queue_ptr.uid = 1002;
    queue_ptr.uname = "guest";
    ptr.enqueue(queue_ptr);

    //实现对结构体的出队
    while (!ptr.isEmpty())
    {
        MyStruct ref;

        ref = ptr.dequeue();
        qDebug() << "uid = " << ref.uid;
        qDebug() << "uname = " << ref.uname.toStdString().data();
    }

    return a.exec();
}

关联容器
关联容器: qmap,qmultimap,qhash,qmultihash,qmultihash,qset
qmap/qmultimap:提供了一个字典类型的关联数组,一个键映射一个值,qmap是按照顺序存储的,如果不在意顺序可以使用qhash,使用qhash效率更高

#include <QCoreApplication>
#include <QDebug>
#include <QString>
#include <QtGlobal>
#include <QMap>
#include <QMapIterator>

struct MyStruct
{
    qint32 uid;
    QString uname;
};

int main(int argc, char* argv[])
{
    QCoreApplication a(argc, argv);

    QMap<QString, QString> map;

    map["1001"] = "admin";
    map["1002"] = "guest";
    map.insert("1003", "lili");
    map.insert("1004", "lucy");

    //根据键值对查询属性
    qDebug() << map["1002"].toStdString().data();
    qDebug() << map.value("1003").toStdString().data();
    qDebug() << map.key("admin").toStdString().data();

    //使用STL语法迭代枚举Map键值对
    QMap<QString, QString>::const_iterator x;
    for (x = map.constBegin(); x != map.constEnd(); ++x)
    {
        qDebug() << x.key().toStdString().data() << " : ";
        qDebug() << x.value().toStdString().data();
    }

    //使用STL语法实现修改键值对
    QMap<QString, QString>::iterator write_x;
    write_x = map.find("1003");
    if (write_x != map.end())
        write_x.value() = "you ary in";

    //使用QTglobal中自带的foreach遍历键值对
    QString each;

    //--> 单循环遍历
    foreach(const QString & each, map.keys())
    {
        qDebug() << map.value(each).toStdString().data();
    }

    //--> 多循环遍历
    foreach(const QString & each, map.uniqueKeys())
    {
        foreach(QString x, map.value(each))
        {
            qDebug() << each.toStdString().data() << " : ";
            qDebug() << x.toStdString().data();
        }
    }

    return a.exec();
}

qmultimap是qmap的子集,用于处理多值映射的类

#include <QCoreApplication>
#include <QDebug>
#include <QString>
#include <QList>
#include <QMultiMap>


struct MyStruct
{
    qint32 uid;
    QString uname;
};

int main(int argc, char* argv[])
{
    QCoreApplication a(argc, argv);

    QMultiMap<QString, QString> mapA, mapB, mapC, mapD;

    mapA.insert("Pan", "1000");
    mapA.insert("Pan", "2000");
    mapB.insert("admin", "3000");
    mapB.insert("admin", "4000");
    mapC.insert("admin", "5000");

    //获取到里面的所有key=Pan的值
    QList<QString> ref;

    ref = mapA.values("Pan");
    for (int x = 0; x < ref.size(); ++x)
    {
        qDebug() << ref.at(x).toStdString().data();
    }

    //两个key相同可相加后输出
    mapD = mapB + mapC;

    ref = mapD.values("admin");
    for (int x = 0; x < ref.size(); x++)
    {
        qDebug() << ref.at(x).toStdString().data();
    }

    return a.exec();
}

qhash使用上与qmap相同,但qhash效率更高,唯一的不同时qhash不排序,qmap自动排序
qset: qset 集合容器,是基于散列表的集合模板,存储顺序不定,查找速度最快,内部使用qhash实现

#include <QCoreApplication>
#include <QDebug>
#include <QString>
#include <QSet>

struct MyStruct
{
    qint32 uid;
    QString uname;
};

int main(int argc, char* argv[])
{
    QCoreApplication a(argc, argv);

    QSet<QString> set;

    set << "dog" << "cat" << "tiger";

    //测试某值是否包含于集合
    if (set.contains("cat"))
    {
        qDebug() << "include";
    }

    return a.exec();
}

将qlist与qmap结合使用,实现嵌套 , 在qmap中存储一个qlist数据

#include <QCoreApplication>
#include <QDebug>
#include <QString>
#include <QtGlobal>
#include <QList>
#include <QMap>

int main(int argc, char* argv[])
{
    QCoreApplication a(argc, argv);

    QMap<QString, QList<float>> map;
    QList<float> ptr;

    //指定第一组数据
    ptr.append(10.1);
    ptr.append(12.5);
    ptr.append(22.3);
    map["10:10"] = ptr;

    //指定第二组数据
    ptr.clear();
    ptr.append(102.2);
    ptr.append(203.2);
    ptr.append(102.1);
    map["11:20"] = ptr;

    //输出所有的数据
    QList<float> tmp;
    foreach(QString each, map.uniqueKeys())
    {
        tmp = map.value(each);
        qDebug() << "Time: " << each.toStdString().data();
        for (qint32 x = 0; x < tmp.count(); x++)
        {
            qDebug() << tmp[x];
        }
    }

    return a.exec();
}

将两个qlist合并为一个qmap,将列表合并为一个字典

#include <QCoreApplication>
#include <QDebug>
#include <QString>
#include <QtGlobal>
#include <QList>
#include <QMap>

int main(int argc, char* argv[])
{
    QCoreApplication a(argc, argv);

    QList<QString> Header = { "MemTotal","MemFree","Cached","SwapTotal","SwapFree" };
    QList<float> Values = { 12.5,46.8,68,100.3,55.9,86.1 };
    QMap<QString, float> map;

    //将列表合并为一个字典
    for (int x = 0; x < Header.count(); x++)
    {
        QString head = Header[x].toStdString().data();
        float val = Values[x];
        map[head] = val;
    }

    //输出特定字典中的数据
    qDebug() << map.key(100.3).toStdString().data();
    qDebug() << map.value("SwapTotal");

    return a.exec();
}

反之,将字典拆分为一个列表

#include <QCoreApplication>
#include <QDebug>
#include <QString>
#include <QtGlobal>
#include <QList>
#include <QMap>

void Display(QMap<QString, float> map)
{
    foreach(const QString & each, map.uniqueKeys())
    {
        qDebug() << each.toStdString().data();
        qDebug() << map.value(each);
    }
}

int main(int argc, char* argv[])
{
    QCoreApplication a(argc, argv);

    QMap<QString, float> map;

    map["MemTotal"] = 12.5;
    map["MemFree"] = 32.1;
    map["Cached"] = 19.2;

    Display(map);

    QList<QString> map_key;
    QList<float> map_value;

    //分别存储起来
    map_key = map.keys();
    map_value = map.values();

    //输出所有的key值
    for (int x = 0; x < map_key.count(); x++)
    {
        qDebug() << map_key[x].toStdString().data();
    }

    //输出所有的value值
    for (int x = 0; x < map_value.count(); x++)
    {
        qDebug() << map_value[x];
    }

    return a.exec();
}

排序结构体:

#include <QCoreApplication>
#include <QDebug>
#include <QString>
#include <QtGlobal>
#include <QList>

struct MyStruct
{
    int uuid;
    QString uname;
};

void Display(QList<int> ptr)
{
    foreach(const int& each, ptr)
        qDebug() << each << " ";
    qDebug();
}

//由大到小排列
int compare(const int& infoA, const int& infoB)
{
    return infoA > infoB;
}

//针对结构体的排序方法
void devListSort(QList<MyStruct>* list)
{
    std::sort(list->begin(), list->end(), [](const MyStruct& infoA, const MyStruct& infoB)
        {
            return infoA.uuid < infoB.uuid;
        });
}

int main(int argc, char* argv[])
{
    QCoreApplication a(argc, argv);

    //定义并对单一数组排序
    QList<int> list = { 56,88,34,61,79,82,34,67,88,1 };
    std::sort(list.begin(), list.end(), compare);
    Display(list);

    //定义并对结构体排序
    QList<MyStruct> list_struct;
    MyStruct ptr;

    ptr.uuid = 1005;
    ptr.uname = "admin";
    list_struct.append(ptr);

    ptr.uuid = 1002;
    ptr.uname = "guest";
    list_struct.append(ptr);

    ptr.uuid = 1000;
    ptr.uname = "Pan";
    list_struct.append(ptr);

    devListSort(&list_struct);

    for (int x = 0; x < list_struct.count(); x++)
    {
        qDebug() << list_struct[x].uuid << " ---> ";
        qDebug() << list_struct[x].uname.toStdString().data();
    }

    return a.exec();
}

正则表达式模块:

#include <QCoreApplication>
#include <QDebug>
#include <QString>
#include <QtGlobal>

int main(int argc, char* argv[])
{
    QCoreApplication a(argc, argv);

    //返回绝对值
    qDebug() << qAbs(10.5);

    //返回较大者
    qDebug() << qMax(12, 56);

    //返回较小者
    qDebug() << qMin(22, 56);

    //返回随机数
    double x = 6.7, y = 3.5;
    int ref = qRound(x);
    qDebug() << ref;

    //交换位置
    qSwap(x, y);
    qDebug() << x;

    return a.exec();
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值