• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

(原创)动态内存管理练习C++std::vectorint模拟实现

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

今天看了primer C++的 “动态内存管理类”章节,里面的例子是模拟实现std::vector<std::string>的功能。

照抄之后发现编译不通过,有个库函数调用错误,就参考着自己写了一份简单的int版。

 

实现思路:

1.初始化时,容器容量为1。

2.往容器添加数据时,如果容器没有放满,就直接放进去。

3.往容器添加数据时,如果容器已经满了:

  3.1 申请新的更大的存储空间(2倍)

  3.2 把原来的数据复制到新的存储空间

  3.3 删除旧的存储空间

  3.4放入数据

 

代码如下:

// 13.5动态内存管理类VecInt.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "iostream"
using namespace std;

class VecInt
{

    //容器变量
private:
    int* arr;
    int capacity;
    int size;

public:

    //构造函数
    VecInt() 
        :arr(nullptr), capacity(0), size(0)
    {
        reallocate();
    }

    ~VecInt(){ delete arr; }

    //拷贝构造函数
    VecInt(const VecInt &s);

    //拷贝赋值函数
    VecInt& VecInt::operator=(const VecInt &rhs);

    //重新分配内存
    void reallocate();

    //放入数据
    void push_back(const int s);

    //STL标准兼容
    int *begin() const { return arr; }
    int *end() const { return &arr[size]; }
    int& operator[](int i){ return arr[i]; }
    

};

void VecInt::push_back(const int s)
{
    //检查空间是否足够
    if (size == capacity)
        reallocate();

    arr[size++] = s;
}

//重新分配内存
void VecInt::reallocate()
{
    int newCapacity = capacity ? 2 * capacity : 1;

    int * newArr = new int[newCapacity];

    //arr为nullptr也能正常运行
    memcpy(newArr, arr, capacity*sizeof(int));
    delete arr;

    arr = newArr;
    capacity = newCapacity;

}

VecInt::VecInt(const VecInt &s)
{
    cout << "VecInt 拷贝构造函数" << endl;
    capacity = s.capacity;
    arr = new int[capacity];
    size = s.size;

    //arr为nullptr也能正常运行
    memcpy(arr, s.arr, s.capacity*sizeof(int));

}


VecInt& VecInt::operator=(const VecInt &s)
{
    cout << "VecInt 拷贝赋值函数" << endl;
    capacity = s.capacity;
    arr = new int[capacity];
    size = s.size;

    //arr为nullptr也能正常运行
    memcpy(arr, s.arr, s.capacity*sizeof(int));
    return *this;
}



int _tmain(int argc, _TCHAR* argv[])
{
    VecInt a;

    //输入数据
    for (int i = 1; i <= 10; i++)
    {
        a.push_back(i);
    }
    

    cout << "a:" << endl;
    for (auto v : a)
    {
        cout << v << " ";
        if (v % 10 == 0)
            cout << endl;
    }
    cout << endl;

    cout << "b :" << endl;
    VecInt b(a);

    cout << "c :" << endl;
    VecInt c;
    c = a;


    a[1] = 666;
    b[2] = 777;
    c[3] = 888;

    //打印数据
    cout << "a:" << endl;
    for (auto v : a)
    {
        cout << v << " ";
        if (v % 10 == 0)
            cout << endl;
    }
    cout << endl;

    cout << "b:" << endl;
    for (auto v : b)
    {
        cout << v << " ";
        if (v % 10 == 0)
            cout << endl;
    }
    cout << endl;

    cout << "c:" << endl;
    for (auto v : c)
    {
        cout << v << " ";
        if (v % 10 == 0)
            cout << endl;
    }
    cout << endl;

    cout << "" << endl;
    {
        VecInt temp;
        for (int i = 0; i < 1000000; i++)
        {
            temp.push_back(i);
        }
    }
    
    cout << "" << endl;

    
    
    return 0;
}

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#中ACCESS数据库常用操作语句...容易出错的地方(DateTime类型)发布时间:2022-07-13
下一篇:
C#学习历程——大作业发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap