头文件PStash.h

/**
* 书本:【ThinkingInC++】
* 功能:pointer Stash的头文件
* 时间:2014年10月5日14:33:15
* 作者:cutter_point
*/
#ifndef PSTASH_H_INCLUDED
#define PSTASH_H_INCLUDED class 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之后,可是没有吧内存的位置改变,下一个加入的内存開始还是next return 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;
}

【ThinkingInC++】66、pointer Stash的使用的更多相关文章

  1. vlist java实现-转

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

  2. python ctypes 探究 ---- python 与 c 的交互

    近几天使用 python 与 c/c++ 程序交互,网上有推荐swig但效果都不理想,所以琢磨琢磨了 python 的 ctypes 模块.同时,虽然网上有这方面的内容,但是感觉还是没说清楚.这里记录 ...

  3. 解决托管在Windows上的Stash的Pull request无法合并的问题

    最近尝试合并一个托管在Windows的Stash系统中的pull request时,发现合并按钮被禁用,显示有冲突不能合并,但是在diff页面中没有现实冲突,而且代码实际上并没有任何冲突. 后来在这篇 ...

  4. 苹果手机不支持click文字 需要添加 cursor:pointer 才能 识别可以点击

    给一个div 绑定一个 click事件,  苹果手机会识别不了,必须添加一个 cursor:pointer 才能 识别可以点击.安卓正常识别.

  5. [LeetCode] Copy List with Random Pointer 拷贝带有随机指针的链表

    A linked list is given such that each node contains an additional random pointer which could point t ...

  6. Git Stash紧急处理问题,需要切分支

    在开发过程中,大家都遇到过bug,并且有些bug是需要紧急修复的. 当开发人员遇到这样的问题时,首先想到的是我新切一个分支,把它修复了,再合并到master上. 当时问题来了,你当前正在开发的分支上面 ...

  7. Pointer's NULL And 0

    问题起源 在使用Qt框架的时候, 经常发现一些构造函数 *parent = 0 这样的代码. 时间长了, 就觉的疑惑了. 一个指针不是等于NULL吗? 这样写, 行得通吗? 自己测试一下就可以了. 测 ...

  8. git stash 用法

    git stash用于将当前工作区的修改暂存起来,就像堆栈一样,可以随时将某一次缓存的修改再重新应用到当前工作区. 一旦用好了这个命令,会极大提高工作效率.   直接举例说明: 1.准备工作,首先初始 ...

  9. C++中Reference与Pointer的不同

    Reference与Pointer中直接存储的都是变量的地址, 它们唯一的不同是前者的存储的地址值是只读的, 而后者可以修改. 也就是说Reference不支持以下操作: *a = b 其他语言, 如 ...

随机推荐

  1. .NET应用架构设计—工作单位模式(摆脱程序代码的重要思想,反击DDD)

    阅读文件夹: 1.背景介绍 2.过程式代码的真正困境 3.工作单元模式的简单演示样例 4.总结 1.背景介绍 一直都在谈论面向对象开发.可是开发企业应用系统时.使用面向对象开发最大的问题就是在于,多个 ...

  2. ssl通关的概念(一个)

    在公司最近的项目涉及多种加密.安全.我一直在这方面缺乏经验.很协议仅仅知道是什么概念.用于传输的加密SSL,也煞费苦心.非常easy一件事,折腾了很长一段时间.IT该行啊,真的是.难者不会,与会者困难 ...

  3. linux处置服务Iptables

    一:Iptables防火墙服务 iptables分为两个部分:一个部分在内核中实现,一个为用户接口命令iptables,用户通过该命令来改动防火墙的功能.所以,iptables要使用对应的功能.必需要 ...

  4. RDIFramework.NET ━ .NET高速信息系统开发框架钜献 V2.9 版本震撼发布

    RDIFramework.NET ━ .NET高速信息化系统开发框架钜献 V2.9 版本号震撼公布  全新体验.全新感觉.2015钜献! 继上个版本号"RDIFramework.NET V2 ...

  5. 跑openstack命令错误【You must provide a username via either -...】

    openstack设置环境,openstack该服务已经启动.当运行openstack当一个命令,如nova service list例如,下面的错误信息 You must provide a use ...

  6. cocos2d-x3.0 lua学习(一个)

    最近开始学习Lua这里记录下一个写简单Lua代码,但我在写Lua代码.自己主动的代码提示的一些问题,谁希望提供下很好的解决方案,编辑我用SubLime Text2 test.lua.这里创建一个场景, ...

  7. SWI-Prolog

    上个月突然看到Prolog这门语言,它特殊的语法吸引了我,但是经过我一段时间的学习,发现它也不像网络上传说的那样神奇,不过我依然对它很感兴趣,有前辈说Prolog本身并不强大,但是用来作为一门辅助语言 ...

  8. 王立平-NGUI

    NGUI: UI插入 UI : 人机交互界面 UI大部分是2D 眼下就我们总结这些.也许会增加 版权声明:本文博主原创文章,博客,未经同意不得转载.

  9. jquery字体更改后的鼠标-影像学改变//凝视内容

    <!doctype html> <html> <head> <meta charset="gb2312"> <title> ...

  10. SSIS从理论到实战,再到应用(1)----创建自己的第一个包

    原文:SSIS从理论到实战,再到应用(1)----创建自己的第一个包 其实,如果你使用sql2008的导出导入工具的时候,你就已经在使用包了. 目标:使用sql2008 导入导出工具,导入excel数 ...