(原创)动态内存管理练习 C++ std::vector<int> 模拟实现
今天看了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> 模拟实现的更多相关文章
- C++程序设计入门 引用和动态内存管理学习
引用: 引用就是另一个变量的别名,通过引用所做的读写操作实际上是作用于原变量上. 由于引用是绑定在一个对象上的,所以定义引用的时候必须初始化. 函数参数:引用传递 1.引用可做函数参数,但调用时只需 ...
- 动态内存管理---new&delete
动态内存管理 动态对象(堆对象)是程序在执行过程中在动态内存中用new运算符创建的对象. 因为是用户自己用new运算符创建的.因此也要求用户自己用delete运算符释放,即用户必须自己管理动态内存. ...
- C++动态内存管理与源码剖析
引言 在本篇文章中,我们主要剖析c++中的动态内存管理,包括malloc.new expression.operator new.array new和allocator内存分配方法以及对应的内存释放方 ...
- C++动态内存管理之shared_ptr、unique_ptr
C++中的动态内存管理是通过new和delete两个操作符来完成的.new操作符,为对象分配内存并调用对象所属类的构造函数,返回一个指向该对象的指针.delete调用时,销毁对象,并释放对象所在的内存 ...
- uCGUI动态内存管理
动态内存的堆区 /* 堆区共用体定义 */ typedef union { /* 可以以4字节来访问堆区,也可以以1个字节来访问 */ ]; /* required for proper aligne ...
- Keil C动态内存管理机制分析及改进(转)
源:Keil C动态内存管理机制分析及改进 Keil C是常用的嵌入式系统编程工具,它通过init_mempool.mallloe.free等函数,提供了动态存储管理等功能.本文通过对init_mem ...
- FreeRTOS 动态内存管理
以下转载自安富莱电子: http://forum.armfly.com/forum.php 本章节为大家讲解 FreeRTOS 动态内存管理,动态内存管理是 FreeRTOS 非常重要的一项功能,前面 ...
- 动态内存管理详解:malloc/free/new/delete/brk/mmap
c++ 内存获取和释放 new/delete,new[]/delete[] c 内存获取和释放 malloc/free, calloc/realloc 上述8个函数/操作符是c/c++语言里常用来做动 ...
- oracle结构-内存结构与动态内存管理
内存结构与动态内存管理 内存是影响数据库性能的重要因素. oracle8i使用静态内存管理,即,SGA内是预先在参数中配置好的,数据库启动时就按这些配置来进行内在分配,oracle10g引入了动态内存 ...
随机推荐
- Linux centos 推拉、共享、监控的设置的分享
新建四台虚拟机 打开第一台连接shell更改主机名.网卡 backup 1.主机名网卡配置 [root@jytcentos7.6 ~]# hostnamectl set-hostname backup ...
- PHP开发高可用高安全App后端
基于thinkphp5开发的APP,涵盖阿里大于,七牛云图片上传,RestfulApi,短信验证, 需要联系我:QQ:1844912514
- 《Python从入门基础到实践》
<Python学习——从入门到实践> 第1章 Python语言概述 1.1 从计算机到编程 1.1.1 程序语言的演变:机器语言,汇编语言,高级语言 1.1.1.1 演变原因 1.1.1. ...
- Fetch API & Async Await
Fetch API & Async Await const fetchJSON = (url = ``) => { return fetch(url, { method: "G ...
- Nginx访问配置
配置HTTP协议(使用80默认端口,非HTTPS配置SSL)访问网站 包括RestAPI的配置和RestAPI文档的配置 例如: server { # 配置为HTTP协议 listen ; serve ...
- AWS Step Function Serverless Applications
Installing VS Components To follow along with this article, you must have an AWS account and install ...
- 第六届SD省赛 Circle of Friends
Circle of Friends Time Limit: 2000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descr ...
- git的命令行输出正确地显示中文文件名
参考:https://stackoverflow.com/questions/22827239/how-to-make-git-properly-display-utf-8-encoded-pathn ...
- python 多线程 ping
python 多线程 ping 多线程操作可按如下例子实现 #!/usr/bin/env python #encoding: utf8 import subprocess from threading ...
- kubernetes调度pod运行于master节点上
应用背景: 使用kubeadm部署的kubernetes集群,其master节点默认拒绝将pod调度运行于其上的,加点官方的术语就是:master默认被赋予了一个或者多个“污点(taints)”,“污 ...