STL(详细代码)

一、vector

封装了动态大小数组的顺序容器

基本函数

1. 构造与析构

1)vector();        //创建空vector

2)vector(int size);        //创建元素个数为size的vector

3)vector(int size , const T& t);        //创建元素个数为size,且值均为t的vector

4)vector(const vector&);        //复制构造函数

5)vector(begin , end);        //复制[begin , end)区间内元素到vector

6)~vector();        //删除所有元素,释放内存

//---构造与析构---
    vector<int> myV;//空vector
    vector<int> myV1(10);//元素个数为10
    vector<int> myV2(10,123);//元素个数为10,且值均为123

    vector<int>::iterator vfirst,vsecond;
    vfirst = myV.begin();
    vsecond = myV.end() - 1;//最后一个元素
    vector<int> myV3(vfirst,vsecond);//从myV中提取拷贝(begin到end的前一个)

2. 非变动性函数

1)int size() const;        //返回元素个数

2)bool empty() const;        //判断是否为空      

3)int capacity() const;        //返回空间大小

4)int max_size() const;        //返回可允许的最大元素值

5)operator  ==、!=、<、<=、>、>=

//---非变动性函数---
    printf("%lu\n",myV.size());//数组元素个数
    printf("%lu\n",myV.capacity());//数组空间大小
    if (myV > myV2)//关系判断的标准是基于strcmp
    {
        printf("myV > myV2\n");
    }
    else
        printf("myV <= myV2\n");

3. 赋值操作

1)void swap(vector& t);        //交换两个同类型的数据

2)void assign(int n , const T& t);        //设置n个值为t的元素

3)void assign(const_iterator first , const_iterator end);

        //容器中[first , end)中元素设置为当前元素

4)operator =

//---赋值操作---
    myV.swap(myV2);
    myV.assign(5,123);//设置容器中5个123

4. 元素存取

1)reference at(int pos);        //返回下标pos的元素

2)reference front();        //返回首元素

3)reference back();        //返回尾元素

//---元素存取---
    printf("%d\n",myV.at(3));//返回下标3的元素
    printf("%d\n",myV.front());//返回首元素
    printf("%d\n",myV.back());//返回尾元素

5. 迭代器相关

1)iterator begin();        //返回头指针,指向第一个元素

2)iterator end();        //返回尾指针,指向最后一个元素的下一个位置

3)reverse_iterator rbegin();        //反向迭代器,指向最后一个元素

4)reverse_iterator rend();        //反向迭代器,指向第一个元素的前一个位置

//---迭代器相关---
    vfirst = myV.begin();
    *vfirst = 11;

6. 插入删除

1)void push_back(const T& t);        //向容器尾部增加元素t

2)iterator insert(iterator vit , const T& t);        //向迭代器指向的元素前增加元素t

3)iterator insert(iterator vit , int n , const T& t);        //向迭代器指向的元素前增加n个元素t

4)iterator erase(iterator vit);        //删除迭代器指向的元素

5)iterator erase(iterator first , iterator end);        //删除[first , end]中的元素

6)void pop_back();        //删除尾部元素

7)void clear();        //清空容器中所有元素

//---插入删除---
    for (int i = 0; i < 10; i++)
    {
        myV.push_back(i+1);//尾部添加
    }
    vector<int>::iterator vit;//vector容器内嵌的迭代器
    vit = myV.begin();
    myV.insert(vit,123);//插入123
    myV.insert(vit,2,123);//插入两个123
    myV.erase(vit);//删除
    for (vit = myV.begin(); vit != myV.end(); vit++)
    {
        printf("%d\n",*vit);//输出
    }

7. 改变大小

1)void resize(int n);        //将元素个数改为n

2)void resize(int n , T elem);        //将元素个数改为n,如果size()大了,多出来的为elem

    vectorArr.resize(row);//定义行数

实现二维数组

    int row = 5;//行数
    int col = 6;//列数
    vector< vector<int> > vectorArr;
    vectorArr.resize(row);//定义行数
    for (int i = 0; i < row; i++)
    {
        vectorArr[i].resize(col);//定义列数
        for (int j = 0; j < col; j++)
        {
            vectorArr[i][j] = i*col + j + 1;//赋值
        }
    }
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            printf("%d\t",vectorArr[i][j]);//输出
        }
        printf("\n");
    }

