美文网首页
2018-05-14

2018-05-14

作者: try312 | 来源:发表于2018-05-14 18:04 被阅读0次

双链表

#include<list>

void mainxxx1()
{
    list<int> mylist{ 1,2,3,4,5 };
    mylist.push_back(10); //尾插
    mylist.push_front(22);//头插

    mylist.pop_back(); //删除尾部
    mylist.pop_front();//删除头部
    mylist.reverse(); //反转
    mylist.sort(); //排序

    int a[10]{ 1,2,3,4,5,6,7,8,9,10 };
    mylist.assign(a,a+5);  //处理填充

    //mylist.assign(3, 5);  //重新初始化链表 3个5
    
    for (auto ib = mylist.begin(), ie = mylist.end();ib != ie;ib++)  //顺序输出
    {
        if (*ib == 3)
        {
            mylist.insert(ib,123);  //插入
        }

        if (*ib == 5)
        {
            mylist.erase(ib);  //删除
            break;
        }

        cout << *ib << endl;
    }

    for (auto rb = mylist.rbegin(), re = mylist.rend();rb != re;rb++) //逆序输出
    {
        if (*rb == 3)
        {
            *rb = 40;
        }
        //cout << *rb << endl;
    }


    for (auto i : mylist)
    {
        cout << i << endl;
    }

    cout << "第一个" << mylist.front() << endl;
    cout << "最后一个" << mylist.back() << endl;
    cout << "个数" << mylist.size() << endl;
    mylist.clear(); //清空链表

    list<int> mylist1{ 1,2,10,4,5 };
    list<int> mylist2{ 8,5,7,9,4 };
    mylist1.sort();
    mylist2.sort();
    //mylist1.merge(mylist2); //归并排序
    mylist2.swap(mylist1);  //交换
    for (auto i : mylist1)
    {
        cout << i << endl;
    }
    cout << "=========================" << endl;
    for (auto i : mylist2)
    {
        cout << i << endl;
    }

    list<int> mylist01{ 1,2,10,4,5 };
    list<int> mylist02{ 8,5,7,9,4 };
    list<int> mylist03{ 5,7,9,4 };
    list< list<int> > mylistx{mylist01,mylist02,mylist03}; //链表的每一个元素都是链表
    for (auto i : mylistx)
    {
        for (auto j : i)
        {
            cout << j << "  ";
        }
        cout << endl;
    }

    cin.get();
}

双链表管理一个类的对象

//类 函数是共享的 数据是每个对象私有的
//空指针 调用成员函数 没有访问数据 可以调用 访问数据 不可以

class myclass; //类的声明

struct info
{
    myclass*p; //指针 内存首地址
    int n; //代表多少个对象
};

list<info> myclasslist; //双链表数据结构,管理一个类的所有对象

class myclass
{
public:
    //int i = 0;
    void show()
    {
        cout << " messsgebox" << endl;
    }

    myclass()
    {
        cout << "myclass()" << endl;
    }
    ~myclass()
    {
        cout << "x`myclass()" << endl;

    }

    void* operator new(size_t size)
    {
        cout << "new:"<<size << endl;
        void*p = malloc(size);  //多个元素
        if (p != nullptr)
        {
            info infonow;
            infonow.p = (myclass*)p; //分配了 就记录一下
                                     //infonow.n = 1; //记录地址与个数
            if (size / sizeof(myclass) == 1)
            {
                infonow.n = 1;
            }
            else
            {
                infonow.n = (size - 4) / sizeof(myclass);
            }

            myclasslist.push_back(infonow); //插入链表
            return p;
        }
        else
        {
            return nullptr;
        }
         
    }

    void operator delete(void*p)
    {
        //双链表检索内存  存在删除  不存在不管
        for (auto ib = myclasslist.begin(), ie = myclasslist.end();ib != ie;ib++)
        {
            if (p == (*ib).p)
            {
                myclasslist.erase(ib); //删除
                free(p);
                break;
            }
        }

    }

    void* operator new[](size_t size)
    {
        cout <<"new[]:"<< size << endl;
        return operator new(size); //回调用new
    }
    void operator delete[](void*p)
    {
        return operator delete(p);  //回调delete
    }
private:

};

void showmem()
{
    //显示内存
    for (auto i : myclasslist)
    {
        cout << "内存地址:" << i.p << " " << "个数:" << i.n << endl; 
    }
}


//访问所有的对象
void callallobject()
{

    for (auto i : myclasslist)
    {
        if (i.n == 1)
        {
            i.p->show();
        }
        else
        {
            //对象数组的第一个地址是数组名
            for (int j = 0;j < i.n;j++)
            {
                (i.p[j + 1]).show();// 跳过对象数组名开头的4字节 (相当于跳过数组名)
            }
        }

    }
}

void mainxxx10()
{

    //cout << sizeof(myclass) << endl;

    myclass*p1 = new myclass;
    //myclass*p2 = new myclass;
    //myclass*p3 = new myclass;
    //myclass*p4 = new myclass;
    //delete p1;
    //delete p1;

    myclass*pa1 = new myclass[5];
    

    callallobject();
    
    showmem();
    delete[]pa1;

    cin.get();
}

对象数组

//对象数组在全局 没有数组名的概念


//对象数组在全局 没有数组名的概念
void* operator new(size_t size)
{
    cout << "::new:" << size << endl;
    void*p = malloc(size);
    return p;
}

void* operator new[](size_t size)
{
    cout <<"::new[]:"<< size << endl;
    return  operator new(size);
}


class go
{
public:
    int num;
    void* operator new(size_t size)
    {
        cout << size << endl;
        void*p = malloc(size);
        return p;
    }
    void* operator new[](size_t size)
    {
        cout << "new[]:" << size << endl;
        return  operator new(size);
    }


};

void main()
{
    go*p1 = new go;
    go*p = new go[10]; //44字节

    cin.get();
}

相关文章

网友评论

      本文标题:2018-05-14

      本文链接:https://www.haomeiwen.com/subject/luvjdftx.html