头文件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. MVC 01

    ASP.NET MVC 01 - ASP.NET概述 本篇目录: ASP.NET 概述 .NET Framework 与 ASP.NET ASP.NET MVC简介 ASP.NET的特色和优势 典型案 ...

  2. Wpf ScrollViewer with WrapPanel 使用鼠标滚轮水平滚动内容

    为WrapPanel添加水平滚动条,当禁用垂直滚动条后使用鼠标无法滚动,竟然还需要自己写代码来实现,真真是挺无语呢,不知道算不算是一个bug. <Grid Background="Tr ...

  3. xaml的margin和css的margin对比

    css margin xaml margin 例子 1 css margin:10px 5px 15px 20px;上右下左 上外边距是 10px 右外边距是 5px 下外边距是 15px 左外边距是 ...

  4. MemberwishClone学习

    /* * Created by SharpDevelop. * User: My little flower basket * Date: 2013/7/12 * Time: 9:37 * * To ...

  5. SQL Server系统数据库备份最佳实践

    原文:SQL Server系统数据库备份最佳实践 首先了解主要的系统数据库: 系统数据库 master 包含登录信息和其他数据库的核心信息 msdb 存储作业.操作员.警报.备份还原历史.数据库邮件信 ...

  6. Redis系列之(一):10分钟玩转Redis(转)

    1. Redis介绍 Redis是一个开源的使用ANSI C语言编写.基于内存的Key-Value数据库. 它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集 ...

  7. [ACM] HDU 2295 Radar (二分法+DLX 重复覆盖)

    Radar Problem Description N cities of the Java Kingdom need to be covered by radars for being in a s ...

  8. Oracle cloud control 12c 的启动与关闭

    Oracle cloud control 12c整个安装比較复杂,光是安装路径的选择,登录password,端口号等众多个配置不免让人眼花缭乱,目不暇接.本文描写叙述的是安装完成后怎样获取安装时设定的 ...

  9. Android数据加载和Json解析——蓝本

    1.下载数据来创建一个实体类 class MyData { String imagepath; String title; String desc; public MyData(String imag ...

  10. Scala刮:使用Intellij IDEA写hello world

    介绍 在前面的文章中,,我们介绍了如何使用Scala IDE那是,eclipse集成Scala开发插件Scala开发语言程序.使用一段时间后,.发现eclipse正确Scala支持不是很好.用户体验差 ...