二、stack

栈是一种先进后出的数据结构,是操作受限的线性表

基本函数

1. 入栈出栈

1)push(elem);        //入栈,插入elem的一个副本

2)pop();        //出栈

2. 其他函数

1)empty();        //判断是否为空

2)size();        //返回元素个数

3)swap(s2);        //将自己与s2容器进行互换 

4)top();        //返回栈顶元素

代码示例 

    stack<int> myS;//空栈

    myS.push(1);//入栈
    myS.push(2);

    while (!myS.empty())//判空
    {
        printf("%d\n",myS.top());//输出栈顶元素
        myS.pop();//出栈
    }

三、queue

队列是一种先进先出的数据结构,也是操作受限的线性表,不提供迭代器操作

基本函数

1. 入队出队

1)push(elem);        //入队,在队尾插入elem的一个副本

2)pop();        //出队,删除队首元素

2. 其他函数

1)empty();        //判断是否为空

2)size();        //返回元素个数

3)front();        //返回队首元素

4)back();        //返回队尾元素

5)swap(q2);        //将自己与q2容器进行互换

代码示例

    queue<int> myQ1;//空队
    queue<int> myQ2;//空队

    myQ1.push(1);//入队
    myQ1.push(2);
    myQ2.push(1);
    myQ2.push(2);

    while (!myQ1.empty())//判空
    {
        printf("%d\n",myQ1.front());//输出队首元素
        printf("%d\n",myQ1.back());//输出队尾元素
        myQ1.pop();//出队
    }
    //栈和队都还有关系运算符的重载操作
    if (myQ1 > myQ2)
    {
        printf("myQ1 > myQ2\n");
    }
    else
        printf("myQ1 <= myQ2\n");

四、deque

是双向开口的连续线性空间(动态将多个连续空间通过指针数组结合在一起)

基本函数

1. 构造与析构

1)deque d;        //创建空deque

2)deque d1(d2);        //复制构造函数

3)deque d(n);        //创建一个元素个数为n的deque

4)deque d(n , elem);        //创建一个元素个数为n,元素均为elem副本的deque

5)deque d(beg , end);        //创建一个deque,以区间[beg , end)内元素作初值

6)~deque();        //删除所有元素,释放内存

2. 非变动性函数

1)front();        //返回第一个元素

2)back();        //返回最后一个元素

3)begin();        //返回头指针,指向第一个元素

4)end();        //返回尾指针,指向最后一个元素的下一个位置

5)rbegin();        //反向迭代器,指向最后一个元素

6)rend();        //反向迭代器,指向第一个元素的前一个位置

3. 赋值操作

1)operator =        //将d2的所有元素赋值给d1

2)assign(n , elem);        //将n个elem副本赋值给q

3)assign(beg , end);        //将区间[beg , end)中的元素赋值给q

4)d1.swap(d2);        //将d1与d2的元素互换

5)swap(d1 , d2);        //将d1与d2的元素互换,此为全局变量

4. 插入删除

1)insert(pos , elem);        //在下标pos位置插入elem的一个副本

2)insert(pos , n , elem);        //在下标pos位置插入elem的n个副本

3)insert(pos , beg , end);        //在下标pos位置插入在区间[beg , end)中的所有元素

4)push_back(elem);        //在尾部添加elem的一个副本

5)pop_back();        //删除尾部元素

6)push_front(elem);        //在头部添加elem的一个副本

7)pop_front();        //删除头部元素

8)erase(pos);        //删除下标pos位置上的元素,返回下一个元素位置

9)erase(beg , end);        //删除[beg , end)区间内的所有元素,返回下一个元素位置

10)clear();        //清空容器中所有元素

5. 改变大小

1)resize(n);        //将元素个数改为n,如果size()大了,多出来的都以默认构造函数产生出来

2)resize(n , elem);        //将元素个数改为n,如果size()大了,多出来的为elem

代码示例

    deque<int> myD;
    for (int i = 0; i < 5; i++)
    {
        myD.push_front(i+1);//头部添加
    }
    for (int i = 0; i < 5; i++)
    {
        myD.push_back((i+1)*10);//尾部添加
    }

    deque<int>::iterator dit;//迭代器
    dit = myD.begin() + 4;
    myD.erase(dit);//删除

    for (dit = myD.begin(); dit != myD.end(); dit++)
    {
        printf("%d\n",*dit);
    }

