国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

[C++] STL_list常用接口的模擬實(shí)現(xiàn)

這篇具有很好參考價(jià)值的文章主要介紹了[C++] STL_list常用接口的模擬實(shí)現(xiàn)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

[C++] STL_list常用接口的模擬實(shí)現(xiàn),C++,c++,list,開(kāi)發(fā)語(yǔ)言

1、list的介紹與使用

1.1 list的介紹

list文檔介紹

  1. list是可以在常數(shù)范圍內(nèi)在任意位置進(jìn)行插入和刪除的序列式容器,并且該容器可以前后雙向迭代。
  2. list的底層是雙向鏈表結(jié)構(gòu),雙向鏈表中每個(gè)元素存儲(chǔ)在互不相關(guān)的獨(dú)立節(jié)點(diǎn)中,在節(jié)點(diǎn)中通過(guò)指針指向其前一個(gè)元素和后一個(gè)元素。
  3. list與forward_list非常相似:最主要的不同在于forward_list是單鏈表,只能朝前迭代,已讓其更簡(jiǎn)單效。
  4. 與其他的序列式容器相比(array,vector,deque),list通常在任意位置進(jìn)行插入、移除元素的執(zhí)行效率更好。
  5. 與其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的隨機(jī)訪(fǎng)問(wèn),比如:要訪(fǎng)問(wèn)list的第6個(gè)元素,必須從已知的位置(比如頭部或者尾部)迭代到該位置,在這段位置上迭代需要線(xiàn)性的時(shí)間開(kāi)銷(xiāo);list還需要一些額外的空間,以保存每個(gè)節(jié)點(diǎn)的相關(guān)聯(lián)信息(對(duì)于存儲(chǔ)類(lèi)型較小元素的大list來(lái)說(shuō)這可能是一個(gè)重要的因素)

1.2 list的使用

list中的接口比較多,此處類(lèi)似,只需要掌握如何正確的使用,然后再去深入研究背后的原理,已達(dá)到可擴(kuò)展的能力。

2、list迭代器

此處,我們可暫時(shí)將迭代器理解成一個(gè)指針,該指針指向list中的某個(gè)節(jié)點(diǎn)。
list我們都知道,它不是連續(xù)的空間,是我們將下一個(gè)位置的地址保存起來(lái),通過(guò)地址走到下一個(gè),因此我們需要重載一些運(yùn)算符。
后移的++(前置后置)
前移的 --(前置后置)
解引用的*,->
相等判斷的 ==,!=

這里我們?yōu)閘ist節(jié)點(diǎn)創(chuàng)建一個(gè)類(lèi),后面直接使用這個(gè)類(lèi)就可以了,再寫(xiě)一個(gè)缺省的構(gòu)造函數(shù),為后面開(kāi)節(jié)點(diǎn)提供便利。

// List的節(jié)點(diǎn)類(lèi)
template<class T>
struct ListNode
{
    ListNode(const T& val = T())
        :_pPre(nullptr)
        ,_pNext(nullptr)
        ,_val(val)
    {}

    ListNode<T>* _pPre;
    ListNode<T>* _pNext;
    T _val;
};


//List的迭代器類(lèi)
template<class T, class Ref, class Ptr>
class ListIterator
{
    typedef ListNode<T>* PNode;
    typedef ListIterator<T, Ref, Ptr> Self;
public:
    ListIterator(PNode pNode = nullptr)
        :_pNode(pNode)
    {}

    ListIterator(const Self& l)
    {
        _pNode = l._pNode;
    }

    T& operator*()
    {
        return _pNode->_val;
    }

    T* operator->()
    {
        return &_pNode->_val;
    }

    Self& operator++()
    {
        _pNode = _pNode->_pNext;
        return *this;
    }

    Self& operator++(int)
    {
        Self tmp(*this);
        _pNode = _pNode->_pNext;

        return tmp;
    }

    Self& operator--()
    {
        _pNode = _pNode->_pPre;
        return *this;
    }

