头文件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. uva 10831 - Gerg&#39;s Cake(勒让德符号)

    题目链接:uva 10831 - Gerg's Cake 题目大意:给定a和p.p为素数,问说是否存在x,使得x2≡a%p 解题思路:勒让德记号,推断ap−12≡1%p #include <cs ...

  2. 最快的方法来清除Chrome浏览器DNS高速缓存

    最快的方法是直接数据url.那么不需要清除dns高速缓存. chrome://net-internals/#dns 一般步骤,要经过下列几项. Chrome - > 扳手 - > 选项 - ...

  3. MysqL的root用户不允许远程连接

    原文:MysqL的root用户不允许远程连接 今天程序报了异常:java.sql.SQLException: Access denied for user 'root'@'RJB-Z' (using ...

  4. COC+RTS+MOR游戏开发 一(游戏特色分析,和实践)

    本场比赛的临时名称 游戏特色(-):COC风格 ,塔防养成类游戏.          一款史诗般的战斗策略游戏.玩家须要建立村庄,成千上万的网友训练玩家的军队和战斗. 游戏中玩家须要不断的提高军队的作 ...

  5. 数据同步DataX

    数据同步那些事儿(优化过程分享)   简介 很久之前就想写这篇文章了,主要是介绍一下我做数据同步的过程中遇到的一些有意思的内容,和提升效率的过程. 当前在数据处理的过程中,数据同步如同血液一般充满全过 ...

  6. HDU 1505 Largest Rectangle in a Histogram &amp;&amp; HDU 1506 City Game(动态规划)

    1506意甲冠军:给你一个连续的直方图(拼贴底部长度1).求连续基质区. 对每一个直方图,分别向左向右进行扩展. #include<cstdio> #include<stdlib.h ...

  7. MySQL 更新中国列:1366 Incorrect string value 问题解决了

    周围环境:Win7 64位置,mysql-5.6.25-winx64,MySQL workbench 问题:MySQL在更新时出现异常: warning(s): 1366 Incorrect stri ...

  8. Python3.2官方文件翻译-工具列表和十进制浮点计算

    8.7 列表工具 许多数据结构需要通过内置列表类型来满足.但,有时候在不同的性能取舍需要选择一个实现. Array模块能提供一个像列表的array对象,它只能存储同类数据而且更加简洁. 接下来样例展示 ...

  9. 无法打开物理文件mdf,操作系统错误 5:&quot;5(拒绝訪问。)&quot;

    无法打开物理文件mdf,操作系统错误 5:"5(拒绝訪问.)" 环境: SQL Server 2008 R2 问题: 附加数据库时报错"无法打开物理文件mdf.操作系统错 ...

  10. JavaScript总结一下--创建对象

          在JavaScript象主要就是用下面三种语句: var box=new Object(); 或var box=Object(); var box={};//字面量 function Bo ...