五、list

list使用一个双向链表来管理元素 

基本函数 

1. 构造与析构

1)list a;        //创建空list

2)list a1(a2);        /复制构造函数

3)list a(n);        //创建一个元素个数为n的list

4)list a(n , elem);        //创建一个元素个数为n,元素均为elem副本的list

5)list a(beg , end);        //创建一个list,以区间[beg , end)内元素作初值

6)~list();        //删除所有元素,释放内存

2. 非变动性函数

1)size();        //返回元素个数

2)empty();        //判断是否为空

3)max_size();        //返回可允许的最大元素数量

4)operator ==、!=、<、<=、>、>=

3. 赋值函数

1)operator =        //将a2的所有元素赋值给a1

2)a.assign(n , elem);        //将n个elem副本赋值给a

3)a.assign(beg , end);        //将区间[beg , end)中的元素赋值给a

4)a1.swap(a2);        //将a1与a2的元素互换

5)swap(a1 , a2);        //将a1与a2的元素互换,此为全局变量

4. 直接取

1)a.front();        //返回第一个元素

2)a.back();        //返回最后一个元素

注意:list不支持随机存取,只有上述2个函数才能直接取元素

5. 迭代器相关

1)a.begin();        //返回头指针,指向第一个元素

2)a.end();        //返回尾指针,指向最后一个元素的下一个位置

3)a.rbegin();        //反向迭代器,指向最后一个元素

4)a.rend();        //反向迭代器,指向第一个元素的前一个位置

注意:只有运用迭代器,才能直接存取list中元素           

6. 插入删除

1)a.insert(pos , elem);        //在迭代器pos位置插入elem的一个副本,返回新元素的位置

2)a.insert(pos , n , elem);        //在迭代器pos位置插入elem的n个副本

3)a.insert(pos , beg , end);        //在迭代器pos位置插入在区间[beg , end)中的所有元素

4)a.push_back(elem);        //在尾部添加elem的一个副本

5)a.pop_back();        //删除尾部元素

6)a.push_front(elem);        //在头部添加elem的一个副本

7)a.pop_front();        //删除头部元素

8)a.erase(pos);        //删除迭代器pos位置上的元素,返回下一个元素位置

9)a.erase(beg , end);        //删除[beg , end)区间内的所有元素,返回下一个元素位置

10)a.clear();        //清空容器中所有元素

11)a.remove(val);        //删除所有值为val的元素

12)a.remove_if(op);        //删除所有“造成op结果为true”的元素

bool isBase(int val)
{
    return val%2 == 1;
}
    list<int> myL;
    for (int i = 0; i < 5; i++)
    {
        myL.push_front(i+1);//头部添加
    }
    for (int i = 0; i < 5; i++)
    {
        myL.push_back((i+1)*10);//尾部添加
    }

    myL.push_front(1);
    myL.push_front(1);
    myL.push_back(1);
    myL.push_back(1);
    myL.push_back(1);

    list<int>::iterator lit;//迭代器
    lit = myL.begin();
    for (int i = 0; i < 3; i++)
    {
        lit++;
    }
    myL.insert(lit,123);
    // myL.remove(1);
    myL.remove_if(isBase);

    for (lit = myL.begin(); lit != myL.end(); lit++)
    {
        printf("%d\n",*lit);
    }

7. 改变大小

1)a.resize(n);        //将元素个数改为n,如果size()大了,多出来的都以默认构造函数产生出来

2)a.resize(n , elem);        //将元素个数改为n,如果size()大了,多出来的为elem

8. 特殊变动性函数

1)a.unique();        //如果存在若干个相邻而数值相同的元素,删除重复元素,只留下一个

2)a.unique(op);        //如果存在若干个相邻元素,都使op()的结果为true,删除重复元素,只留下一个

3)a1.splice(pos , a2);        //将a2内的所有元素转移到a1内的pos之前

4)a1.splice(pos , a2 , a2pos);        //将a2内的a2pos所指元素转移到a1内的pos所指位置上

