今天看了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(), size()
{
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 ? * capacity : ; 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 = ; i <= ; i++)
{
a.push_back(i);
} cout << "a:" << endl;
for (auto v : a)
{
cout << v << " ";
if (v % == )
cout << endl;
}
cout << endl; cout << "b :" << endl;
VecInt b(a); cout << "c :" << endl;
VecInt c;
c = a; a[] = ;
b[] = ;
c[] = ; //打印数据
cout << "a:" << endl;
for (auto v : a)
{
cout << v << " ";
if (v % == )
cout << endl;
}
cout << endl; cout << "b:" << endl;
for (auto v : b)
{
cout << v << " ";
if (v % == )
cout << endl;
}
cout << endl; cout << "c:" << endl;
for (auto v : c)
{
cout << v << " ";
if (v % == )
cout << endl;
}
cout << endl; cout << "" << endl;
{
VecInt temp;
for (int i = ; i < ; i++)
{
temp.push_back(i);
}
} cout << "" << endl; return ;
}

(原创)动态内存管理练习 C++ std::vector<int> 模拟实现的更多相关文章

  1. C++程序设计入门 引用和动态内存管理学习

    引用: 引用就是另一个变量的别名,通过引用所做的读写操作实际上是作用于原变量上. 由于引用是绑定在一个对象上的,所以定义引用的时候必须初始化. 函数参数:引用传递 1.引用可做函数参数,但调用时只需 ...

  2. 动态内存管理---new&amp;delete

    动态内存管理 动态对象(堆对象)是程序在执行过程中在动态内存中用new运算符创建的对象. 因为是用户自己用new运算符创建的.因此也要求用户自己用delete运算符释放,即用户必须自己管理动态内存. ...

  3. C++动态内存管理与源码剖析

    引言 在本篇文章中,我们主要剖析c++中的动态内存管理,包括malloc.new expression.operator new.array new和allocator内存分配方法以及对应的内存释放方 ...

  4. C++动态内存管理之shared_ptr、unique_ptr

    C++中的动态内存管理是通过new和delete两个操作符来完成的.new操作符,为对象分配内存并调用对象所属类的构造函数,返回一个指向该对象的指针.delete调用时,销毁对象,并释放对象所在的内存 ...

  5. uCGUI动态内存管理

    动态内存的堆区 /* 堆区共用体定义 */ typedef union { /* 可以以4字节来访问堆区,也可以以1个字节来访问 */ ]; /* required for proper aligne ...

  6. Keil C动态内存管理机制分析及改进(转)

    源:Keil C动态内存管理机制分析及改进 Keil C是常用的嵌入式系统编程工具,它通过init_mempool.mallloe.free等函数,提供了动态存储管理等功能.本文通过对init_mem ...

  7. FreeRTOS 动态内存管理

    以下转载自安富莱电子: http://forum.armfly.com/forum.php 本章节为大家讲解 FreeRTOS 动态内存管理,动态内存管理是 FreeRTOS 非常重要的一项功能,前面 ...

  8. 动态内存管理详解:malloc/free/new/delete/brk/mmap

    c++ 内存获取和释放 new/delete,new[]/delete[] c 内存获取和释放 malloc/free, calloc/realloc 上述8个函数/操作符是c/c++语言里常用来做动 ...

  9. oracle结构-内存结构与动态内存管理

    内存结构与动态内存管理 内存是影响数据库性能的重要因素. oracle8i使用静态内存管理,即,SGA内是预先在参数中配置好的,数据库启动时就按这些配置来进行内在分配,oracle10g引入了动态内存 ...

随机推荐

  1. Git学习指北

    learnGitBranching:一个可视化学习 git 的网站 learngitbranching.js.org,虽然项目有些悠久,如果学习 git 的话可以来玩下

  2. Centos7 安装gitLab

    我这里使用的是centos 7 64bit,我试过centos 6也是可以的! 1. 安装依赖软件 yum -y install policycoreutils openssh-server open ...

  3. 网络知识之http请求

    使用http超文本传输协议来访问web服务器 它定义了客户端和服务器之间交互的信息内容和步骤. 客户端解析url后发送请求消息---->服务器(解析请求消息,完成工作,包装结果为响应消息)--- ...

  4. Go语言中的闭包

    一.函数的变量作用域和可见性 1.全局变量在main函数执行之前初始化,全局可见 2.局部变量在函数内部或者if.for等语句块有效,使用之后外部不可见 3.全局变量和局部变量同名的情况下,局部变量生 ...

  5. promise和setTimeout执行顺序的问题

    提出问题,问题代码为 setTimeout(function(){console.log(1)},0); new Promise(function(resolve){ console.log(2) f ...

  6. 01Design and Analysis Algorithm Using Python-程振波

    1.(p14)比较两个数的大小 a = int(input('num:')) b = int(input('num:')) def getMax(a,b): if a>b : print('Th ...

  7. BZOJ2127Happiness

    题目描述 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文 ...

  8. [NOI2017]泳池

    题目描述 有一个长为\(n\),高为1001的网格,每个格子有\(p\)的概率为1,\((1-p)\)的概率0,定义一个网格的价值为极大的全一矩形,且这个矩形的底要贴着网格的底,求这个网格的价值为\( ...

  9. <知识整理>2019清北学堂提高储备D1

    一.枚举: 枚举是最简单最基础的算法,核心思想是将可能的结果都列举出来并判断是否是解. 优点:思维简单,帮助理解问题.找规律.没头绪时 缺点:时空复杂度较高,会有很多冗余的非解(简单的枚举几乎没有利用 ...

  10. bootstrap: 内联表单;

    <form class="form-inline"> <div class="form-group"> <label for=&q ...