头文件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的使用相关推荐

  1. vlist java实现-转

    转自:http://www.blogjava.net/changedi/archive/2012/04/15/374226.html vlist是一种列表的实现.结构如下图: (图来源wikipedi ...

  2. CSharpGL(36)通用的非托管数组排序方法

    CSharpGL(36)通用的非托管数组排序方法 如果OpenGL要渲染半透明物体,一个方法是根据顶点到窗口的距离排序,按照从远到近的顺序依次渲染.所以本篇介绍对 UnmanagedArray< ...

  3. git stash用法总结

    git stash命令的作用就是将目前还不想提交的但是已经修改的内容进行保存,后续可以在任何分支上进行恢复. git stash命令的作用范围包括工作区和暂存区中的内容,也就是说git add但没有g ...

  4. git shanchu stash_git stash用法

    常用git stash命令: (1)git stash save "save message"  : 执行存储时,添加备注,方便查找,只有git stash 也要可以的,但查找时不 ...

  5. IDEA : Git Pull Failed 解决(IDEA中使用stash功能)

    一.问题: 本地要commit代码,commit之前需pull代码,但pull提示冲突.如下 Git Pull Failed Your local changes would be overwritt ...

  6. git stash 拉去_git操作命令符

    1.将远程分支的代码合并到本地分支 1)git fetch  获取到远程分支的代码库  执行完会看到远程分支更新的内容同步到本地 2)git merge origin/要合并的与参横分支名称. 2.如 ...

  7. 3-runtime 之 Tagged Pointer

    Tagged Pointer 是自从iPhone 5s 之后引入的特性 1 先说一下iOS的内存布局 代码区:存放编译之后的代码 数据段 :字符串常量 : NSString *hello = @&qu ...

  8. C++中Reference与指针(Pointer)的使用对比

    了解引用reference与指针pointer到底有什么不同可以帮助你决定什么时候该用reference,什么时候该用pointer. 在C++ 中,reference在很多方面与指针(pointer ...

  9. 6-6.用HLSL定义点光源

    6-6.用HLSL定义点光源 问题 直到现在,你已经用定向光照亮你的场景,它对添加阳光到3D世界很有用.常常,你也将需要一个单点光照,例如手电筒或爆炸.这种光源叫点光源. 方案 从你的XNA项目传递点 ...

最新文章

  1. python装饰器执行顺序_python unittest单元测试框架-3用例执行顺序、多级目录、装饰器、fixtures...
  2. SpringMVC 项目中 Quartz 定时任务的设置纪要
  3. python numpy 子数组_Python快速转换numpy数组中Nan和Inf的方法实例说明
  4. ajax请求php返回的数据是整个页面的html,Ajax出错并返回整个页面html的问题
  5. 有这些好习惯,可以让你悄悄变优秀
  6. 我的代码第一次运行时的样子
  7. 5.11 学习日记,首页banner做好了
  8. springboot 远程调用shell脚本,环境为windows
  9. JAVA设计模式 - 建造者模式
  10. MySQL-5.6.x二进制版本安装记录
  11. 配置管理小报091103-2: CVS中的tag规则
  12. e.target与e.e.srcElement
  13. html table tr 动态加减行操作
  14. y400安装dolby方法
  15. 2017-09-04考试情况总结
  16. 全国第17届计算机辅助设计与图形学(cad/cg)学术会议论文集,征稿资讯-CCF第24届全国计算机辅助设计与图形学学术会议 (CCF CAD/CG 2021)...
  17. nodejs+vue+elementui宾馆酒店客房信息管理系统-express
  18. python自动发送短信验证码、短信通知、营销短信、语音短信
  19. 【计算+大数据】-武汉理工大学主办-2021年第四届计算与大数据国际会议(ICCBD 2021)
  20. 图形学数学基础之1D采样分布计算方法Inverse Method

热门文章

  1. Oracle]高效的SQL语句之分析函数
  2. 摩托车午夜飙车撞进公交车下 肇事车主当场死亡
  3. Rational Rose及RequisitePro安装注意事项
  4. Android多媒体之视频播放器高级开发
  5. Mr.J-- jQuery学习笔记(十三)--选项Tab卡
  6. [loss]Triphard loss优雅的写法
  7. Oracle查询指定表里的触发器
  8. CSS中可以和不可以继承的属性
  9. 中英文对照 —— 游戏
  10. 演义群侠传(八)【bloom组件源码学习】