【ThinkingInC++】66、pointer Stash的使用
头文件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的使用的更多相关文章
- vlist java实现-转
转自:http://www.blogjava.net/changedi/archive/2012/04/15/374226.html vlist是一种列表的实现.结构如下图: (图来源wikipedi ...
- python ctypes 探究 ---- python 与 c 的交互
近几天使用 python 与 c/c++ 程序交互,网上有推荐swig但效果都不理想,所以琢磨琢磨了 python 的 ctypes 模块.同时,虽然网上有这方面的内容,但是感觉还是没说清楚.这里记录 ...
- 解决托管在Windows上的Stash的Pull request无法合并的问题
最近尝试合并一个托管在Windows的Stash系统中的pull request时,发现合并按钮被禁用,显示有冲突不能合并,但是在diff页面中没有现实冲突,而且代码实际上并没有任何冲突. 后来在这篇 ...
- 苹果手机不支持click文字 需要添加 cursor:pointer 才能 识别可以点击
给一个div 绑定一个 click事件, 苹果手机会识别不了,必须添加一个 cursor:pointer 才能 识别可以点击.安卓正常识别.
- [LeetCode] Copy List with Random Pointer 拷贝带有随机指针的链表
A linked list is given such that each node contains an additional random pointer which could point t ...
- Git Stash紧急处理问题,需要切分支
在开发过程中,大家都遇到过bug,并且有些bug是需要紧急修复的. 当开发人员遇到这样的问题时,首先想到的是我新切一个分支,把它修复了,再合并到master上. 当时问题来了,你当前正在开发的分支上面 ...
- Pointer's NULL And 0
问题起源 在使用Qt框架的时候, 经常发现一些构造函数 *parent = 0 这样的代码. 时间长了, 就觉的疑惑了. 一个指针不是等于NULL吗? 这样写, 行得通吗? 自己测试一下就可以了. 测 ...
- git stash 用法
git stash用于将当前工作区的修改暂存起来,就像堆栈一样,可以随时将某一次缓存的修改再重新应用到当前工作区. 一旦用好了这个命令,会极大提高工作效率. 直接举例说明: 1.准备工作,首先初始 ...
- C++中Reference与Pointer的不同
Reference与Pointer中直接存储的都是变量的地址, 它们唯一的不同是前者的存储的地址值是只读的, 而后者可以修改. 也就是说Reference不支持以下操作: *a = b 其他语言, 如 ...
随机推荐
- JS达到Web指定保存的和打印功能的内容
背景 首先,说说文章的背景.近期手中的一个项目,因为需求中要求提供Web界面的打印功能.当然假设没有打印机,还能够提供保存到本地.项目组长把这个"小任务"分给了我.本着努力为组长分 ...
- 简单介绍如何使用PowerMock和Mockito来mock 1. 构造函数 2. 静态函数 3. 枚举实现的单例 4. 选择参数值做为函数的返回值(转)
本文将简单介绍如何使用PowerMock和Mockito来mock1. 构造函数2. 静态函数3. 枚举实现的单例4. 选择参数值做为函数的返回值5. 在调用mock出来的方法中,改变方法参数的值 一 ...
- Android 中字体的处理
//得到TextView控件对象 TextView textView = (TextView)findViewById(R.id.custom); //将字体文件保存在assets/fonts/文件夹 ...
- [Linux]于Mac在配置Linuxserver安装Nginx+PHP
Linux 安装Debian系统 我安装的是Debian7.5的系统,Debian的软件包管理和升级十分方便,并且系统也非常稳定. 安装盘能够去华中科技大学镜像.网易开源镜像站或者中国科技大学镜像下载 ...
- Linux下一个CD翻录 创CUE 压缩flac攻略
于Windows我们通常使用较低EAC翻录压缩发生器CUE找工作的步骤,但在Linux在稍微有点麻烦.每一步,我们需要自己做.经过我的反复尝试寻找和总结了相当不错的方法,使用软件和步骤如下面的. 使用 ...
- Robot Framework 使用1-环境配置及简单网站兼容性测试(转)
0.Robot Framework 简介 Robot Framework 是一个通用的自动化测试框架,主要用于“验收测试”和“验收测试驱动开发(ATDD)” (会其它文章中会详细介绍ATDD).它使用 ...
- Dev GridView RowCellClick活动MouseDown事件
GridView可编辑.在无声的思想左键点击"进入编辑". 将GridView的OptionsColumn.AllowEdit至false离开时触发RowCellClick. 但有 ...
- 看多csdn它还烂论坛?
什么? 版权声明:本文博主原创文章,博客,未经同意不得转载.
- InstallShield安装包中集成第三方安装包的方案选择
原文:InstallShield安装包中集成第三方安装包的方案选择[转] 我们在制作安装包时,有些情况下会涉及第三方安装的集成,这里将讨论如何调用安装第三方包,以及需要注意的事项. 第三方安装包的 ...
- (大数据工程师学习路径)第四步 SQL基础课程----创建数据库并插入数据
一.练习内容 1.新建数据库 首先,我们创建一个数据库,给它一个名字,比如“mysql_shiyan”,以后的几次实验也是对mysql_shiyan这个数据库进行操作. 语句格式为“CREATE DA ...