【ThinkingInC++】66、pointer Stash的使用
头文件PStash.h
/**
* 书本:【ThinkingInC++】
* 功能:pointer Stash的头文件
* 时间:2014年10月5日14:33:15
* 作者:cutter_point
*/
#ifndef PSTASH_H_INCLUDED
#define PSTASH_H_INCLUDEDclass PStash
{int quantity; //内部定义的数据类型的存储块的个数int next; //下一个空的空间的位置void** storage; //指向一个指向void*的指针void inflate(int increase); //添加内存空间
public://构造函数PStash() : quantity(0), storage(0), next(0) {}~PStash(); //析构函数int add(void* element); //加入元素void* operator [] (int index) const; //运算符重载void* remove(int index); //移除index索引下的元素int count() const {return next;} //返回一共同拥有多少个元素
};#endif // PSTASH_H_INCLUDED
定义文件PStash.cpp
/**
* 书本:【ThinkingInC++】
* 功能:pointer Stash的定义文件
* 时间:2014年10月5日14:33:49
* 作者:cutter_point
*/#include "PStash.h"
#include "../require.h"
#include <iostream>
#include <cstring>using namespace std;/*int quantity; //内部定义的数据类型的存储块的个数int next; //下一个空的空间的位置void** storage; //指向一个指向void*的指针void inflate(int increase); //添加内存空间
public://构造函数PStash() : quantity(0), storage(0), next(0) {}~PStash(); //析构函数int add(void* element); //加入元素void* operator [] (int index) const; //运算符重载void* remove(int index); //移除index索引下的元素int count() const {return next;} //返回一共同拥有多少个元素
*/void PStash::inflate(int increase) //添加内存空间
{const int psz=sizeof(void*); //求出每块最小存储单元的长度void** st=new void*[quantity+increase]; //添加的空间//吧新的空间初始化memset(st, 0, (quantity+increase)*psz);//吧旧空间的内容复制到新空间memcpy(st, storage, quantity*psz);//吧数据刷新quantity+=increase;//回收对应的空间delete []storage;//刷新数据storage=st;
}// ~PStash(); //析构函数
PStash::~PStash()
{for(int i=0 ; i<next ; ++i)require(storage[i] == 0, "PStash not cleaned up");delete []storage;
}//int add(void* element); //加入元素
int PStash::add(void* element)
{//加入元素//推断给定的空间是否够,不够那就添加const int inflateSize=10; //用来添加长度if(next >= quantity)inflate(inflateSize);//空间够了,那么就吧元素输入到数组里面去storage[next++]=element;return (next-1); //吧加入进去的的索引返回
}// void* operator [] (int index) const; //运算符重载
void* PStash::operator [] (int index) const
{//要检验给的index是否合理require(index >= 0, "PStash::operator [] index negative");//既然数据合理,推断数据是否超出了界限if(index >= next)return 0;//返回对应的索引的数据return storage[index];
}// void* remove(int index); //移除index索引下的元素
void* PStash::remove(int index)
{void* v=operator[](index);//移除指针if(v != 0)storage[index]=0; //这里吧指针置为0之后,可是没有吧内存的位置改变,下一个加入的内存開始还是nextreturn v;
}
终于的測试文件PStashTest.cpp
/**
* 书本:【ThinkingInC++】
* 功能:pointer Stash的測试文件
* 时间:2014年10月5日14:34:23
* 作者:cutter_point
*/#include "PStash.cpp"
#include "../require.h"
#include <iostream>
#include <fstream>
#include <string>using namespace std;int main()
{PStash intStash;for(int i=0 ; i<25 ; ++i)intStash.add(new int(i));//输出元素内容for(int i=0 ; i<intStash.count() ; ++i){cout<<"intStash["<<i<<"] = "<<*(int*)intStash[i]<<endl;}//清除,回收内存for(int i=0 ; i<intStash.count() ; ++i)delete intStash.remove(i);//输出当前文件ifstream in("PStashTest.cpp");assure(in, "PStashTest.cpp");PStash stringStash;string line;while(getline(in, line)){stringStash.add(new string(line));}//输出字符串for(int u=0 ; stringStash[u] ; ++u)cout<<"stringStash["<<u<<"] ="<<*(string*)stringStash[u]<<endl;//清除内存for(int v=0 ; v<stringStash.count() ; ++v)delete (string*)stringStash.remove(v);return 0;
}
转载于:https://www.cnblogs.com/mfrbuaa/p/4297464.html
【ThinkingInC++】66、pointer Stash的使用相关推荐
- vlist java实现-转
转自:http://www.blogjava.net/changedi/archive/2012/04/15/374226.html vlist是一种列表的实现.结构如下图: (图来源wikipedi ...
- CSharpGL(36)通用的非托管数组排序方法
CSharpGL(36)通用的非托管数组排序方法 如果OpenGL要渲染半透明物体,一个方法是根据顶点到窗口的距离排序,按照从远到近的顺序依次渲染.所以本篇介绍对 UnmanagedArray< ...
- git stash用法总结
git stash命令的作用就是将目前还不想提交的但是已经修改的内容进行保存,后续可以在任何分支上进行恢复. git stash命令的作用范围包括工作区和暂存区中的内容,也就是说git add但没有g ...
- git shanchu stash_git stash用法
常用git stash命令: (1)git stash save "save message" : 执行存储时,添加备注,方便查找,只有git stash 也要可以的,但查找时不 ...
- IDEA : Git Pull Failed 解决(IDEA中使用stash功能)
一.问题: 本地要commit代码,commit之前需pull代码,但pull提示冲突.如下 Git Pull Failed Your local changes would be overwritt ...
- git stash 拉去_git操作命令符
1.将远程分支的代码合并到本地分支 1)git fetch 获取到远程分支的代码库 执行完会看到远程分支更新的内容同步到本地 2)git merge origin/要合并的与参横分支名称. 2.如 ...
- 3-runtime 之 Tagged Pointer
Tagged Pointer 是自从iPhone 5s 之后引入的特性 1 先说一下iOS的内存布局 代码区:存放编译之后的代码 数据段 :字符串常量 : NSString *hello = @&qu ...
- C++中Reference与指针(Pointer)的使用对比
了解引用reference与指针pointer到底有什么不同可以帮助你决定什么时候该用reference,什么时候该用pointer. 在C++ 中,reference在很多方面与指针(pointer ...
- 6-6.用HLSL定义点光源
6-6.用HLSL定义点光源 问题 直到现在,你已经用定向光照亮你的场景,它对添加阳光到3D世界很有用.常常,你也将需要一个单点光照,例如手电筒或爆炸.这种光源叫点光源. 方案 从你的XNA项目传递点 ...
最新文章
- python装饰器执行顺序_python unittest单元测试框架-3用例执行顺序、多级目录、装饰器、fixtures...
- SpringMVC 项目中 Quartz 定时任务的设置纪要
- python numpy 子数组_Python快速转换numpy数组中Nan和Inf的方法实例说明
- ajax请求php返回的数据是整个页面的html,Ajax出错并返回整个页面html的问题
- 有这些好习惯,可以让你悄悄变优秀
- 我的代码第一次运行时的样子
- 5.11 学习日记,首页banner做好了
- springboot 远程调用shell脚本,环境为windows
- JAVA设计模式 - 建造者模式
- MySQL-5.6.x二进制版本安装记录
- 配置管理小报091103-2: CVS中的tag规则
- e.target与e.e.srcElement
- html table tr 动态加减行操作
- y400安装dolby方法
- 2017-09-04考试情况总结
- 全国第17届计算机辅助设计与图形学(cad/cg)学术会议论文集,征稿资讯-CCF第24届全国计算机辅助设计与图形学学术会议 (CCF CAD/CG 2021)...
- nodejs+vue+elementui宾馆酒店客房信息管理系统-express
- python自动发送短信验证码、短信通知、营销短信、语音短信
- 【计算+大数据】-武汉理工大学主办-2021年第四届计算与大数据国际会议(ICCBD 2021)
- 图形学数学基础之1D采样分布计算方法Inverse Method