    Self& operator--(int)
    {
        Self tmp(*this);
        _pNode = _pNode->_pPre;

        return tmp;
    }

    bool operator!=(const Self& l)
    {
        return _pNode != l._pNode;
    }

    bool operator==(const Self& l)
    {
        return _pNode == l._pNode;
    }

//private:
    PNode _pNode;
};

3、list的構(gòu)造

構(gòu)造函數(shù)(constructor) 接口說(shuō)明
list (size_type n, const value_type& val = value_type()) 構(gòu)造的list中包含n個(gè)值為val的元素
list() 構(gòu)造空的list
list(const list& x) 拷貝構(gòu)造函數(shù)
list(InputIterator first, InputIterator last) 用[first, last)區(qū)間中的元素構(gòu)造list

構(gòu)造我們已經(jīng)寫(xiě)了太多了,對(duì)于這些接口直接秒殺。
空參構(gòu)造list:

list()
{
    _pHead = new Node;
    _pHead->_pNext = _pHead;
    _pHead->_pPre = _pHead;
}

拷貝構(gòu)造list:

list(const list<T>& l)
{
    _pHead = new Node;
    _pHead->_pNext = _pHead;
    _pHead->_pPre = _pHead;

    for (auto e : l)
    {
        push_back(e);
    }
}

n個(gè)值為val的構(gòu)造:

list(int n, const T& value = T())
{
    _pHead = new Node;
    _pHead->_pNext = _pHead;
    _pHead->_pPre = _pHead;
    
    for (int i = 0; i < n; i++)
    {
        push_back(value);
    }
}

迭代器區(qū)間構(gòu)造:

template <class Iterator>
list(Iterator first, Iterator last)
{
    CreateHead();
    while (first != last)
    {
        push_back(*first);
        ++first;
    }
}

4、list常用接口的實(shí)現(xiàn)

我們實(shí)現(xiàn)的是雙向帶頭循環(huán)的list,因此結(jié)構(gòu)為:
[C++] STL_list常用接口的模擬實(shí)現(xiàn),C++,c++,list,開(kāi)發(fā)語(yǔ)言

我們先將得到頭尾的接口實(shí)現(xiàn)一下:

iterator begin()
{
    return _pHead->_pNext;
}
iterator end()
{
    return _pHead;
}
const_iterator begin() const
{
    return _pHead->_pNext;
}
const_iterator end() const
{
    return _pHead;
}

4.1 list capacity

函數(shù)聲明 接口說(shuō)明
empty 檢測(cè)list是否為空,是返回true,否則返回false
size 返回list中有效節(jié)點(diǎn)的個(gè)數(shù)

這里兩個(gè)接口都比較簡(jiǎn)單,我們直接秒殺。

size_t size() const
{
    int count = 0;

    const_iterator it = begin();
    while (it != end())
    {
        ++count;
        ++it;
    }
    return count;
}
bool empty() const
{
    return _pHead == _pHead->_pNext;
}

4.2 插入刪除、交換、清理

函數(shù)聲明 接口說(shuō)明
push_front 在list首元素前插入值為val的元素
pop_front 刪除list中第一個(gè)元素
push_back 在list尾部插入值為val的元素
pop_back 刪除list中最后一個(gè)元素
insert 在list position 位置中插入值為val的元素
erase 刪除list position位置的元素
swap 交換兩個(gè)list中的元素
clear 清空l(shuí)ist中的有效元素

4.2.1 insert任意位置插入

[C++] STL_list常用接口的模擬實(shí)現(xiàn),C++,c++,list,開(kāi)發(fā)語(yǔ)言

思路:
1、我們先new一個(gè)節(jié)點(diǎn)newnode,并賦值為x(這里就會(huì)去調(diào)用list節(jié)點(diǎn)類(lèi)里面的構(gòu)造函數(shù));
2、記下pos位置前一個(gè)節(jié)點(diǎn)prev,將newnode, prev, pos三個(gè)節(jié)點(diǎn)連接起來(lái);
3、返回newnode的迭代器。
[C++] STL_list常用接口的模擬實(shí)現(xiàn),C++,c++,list,開(kāi)發(fā)語(yǔ)言