5)a1.splice(pos , a2 , a2beg , a2end);        //将a2内的[a2beg , a2end)区间内的所有元素转移到a2内的pos之前

6)a.sort();        //以operator< 为准则,对所有元素排序

7)a.sort(op);        //以op()为准则,对所有元素排序

8)a1.merge(a2);        //假设a1和a2容器都包含已排序元素,将a2的全部元素转移到a1,并保证合并后已排序

9)a1.merge(a2 , op);        //假设a1和a2容器都包含op()准则下的已排序元素,将a2的全部元素转移到a1,并保证合并后已排序

10)a.reverse();        //将所有元素反序

六、map

一种非严格意义上的平衡二叉树(二叉查找树)

基本函数

1. 构造与析构

1)map p;        //创建空map

2)map p1(p2);        //复制构造函数

3)map p(beg , end);        //创建一个map,以区间[beg , end)内元素作初值

4)~map();        //删除所有元素,释放内存

2. 非变动性操作

1)p.size();

2)p.empty();

3)p.max_size();

4)operator ==、!=、>、>=、<、<=

5)find(key);        //返回“键值等于key”的元素,找不到返回end()

3. 赋值操作

1)operator =        //将p2的所有元素赋值给p1

2)p1.swp(p2);        //将p1与p2的元素互换

3)swap(p1 , p2);        //将p1与p2的元素互换,此为全局变量

4. 插入删除

1)p.insert(elem);        //插入elem的一个副本

2)p.insert(pos , elem);        //在迭代器pos位置插入elem的一个副本

3)p.insert(beg , end);        //将区间[beg , end)中的所有元素插入

8)p.erase(pos);        //删除迭代器pos位置上的元素,无返回值

9)p.erase(beg , end);        //删除[beg , end)区间内的所有元素,无返回值

10)p.clear();        //清空容器中所有元素

代码示例

    map <string,int> myM;
    //第一个是key的类型,第二个是value的类型

    myM.insert(std::make_pair("zhangsan",10));
    //通过std命名空间里的函数模版来进行插入

    myM.insert(map<string,int>::value_type("lisi",20));
    //通过map里面有个结构来进行插入

    myM.insert(std::pair<string,int>("wangwu",30));
    //通过std里面的pair这个结构来进行插入

    map<string,int>::iterator mit;
    for (mit = myM.begin(); mit != myM.end(); mit++)
    {
        printf("%s-%d\n",mit->first.c_str(),mit->second);
    }

七、multimap

map容器中一个key对应一个value,multimap容器中一个key可以对应多个value 

作用:通讯录

基本函数

特殊搜寻操作

1)count(key);        //返回“键值等于key”的元素个数

2)find(key);        //返回“键值等于key”的第一个元素,找不到就返回end()

3)lower_biund(key);        //返回“键值等于key”的元素的第一个可插入位置,也就是“键值 >= key”的第一个元素位置

4)upper_bound(key);        //返回“键值等于key”的元素的最后一个可插入位置,也就是“键值 > key”的第一个元素位置

5)equal_range(key);        //返回“键值等于key”的元素的第一个可插入位置和最后一个可插入位置,也就是“键值 = key”的元素区间

代码示例 

    multimap<int,string> myP;
    myP.insert(std::make_pair(2,"zhang"));
    myP.insert(std::make_pair(2,"li"));
    myP.insert(std::make_pair(2,"wang"));
    myP.insert(std::make_pair(1,"aaa"));
    myP.insert(std::make_pair(3,"bbb"));
    //  //myP[2];没有这样的引用

    printf("%lu\n",myP.count(2));//元素个数

    multimap<int,string>::iterator pit;

    pit = myP.lower_bound(2);//返回第一个可插入位置
    printf("%d-%s\n",pit->first,pit->second.c_str());
    pit = myP.upper_bound(2);//返回最后一个可插入位置
    printf("%d-%s\n",pit->first,pit->second.c_str());
    printf("------------\n");

    auto res = myP.equal_range(2);//返回两个位置
    printf("%d-%s\n",res.first->first,res.first->second.c_str());
    printf("%d-%s\n",res.second->first,res.second->second.c_str());

    pit = myP.find(2);//返回第一个元素
    printf("%d-%s\n",pit->first,pit->second.c_str());
    printf("------------\n");

    for (pit = myP.begin(); pit != myP.end(); pit++)
    {
        printf("%d-%s\n",pit->first,pit->second.c_str());
    }

