当前位置: 首页 > wzjs >正文

石家庄网站建设推广wordpress文章调用代码

石家庄网站建设推广,wordpress文章调用代码,wordpress投票功能,360优化大师最新版介绍 上一次介绍了list队容器的迭代器模拟,这次模拟实现list的简单功能,尤其要注意构造函数、析构函数、以及赋值运算符重载的实现。 list容器需要接纳所有类型的数据,因此,结构设置与迭代器设置同理,需要引入结点&…

介绍

        上一次介绍了list队容器的迭代器模拟,这次模拟实现list的简单功能,尤其要注意构造函数、析构函数、以及赋值运算符重载的实现。

        list容器需要接纳所有类型的数据,因此,结构设置与迭代器设置同理,需要引入结点,数据。

    //结点结构

    template<class T>
    struct ListNode
    {
        ListNode<T>* _next;
        ListNode<T>* _last;
        T _data;
        ListNode(const T& x = T())
            :_next(nullptr)
            , _last(nullptr)
            , _data(x)
        { }
    };

    //list容器基本元素

    template<class T>
    class list
    {
    public:
        typedef ListNode<T> Node;  
        typedef _list_iterator<T> iterator;

    private:
        Node* _node;  //此结点为哨兵结点,前指头结点,后指尾结点,里面没有数据
    };


一,构造函数

        构造函数只需构造“ 哨兵结点 ”即可,因为这里使用链式结构存储,因此构造函数没有顺序结构那样的逻辑。代码如下:

list()
{
    _node = new Node;
    _node->_last = _node;
    _node->_next = _node;
}

        拷贝构造的实现可直接运用赋值运算符,这里要注意,由于这里的设计设计到动态空间的申请,所以实现时需进行深拷贝。

        这里,我们先实现push_back尾插功能,代码如下:

//尾插功能

void push_back(const T& x = T()) 
{
    Node* node = new Node;
    node->_data = x;
    node->_next = _node;
    node->_last = _node->_last;
    _node->_last->_next = node;
    _node->_last = node;
}

        下面是赋值运算符和拷贝构造的实现,唯一要注意的是在使用赋值运算符前,要先确定“ 哨兵结点 ”,即普通的构造函数。

//赋值运算符重载
list<T>& operator=(list<T>& L)
{
    Node* node = (L._node)->_next;
    while (node != L._node)
    {
        push_back(node->_data);
        node = node->_next;
    }
    return *this;
}

//拷贝构造函数

list(list<T>& L)
{

    //哨兵结点的构造
    _node = new Node;
    _node->_last = _node;
    _node->_next = _node;

    //赋值运算符的使用
    *this = L;
}

        下面进行样例代码测试:

void test1()
{
    list<int> v1;
    v1.push_back(1);
    v1.push_back(2);
    v1.push_back(3);
    v1.push_back(4);
    list<int> v2;
    v2 = v1;
    list<int> v3(v1);
    std::cout << "List v2: ";
    for (auto e : v2)
    {
        std::cout << e << "  ";
    }
    std::cout << std::endl;
    std::cout << "List v3: ";
    for (auto e : v3)
    {
        std::cout << e << "  ";
    }
    std::cout << std::endl;
}

 测试数据结果:


二,析构函数

        析构函数的设计只需诼渐释放所有结点即可,包括“ 哨兵结点 ”。代码如下:

~list()
{
    Node* t = _node->_next;
    while (t != _node)
    {
        Node* next = t->_next;
        delete t;
        t = next;
    }
    delete t;    //最后释放哨兵结点
    t = nullptr;
}


三,list容器接口

        这里实现begin()、end()、push_back(这个接口上面已实现,这里不做演示)、pop_back、push_front、pop_front。代码如下:

iterator begin()  //获取头结点
{
    return _node->_next;
}
iterator end()  //获取尾结点
{
    return _node;
}
void pop_back()  //尾删
{
    assert(_node->_next != _node);
    Node* node = _node->_last->_last;
    delete _node->_last;
    _node->_last = node;
    node->_next = _node;
}
void push_front(const T& x = T())  //头插
{
    Node* node = new Node;
    node->_data = x;
    node->_next = _node->_next;
    node->_last = _node;
    _node->_next->_last = node;
    _node->_next = node;
}
void pop_front()  //头删
{
    assert(_node->_next != _node);
    Node* node = _node->_next->_next;
    delete _node->_next;
    _node->_next = node;
    node->_last = _node;
}

        list容器常用功能有clear()、swap()、erase、insert。接口参数与实现如下:

void clear()
{
    Node* t = _node->_next;
    while (t != _node)
    {
        Node* next = t->_next;
        delete t;
        t = next;
    }
    t = nullptr;
}
void swap(list<T>& L)
{
    std::swap(_node, L._node);
}
iterator insert(iterator pos, const T& x = T())
{
    Node* node = new Node;
    node->_data = x;
    node->_next = pos.node;
    node->_last = (pos.node)->_last;
    node->_next->_last = node;
    node->_last->_next = node;
    return node;
}
iterator erase(iterator pos)
{
    assert(pos.node != _node);
    Node* next = (pos.node)->_next;
    Node* last = (pos.node)->_last;
    delete pos.node;
    next->_last = last;
    last->_next = next;
    return next;
}

        下面进行样例代码测试:

void test2()
{
    list<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);
    v.push_back(5);
    list<int>::iterator it = ++v.begin();
    v.insert(it, 9);
    v.erase(v.begin());
    for (auto e : v)
    {
        std::cout << e << "  ";
    }
    std::cout << std::endl;
}

测试数据结果如下:

        其它细节逻辑可自行测试,这里不再一一演示。

        总:list容器的模拟实现跟部分容器可能有些难度,这里注重要注意类型使用和转换,迭代器的模拟以及构造赋值与析构。功能实现的逻辑基本与链式逻辑一样。


文章转载自:

http://3dkXJchE.qkpzq.cn
http://VaZZ2QGo.qkpzq.cn
http://eDeRYuvo.qkpzq.cn
http://MVdT3SXm.qkpzq.cn
http://xVuSbMjl.qkpzq.cn
http://DvFtattM.qkpzq.cn
http://23EnIuIA.qkpzq.cn
http://Qe9WKQvE.qkpzq.cn
http://NxHRJB1T.qkpzq.cn
http://awLvsKAl.qkpzq.cn
http://gq5gQJ8P.qkpzq.cn
http://pUIf6jOD.qkpzq.cn
http://WTCYqVCQ.qkpzq.cn
http://BA4xZNr6.qkpzq.cn
http://eouAKjUU.qkpzq.cn
http://NOH8XYpI.qkpzq.cn
http://qxixJSuc.qkpzq.cn
http://QzhvrQ6F.qkpzq.cn
http://lrUnoyt5.qkpzq.cn
http://ksiwufRZ.qkpzq.cn
http://1f6yV2kc.qkpzq.cn
http://9bf385OF.qkpzq.cn
http://zJ6XLxks.qkpzq.cn
http://Q7icK6L6.qkpzq.cn
http://ldMzMzpM.qkpzq.cn
http://eE6Bmin3.qkpzq.cn
http://nuhuDmfa.qkpzq.cn
http://8N5BbbTC.qkpzq.cn
http://K9PejHH2.qkpzq.cn
http://T5WLPlTM.qkpzq.cn
http://www.dtcms.com/wzjs/669605.html

相关文章:

  • 怎样创建个人的网站丹阳网站建设咨询
  • 电商购物网站开发需求分析高端网站建设成都
  • 如何建立微网站详细红色旅游网站页面建设
  • 临沂建设工程招聘信息网站英语网站的栏目名称
  • 旧域名怎么做新网站广告设计属于什么行业
  • 免费的行情网站app代码房产行业微网站建设
  • 上海模板开发建站专业制作户口本
  • 临湘网站wordpress加帝国cms
  • 网站改不了分类建设网站有哪些目的是什么
  • 马云做网站最早kuake自助建站系统源码
  • 集约化网站群建设福州 网站设计公司
  • 织梦网站修改网站加友情链接的好处
  • 公司网站怎么建立优化体系cms模板网
  • 免费网页小游戏在线玩手机优化大师下载2022
  • 小游戏网站建设公司移动互联网开发技术就业前景
  • 做网站的科技公司icp网站备案核验单下载
  • 一般网站图片尺寸聊城网站那家做的好
  • 融水苗族自治县网站建设公司宣城建设网站
  • wordpress防止攻击seo刷词
  • 3d效果图教程网站广西seo网站推广
  • 创建一个网站英语免费打广告有什么软件
  • 做网站石材推销外贸定制网站建设电话
  • 个人 申请域名做网站2017网站开发发展前景
  • 站长之家素材网站建设费用选择网络专业
  • 天津市建设工程合同备网站京东alexa排名
  • 电子商务网站开发的网页传奇游戏加速器
  • 做网站拍幕布照是什么意思百度权重4
  • 运城网站建设运城天气百度人工服务24小时电话
  • 企业网站建设开发注意事项wordpress 文章 定时
  • 做食品网站用什么颜色中国核工业第五建设有限公司海南