代碼實(shí)現(xiàn):

// 在pos位置前插入值為val的節(jié)點(diǎn)
iterator insert(iterator pos, const T& val)
{
    PNode cur = pos._pNode;
    PNode prev = cur->_pPre;

    PNode newnode = new Node(val);
    prev->_pNext = newnode;
    newnode->_pPre = prev;
    newnode->_pNext = cur;
    cur->_pPre = newnode;

    return newnode;
}

4.2.2 push_front頭插

[C++] STL_list常用接口的模擬實(shí)現(xiàn),C++,c++,list,開(kāi)發(fā)語(yǔ)言

對(duì)于頭插來(lái)說(shuō),我們直接復(fù)用插入的代碼就可以。
頭插就是在鏈表的頭部插入一個(gè)元素,因此就是 insert(begin(), x);

void push_front(const T& val) { insert(begin(), val); }

4.2.3 push_back尾插

[C++] STL_list常用接口的模擬實(shí)現(xiàn),C++,c++,list,開(kāi)發(fā)語(yǔ)言

對(duì)于尾插也是一樣的,直接復(fù)用insert代碼。
因?yàn)槲覀僱ist是雙向帶頭循環(huán)鏈表,尾插 insert(end(), x) 直接在尾部前插入即可。end()返回的就是頭結(jié)點(diǎn),頭結(jié)點(diǎn)是哨兵位節(jié)點(diǎn),因此在end()前插就是尾插。

void push_back(const T& val) { insert(end(), val); }

4.2.4 erase任意位置刪除

[C++] STL_list常用接口的模擬實(shí)現(xiàn),C++,c++,list,開(kāi)發(fā)語(yǔ)言

思路:
1、分別記下pos前后位置的節(jié)點(diǎn),prev,next;
2、將prev與next連接起來(lái),釋放pos位置節(jié)點(diǎn);
3、飯后pos下一個(gè)位置的節(jié)點(diǎn)。

// 刪除pos位置的節(jié)點(diǎn),返回該節(jié)點(diǎn)的下一個(gè)位置
iterator erase(iterator pos)
{
    PNode cur = pos._pNode;
    PNode prev = cur->_pPre;
    PNode next = cur->_pNext;

    delete cur;
    prev->_pNext = next;
    next->_pPre = prev;

    return next;
}

4.2.5 pop_front頭刪

[C++] STL_list常用接口的模擬實(shí)現(xiàn),C++,c++,list,開(kāi)發(fā)語(yǔ)言

對(duì)于頭刪來(lái)說(shuō),我們直接復(fù)用erase代碼就可以了。
頭刪直接刪除掉頭部就可以了,erase(begin())。

void pop_front() { erase(begin()); }

4.2.6 pop_back尾刪

[C++] STL_list常用接口的模擬實(shí)現(xiàn),C++,c++,list,開(kāi)發(fā)語(yǔ)言

尾刪也是復(fù)用erase代碼,就是刪掉列表的最后一個(gè)節(jié)點(diǎn),erase(–end())。

void pop_back() { erase(--end()); }

這里為什么–end(),這里end()返回的是頭結(jié)點(diǎn),因?yàn)橐獎(jiǎng)h除尾結(jié)點(diǎn),所以需要–end(),才是真正的尾結(jié)點(diǎn)。

4.2.7 swap()

[C++] STL_list常用接口的模擬實(shí)現(xiàn),C++,c++,list,開(kāi)發(fā)語(yǔ)言

list的swap交換,只要交換兩個(gè)鏈表的頭結(jié)點(diǎn)就可以,因?yàn)槭擎準(zhǔn)酱鎯?chǔ)的,更換頭指針即可。庫(kù)中提供的交換直接復(fù)用就可以。

void swap(list<T>& l) { std::swap(_pHead, l._pHead); }

4.2.8 clear