八、set

和map也很类似,也是封装了平衡二叉树,关联式容器 

作用:去重

集合操作

1)std::set_insersection();        //求两个集合的交集

2)std::set_union();        //求两个集合的并集

3)std::set_difference();        //差集

4)std::set_symmetric_difference();        //得到的结果是第一个迭代器相对于第二个的差集

九、multiset 

和set有区别的地方是,值可以出现多个。set中值是唯一,multiset值可以不是唯一

基本函数

1)count(key);        //返回“键值等于key”的元素个数

2)find(key);        //返回“键值等于key”的第一个元素,找不到就返回end()

3)lower_biund(key);        //返回“键值等于key”的元素的第一个可插入位置,也就是“键值 >= key”的第一个元素位置

4)upper_bound(key);        //返回“键值等于key”的元素的最后一个可插入位置,也就是“键值 > key”的第一个元素位置

5)equal_range(key);        //返回“键值等于key”的元素的第一个可插入位置和最后一个可插入位置,也就是“键值 = key”的元素区间

代码示例

#include <set>
using std::set;
#include <algorithm>
#include <iterator>
using std::insert_iterator;
    set<int> s1,s2;

    for (int i = 0; i < 3; i++)
    {
        s1.insert(i+1);
        s2.insert(i+1);
    }
    s1.insert(123);
    s1.insert(456);
    s2.insert(20);
    s2.insert(30);

    set<int>::iterator sit;
    sit = s1.find(3);
    printf("%d\n",*sit);
    printf("------------\n");

    set<int> out[5];
    //---交集---
    std::set_intersection(s1.begin(),
                            s1.end(),
                            s2.begin(),
                            s2.end(),
        insert_iterator< set<int> >(out[0],out[0].begin()));
    printf("交集:\n");
    for (sit = out[0].begin(); sit != out[0].end(); sit++)
    {
        printf("%d\n",*sit);
    }
    printf("------------\n");
    //---并集---
    std::set_union(s1.begin(),
                            s1.end(),
                            s2.begin(),
                            s2.end(),
        insert_iterator< set<int> >(out[1],out[1].begin()));
    printf("并集:\n");
    for (sit = out[1].begin(); sit != out[1].end(); sit++)
    {
        printf("%d\n",*sit);
    }
    printf("------------\n");
    //---差集1---
    std::set_difference(s1.begin(),
                            s1.end(),
                            s2.begin(),
                            s2.end(),
        insert_iterator< set<int> >(out[2],out[2].begin()));
    printf("差集1:\n");
    for (sit = out[2].begin(); sit != out[2].end(); sit++)
    {
        printf("%d\n",*sit);
    }
    printf("------------\n");
    //---差集2---
    std::set_difference(s2.begin(),
                            s2.end(),
                            s1.begin(),
                            s1.end(),
        insert_iterator< set<int> >(out[3],out[3].begin()));
    printf("差集2:\n");
    for (sit = out[3].begin(); sit != out[3].end(); sit++)
    {
        printf("%d\n",*sit);
    }
    printf("------------\n");
    //---差集合并---
    std::set_symmetric_difference(s1.begin(),
                            s1.end(),
                            s2.begin(),
                            s2.end(),
        insert_iterator< set<int> >(out[4],out[4].begin()));
    printf("差集合并:\n");
    for (sit = out[4].begin(); sit != out[4].end(); sit++)
    {
        printf("%d\n",*sit);
    }
    printf("------------\n");

    for (sit = s1.begin(); sit != s1.end(); sit++)
    {
        printf("%d\n",*sit);
    }
    printf("------------\n");
    for (sit = s2.begin(); sit != s2.end(); sit++)
    {
        printf("%d\n",*sit);
    }

