头文件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. 原代码,反码,解释和具体的补充 Java在&gt;&gt;和&gt;&gt;&gt;差异

    前两天分析 HashMap 的 hash 算法的时间,会见 >> 和 >>> 这两个符号.然后检查以下信息,我脑子里在某一时刻.今天遇到,我没想到居然忘  0-0.... ...

  2. Maven本地仓库配置

    一. 为什么配置? 默认情况下,maven的本地仓库在C盘下用户文件夹: .m2/repository.全部的maven构件(artifact)都被存储到该仓库中.以方便重用. 可是放在C盘一个是占用 ...

  3. 2014 ACM湖南匹配10会议省赛

    2014湖南游戏..... 1:牡丹江Regional有些球队没来的冲突 2:题目比較水 3:队友神勇发挥 最终在开局不利的情况下完毕了翻盘,拿到了第二名.....没有抓住机会顺势夺冠还是非常遗憾的. ...

  4. Android 应用程序启动过程源代码分析

    本文转自:http://blog.csdn.net/luoshengyang/article/details/6689748 前文简要介绍了Android应用程序的Activity的启动过程.在And ...

  5. quick-cocos2d-x游戏开发【3】——display.newSprite创建向导

    游戏嘛.没有图片没有图片可以称为你的游戏,所以,我们看一下使用quick如何创建精灵的方式. quick的api精灵族的创造仍然是非常具体的解释.因此,建立非常easy. display.newSpr ...

  6. 如何获得 oracle RAC 11g asm spfile S档

     方法一: [root@vmrac1 ~]# su - grid [grid@vmrac1 ~]$ sqlplus / as sysasm SQL*Plus: Release 11.2.0.3.0 ...

  7. sql查询第二大的记录(转)

    问题: 数据库中人表有三个属性,用户(编号,姓名,身高),查询出该身高排名第二的高度.建表语句 create table users ( id ,) primary key, name ), heig ...

  8. Python基本语法[二],python入门到精通[四] (转)

    写在前面 python你不去认识它,可能没什么,一旦你认识了它,你就会爱上它 回到顶部 v正文开始:Python基本语法 1.定义常量: 之所以上篇博客介绍了定义变量没有一起介绍定义常量,是因为Pyt ...

  9. hdu 4915 Parenthese sequence 多校第五场

    推断一个序列是否是有效是简单的. 可是推断序列是不是有多个解会出问题. 那么从i=0 ~l 假设读到问号,推断该问号成为(能否有效,该问号为)是否有效. 假设都有效,则必有多个解. 假设都无效,则无解 ...

  10. iptables的CLUSTER target以太网交换机和想法

    周末热风,这个想法从未在我的心脏像样的雨一阵悲哀. 每到周末,我会抽出一周整夜的事情的总结,无论是工作.人生,或者在上班或在锯的方式方法,并听取了抑制书评,因为无雨,周六晚上,我决定好好睡一觉,再折腾 ...