今天看了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. Windows apache-flume-1.6.0+Kafka+Es

    apache-flume-1.6.0 kafka_2.11-1.1.0 elasticsearch1.5.1 flume配置 a1.sources = kafkaSource a1.channels ...

  2. Windows kafka_2.11-1.1.0安装

    #broker.id= #broker.list=,, listeners=PLAINTEXT://127.0.0.1:9092 advertised.listeners=PLAINTEXT://12 ...

  3. 如何在Linux中轻松删除源安装的软件包?

    第1步:安装Stow 在这个例子中,我们使用的是CentOS,因此我们需要扩展的EPEL库.您可以使用以下命令安装它们:yum install epel-release然后,下面这段命令:yum in ...

  4. 【简】题解 AWSL090429 【市场】

    因为这有个时间的限制 并且  求的时间都是前缀和 那么 我们可以根据时间将排序 因为题中没有修改可以直接用背包预处理出答案 但是因为题目ci mi<=1e9   vi<=300 所以发现不 ...

  5. 小白在 Eclipse如何避免启动时自动building workspace和validating

    问题: Eclipse启动时会出现如下的情况(时间比较长): 原因所在: Validating 意为验证,validating... 逐个的检查每一个文件,Eclipse在启动时自动验证代码和创建wo ...

  6. python第十天

    函数 1.函数:完成特定功能的代码块,作为一个整体,对其进行特定的命名,该名字就代表函数 在现实中,很多问题要通过一些工具进行处理==>可以将工具提前生产出来,并命名==>通过名字就可以找 ...

  7. 你不得不用的MAC软件开发工具软件,个个万里挑一

    作为软件行业,尤其是程序员,Mac上都不得不安装一些必备的MAC软件开发工具软件,下面给大家分享一些必装的MAC软件开发工具软件,以备日后之需,有备无患. 其中,包含各种语言的主流 IDE.开发辅助. ...

  8. python中__init__和__new__的区别

    参考:https://my.oschina.net/liuyuantao/blog/747164 python中__metaclass的详解 参考:https://www.cnblogs.com/ia ...

  9. html css笔记zht

    第3章 Img标签 路径问题 绝对路径:从盘符(C:\)出发的路径 (C:\Users\......) linux(绝对路径以 / 开头) 相对路径:( ./ 当前文件所在的目录)( ../上一级目录 ...

  10. Mongodb复杂查询,总结

    内嵌文档复杂查询 数据结构 { "_id":"1412243", "info":{ "data":[ { "b ...