對(duì)于鏈表的clear,我們需要釋放掉每一個(gè)有效節(jié)點(diǎn),因此我們遍歷一遍,并復(fù)用erase。

void clear()
{
    iterator it = begin();
    while (it != end())
    {
        it = erase(it);
    }
}

5、list迭代器失效問(wèn)題

前面說(shuō)過(guò),此處大家可將迭代器暫時(shí)理解成類(lèi)似于指針,迭代器失效即迭代器所指向的節(jié)點(diǎn)的無(wú)效,即該節(jié)點(diǎn)被刪除了。因?yàn)閘ist的底層結(jié)構(gòu)為帶頭結(jié)點(diǎn)的雙向循環(huán)鏈表,因此在list中進(jìn)行插入時(shí)是不會(huì)導(dǎo)致list的迭代器失效的,只有在刪除時(shí)才會(huì)失效,并且失效的只是指向被刪除節(jié)點(diǎn)的迭代器,其他迭代器不會(huì)受到影響。

int main()
{
	list<int> lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.push_back(5);

	list<int>::iterator it = lt.begin();
	while (it != lt.end())
	{
		//這里如果先刪掉了,再去更新迭代器已經(jīng)被失效影響了
		lt.erase(it);
		++it;
	}

	return 0;
}

[C++] STL_list常用接口的模擬實(shí)現(xiàn),C++,c++,list,開(kāi)發(fā)語(yǔ)言

改正:

int main()
{
	list<int> lt;
	lt.push_back(1);
	lt.push_back(2);
	lt.push_back(3);
	lt.push_back(4);
	lt.push_back(5);

	list<int>::iterator it = lt.begin();
	while (it != lt.end())
	{
		//這里如果先刪掉了,再去更新迭代器已經(jīng)被失效影響了
		lt.erase(it++);
	}

	return 0;
}

6、list與vector對(duì)比

vector與list都是STL中非常重要的序列式容器,由于兩個(gè)容器的底層結(jié)構(gòu)不同,導(dǎo)致其特性以及應(yīng)用場(chǎng)景不同,其主要不同如下:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-695896.html

vector list
底 層 結(jié) 構(gòu) 動(dòng)態(tài)順序表,一段連續(xù)空間 帶頭結(jié)點(diǎn)的雙向循環(huán)鏈表
隨 機(jī) 訪(fǎng) 問(wèn) 支持隨機(jī)訪(fǎng)問(wèn),訪(fǎng)問(wèn)某個(gè)元素效率O(1) 不支持隨機(jī)訪(fǎng)問(wèn),訪(fǎng)問(wèn)某個(gè)元素效率O(N)
插 入 和 刪 除 任意位置插入和刪除效率低,需要搬移元素,時(shí)間復(fù)雜度為O(N),插入時(shí)有可能需要增容,增容:開(kāi)辟新空間,拷貝元素,釋放舊空間,導(dǎo)致效率更低 任意位置插入和刪除效率高,不需要搬移元素,時(shí)間復(fù)雜度為O(1)
空 間 利 用 率 底層為連續(xù)空間,不容易造成內(nèi)存碎片,空間利用率高,緩存利用率高 底層節(jié)點(diǎn)動(dòng)態(tài)開(kāi)辟,小節(jié)點(diǎn)容易造成內(nèi)存碎片,空間利用率低,緩存利用率低
迭 代 器 原生態(tài)指針 對(duì)原生態(tài)指針(節(jié)點(diǎn)指針)進(jìn)行封裝
迭 代 器 失 效 在插入元素時(shí),要給所有的迭代器重新賦值,因?yàn)椴迦朐赜锌赡軙?huì)導(dǎo)致重新擴(kuò)容,致使原來(lái)迭代器失效,刪除時(shí),當(dāng)前迭代器需要重新賦值否則會(huì)失效 插入元素不會(huì)導(dǎo)致迭代器失效,刪除元素時(shí),只會(huì)導(dǎo)致當(dāng)前迭代器失效,其他迭代器不受影響
使 用 場(chǎng) 景 需要高效存儲(chǔ),支持隨機(jī)訪(fǎng)問(wèn),不關(guān)心插入刪除效率 大量插入和刪除操作,不關(guān)心隨機(jī)訪(fǎng)問(wèn)