### 回答1: STL是C++标准模板库的缩写,它提供了一系列的模板类和函数,用于实现各种容器、算法和迭代器等,提供了丰富的功能和标准化的接口。 而GPS则是一种卫星导航系统,通过接收卫星发射的信号,可以确定地面点的位置坐标。 结合这两个概念,假设我们希望使用C++ STL来编写一个GPS代码,来实现一些基本的功能,比如获取当前位置、计算两点之间的距离等。 首先,我们可以使用STL提供的容器来存储经纬度信息,比如可以使用vector来存储。每个点的经纬度可以用一个结构体表示: ```cpp struct Position { double latitude; // 纬度 double longitude; // 经度 }; std::vector<Position> positions; ``` 然后,可以使用STL提供的算法来实现一些功能,比如计算两点之间的距离。可以使用Haversine公式来计算两个经纬度坐标对应的球面距离: ```cpp double haversineDistance(const Position& pos1, const Position& pos2) { double lat1 = pos1.latitude * M_PI / 180.0; double lon1 = pos1.longitude * M_PI / 180.0; double lat2 = pos2.latitude * M_PI / 180.0; double lon2 = pos2.longitude * M_PI / 180.0; double dlon = lon2 - lon1; double dlat = lat2 - lat1; double a = sin(dlat / 2) * sin(dlat / 2) + cos(lat1) * cos(lat2) * sin(dlon / 2) * sin(dlon / 2); double c = 2 * atan2(sqrt(a), sqrt(1 - a)); double distance = 6371 * c; // 地球半径为6371km return distance; } ``` 当然,以上只是一个简单的示例,实际应用中还需要考虑很多其他因素,比如坐标系转换、误差校正等。但通过使用STL,我们可以更方便地管理和操作数据,提高代码的可读性和可维护性。 ### 回答2: C++ STL是一种包含各种容器和算法的标准库,用于简化和加速C++程序的开发。GPS(全球定位系统)是一种利用卫星信号进行定位和导航的技术。要使用STL来编写GPS代码,可以使用STL容器和算法来管理和处理GPS数据。 首先,可以使用STL容器中的vector来存储GPS数据。vector是一种动态数组,可以根据需要自动调整大小。在这个vector中,可以存储GPS的位置信息,如经度、纬度和海拔高度等。 然后,可以使用STL算法来对GPS数据进行处理和分析。例如,可以使用STL中的sort算法对GPS数据进行排序,以便按照位置从近到远的顺序进行处理。还可以使用STL中的find算法来查找特定的GPS数据,如查找特定经度和纬度的位置。 此外,还可以使用STL中的迭代器(iterator)来遍历GPS数据。迭代器提供了一种方便和统一的方式来访问和操作容器中的元素。通过使用迭代器,可以遍历整个GPS数据集,并对每个位置进行必要的处理。 最后,可以使用STL中的其他算法和数据结构来进一步扩展GPS代码的功能。例如,可以使用STL中的map来实现位置和地址之间的映射关系,以便根据特定地址查询对应的GPS坐标。 总之,使用C++ STL可以方便地管理和处理GPS数据,提供了强大的容器和算法支持。这个库可以大大简化GPS代码的开发过程,并提高程序的效率和可维护性。 ### 回答3: STL(Standard Template Library)是C++的一个重要特性,其中包括了许多常用的数据结构和算法。GPS(General Positioning System)是一种全球定位系统,用于确定物体在地球上的位置。 在C++中,可以使用STL来编写处理GPS数据的代码。首先,可以使用STL提供的容器类(如vector、list等)来保存GPS数据,例如经度和纬度等信息。 接下来,可以使用STL提供的算法来对GPS数据进行处理。例如,可以使用算法库中的sort函数来将GPS数据按照经度或纬度进行排序,以便进一步分析和处理。 此外,STL还提供了一些用于处理字符串的函数,可以用于解析GPS数据中的其他信息,例如时间戳、海拔高度等。 除了容器和算法,STL还提供了迭代器(iterator)的概念,可以用于遍历容器中的元素。在处理GPS数据时,可以使用迭代器来逐个访问数据,并进行相关计算或输出。 最后,可以利用STL的异常处理机制,对可能出现的异常情况进行捕获和处理。例如,在解析GPS数据时,如果数据格式不符合预期,可以使用try-catch块来捕获异常并进行相应的错误处理。 综上所述,使用STL编写GPS代码可以利用STL提供的容器、算法、迭代器和异常处理等特性,方便地对GPS数据进行处理和分析,从而实现全球定位系统的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你怎么知道我头发乌黑浓密

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值