今天看了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. Linux centos 推拉、共享、监控的设置的分享

    新建四台虚拟机 打开第一台连接shell更改主机名.网卡 backup 1.主机名网卡配置 [root@jytcentos7.6 ~]# hostnamectl set-hostname backup ...

  2. PHP开发高可用高安全App后端

    基于thinkphp5开发的APP,涵盖阿里大于,七牛云图片上传,RestfulApi,短信验证, 需要联系我:QQ:1844912514

  3. 《Python从入门基础到实践》

    <Python学习——从入门到实践> 第1章 Python语言概述 1.1 从计算机到编程 1.1.1 程序语言的演变:机器语言,汇编语言,高级语言 1.1.1.1 演变原因 1.1.1. ...

  4. Fetch API & Async Await

    Fetch API & Async Await const fetchJSON = (url = ``) => { return fetch(url, { method: "G ...

  5. Nginx访问配置

    配置HTTP协议(使用80默认端口,非HTTPS配置SSL)访问网站 包括RestAPI的配置和RestAPI文档的配置 例如: server { # 配置为HTTP协议 listen ; serve ...

  6. AWS Step Function Serverless Applications

    Installing VS Components To follow along with this article, you must have an AWS account and install ...

  7. 第六届SD省赛 Circle of Friends

    Circle of Friends Time Limit: 2000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descr ...

  8. git的命令行输出正确地显示中文文件名

    参考:https://stackoverflow.com/questions/22827239/how-to-make-git-properly-display-utf-8-encoded-pathn ...

  9. python 多线程 ping

    python 多线程 ping 多线程操作可按如下例子实现 #!/usr/bin/env python #encoding: utf8 import subprocess from threading ...

  10. kubernetes调度pod运行于master节点上

    应用背景: 使用kubeadm部署的kubernetes集群,其master节点默认拒绝将pod调度运行于其上的,加点官方的术语就是:master默认被赋予了一个或者多个“污点(taints)”,“污 ...