到了這里,關(guān)于[C++] STL_list常用接口的模擬實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • [C++] STL_vector使用與常用接口的模擬實(shí)現(xiàn)

    [C++] STL_vector使用與常用接口的模擬實(shí)現(xiàn)

    vector文檔介紹 vector是表示可變大小數(shù)組的序列容器。 就像數(shù)組一樣,vector也采用的連續(xù)存儲(chǔ)空間來(lái)存儲(chǔ)元素。也就是意味著可以采用下標(biāo)對(duì)vector的元素進(jìn)行訪(fǎng)問(wèn),和數(shù)組一樣高效。但是又不像數(shù)組,它的大小是可以動(dòng)態(tài)改變的,而且它的大小會(huì)被容器自動(dòng)處理。 本質(zhì)講,

    2024年02月11日
    瀏覽(26)
  • 【STL】list的模擬實(shí)現(xiàn)

    【STL】list的模擬實(shí)現(xiàn)

    目錄 前言 結(jié)構(gòu)解析 默認(rèn)成員函數(shù) 構(gòu)造函數(shù) 拷貝構(gòu)造 賦值重載 析構(gòu)函數(shù) 迭代器 const迭代器 數(shù)據(jù)修改 insert erase 尾插尾刪頭插頭刪 容量查詢(xún) 源碼? ??list之所以擺脫了單鏈表尾插麻煩,只能單向訪(fǎng)問(wèn)等缺點(diǎn),正是因?yàn)槠湓诮Y(jié)構(gòu)上升級(jí)成了帶頭雙向循環(huán)鏈表。不僅如此,lis

    2024年02月06日
    瀏覽(26)
  • 【STL】模擬實(shí)現(xiàn)簡(jiǎn)易 list

    【STL】模擬實(shí)現(xiàn)簡(jiǎn)易 list

    目錄 1. 讀源碼 2. 框架搭建? 3. list 的迭代器 4. list 的拷貝構(gòu)造與賦值重載 拷貝構(gòu)造 賦值重載 5. list 的常見(jiàn)重要接口實(shí)現(xiàn) operator--()? insert 接口 erase 接口 push_back 接口 push_front?接口 pop_back 接口 pop_front 接口 size 接口 clear 接口 別忘了析構(gòu)函數(shù) 源碼分享 寫(xiě)在最后: 讀源碼千萬(wàn)

    2024年02月16日
    瀏覽(27)
  • 【STL】:list的模擬實(shí)現(xiàn)

    【STL】:list的模擬實(shí)現(xiàn)

    朋友們、伙計(jì)們,我們又見(jiàn)面了,本期來(lái)給大家解讀一下有關(guān)list的模擬實(shí)現(xiàn),如果看完之后對(duì)你有一定的啟發(fā),那么請(qǐng)留下你的三連,祝大家心想事成! C 語(yǔ) 言 專(zhuān) 欄: C語(yǔ)言:從入門(mén)到精通 數(shù)據(jù)結(jié)構(gòu)專(zhuān)欄: 數(shù)據(jù)結(jié)構(gòu) 個(gè)? 人? 主? 頁(yè)?: stackY、 C + + 專(zhuān) 欄? ?: C++ Linux 專(zhuān)?

    2024年02月05日
    瀏覽(24)
  • stl中的list模擬實(shí)現(xiàn)

    stl中的list模擬實(shí)現(xiàn)

    首先我們要清楚list是一個(gè)帶頭雙向循環(huán)的鏈表。 在下面代碼中我們用到了 模板 ,并且用的是 struct 沒(méi)有用 class ,這是因?yàn)槲覀兪褂胹truct時(shí)相當(dāng)于 這一個(gè)類(lèi)是公開(kāi)的 ,當(dāng)然我們也可以使用class但是得使用友元函數(shù)比較麻煩。 我們可以查看stl的源碼進(jìn)行查看,如下: 我們可以

    2024年02月02日
    瀏覽(34)
  • C++ STL->list模擬實(shí)現(xiàn)

    C++ STL->list模擬實(shí)現(xiàn)

    list list文檔 list是可以在常數(shù)范圍內(nèi)在任意位置進(jìn)行插入和刪除的序列式容器,并且該容器可以前后雙向迭代。 list的底層是雙向鏈表結(jié)構(gòu),雙向鏈表中每個(gè)元素存儲(chǔ)在互不相關(guān)的獨(dú)立節(jié)點(diǎn)中,在節(jié)點(diǎn)中通過(guò)指針指向 其前一個(gè)元素和后一個(gè)元素。 list與forward_list非常相似:最主

    2024年02月20日
    瀏覽(25)
  • C++ ——STL容器【list】模擬實(shí)現(xiàn)

    C++ ——STL容器【list】模擬實(shí)現(xiàn)

    代碼倉(cāng)庫(kù): list模擬實(shí)現(xiàn) list源碼 數(shù)據(jù)結(jié)構(gòu)——雙向鏈表 源碼的list是雙向帶頭循環(huán)鏈表,所以我們定義兩個(gè)節(jié)點(diǎn),一個(gè)指向下一個(gè),一個(gè)指向前一個(gè) list類(lèi)包含一個(gè) _head 頭節(jié)點(diǎn),然后為了方便查出當(dāng)前有多少個(gè)節(jié)點(diǎn),還能多定義一個(gè) _size 源碼的迭代器設(shè)置了三個(gè)模板參數(shù):

    2024年02月15日
    瀏覽(27)
  • C++ [STL之list模擬實(shí)現(xiàn)]

    C++ [STL之list模擬實(shí)現(xiàn)]

    本文已收錄至《C++語(yǔ)言》專(zhuān)欄! 作者:ARMCSKGT list的底層與vector和string不同,實(shí)現(xiàn)也有所差別,特別是在迭代器的設(shè)計(jì)上,本節(jié)將為大家介紹list簡(jiǎn)單實(shí)現(xiàn),并揭開(kāi)list迭代器的底層! 本文介紹list部分簡(jiǎn)單接口,以list迭代器的介紹為主! list底層是一個(gè)帶頭雙向循環(huán)鏈表,在節(jié)

    2024年02月09日
    瀏覽(49)
  • [ C++ ] STL---list的模擬實(shí)現(xiàn)

    [ C++ ] STL---list的模擬實(shí)現(xiàn)

    目錄 結(jié)點(diǎn)類(lèi)的模擬實(shí)現(xiàn) 迭代器類(lèi)的模擬實(shí)現(xiàn) 構(gòu)造函數(shù) 前置++與后置++ 前置- -與后置 - - == 與 !=運(yùn)算符重載 * 運(yùn)算符重載 - 運(yùn)算符重載 普通迭代器總體實(shí)現(xiàn)代碼 list類(lèi)的實(shí)現(xiàn) list類(lèi)的成員變量 構(gòu)造函數(shù) 迭代器 insert() erase() push_front/push_back/pop_front/pop_back front/back clear() empty()

    2024年04月09日
    瀏覽(30)
  • C++STL的list模擬實(shí)現(xiàn)

    C++STL的list模擬實(shí)現(xiàn)

    要實(shí)現(xiàn)STL的list, 首先我們還得看一下list的源碼。 我們看到這么一個(gè)東西,我們知道C++兼容C,可以用struct來(lái)創(chuàng)建一個(gè)類(lèi)。但是我們習(xí)慣用class。 那什么時(shí)候會(huì)用struct呢? 這個(gè)類(lèi)所有成員都想開(kāi)放出去,比如結(jié)點(diǎn)的指針,它一般開(kāi)放出來(lái)。所以我們用struct.。 繼續(xù)看源碼比較重

    2024年02月04日
    瀏覽(26)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包