首页 > 代码库 > 【ThinkingInC++】49、带内联函数的Stash
【ThinkingInC++】49、带内联函数的Stash
Stash4.h
/** * 书本:【ThinkingInC++】 * 功能:带内联函数的Stash * 时间:2014年9月12日08:16:13 * 作者:cutter_point */ #ifndef STASH4_H_INCLUDED #define STASH4_H_INCLUDED #include "../require.h" #include <iostream> class Stash { int size; //每个空间存储块的字节长度 int quantity; //内部定义的数据类型的存储块的个数 int next; //下一个空的内存块的索引 unsigned char* storage; //存储空间的大小 void inflate(int increase); //空间不够用的时候增加空间大小 public: //构造函数,使用内联函数提高代码执行效率 Stash(int sz) : size(sz), quantity(0), next(0), storage(0) {} Stash(int sz, int initQuantity) : size(sz), quantity(0), next(0), storage(0){inflate(initQuantity);} ~Stash() //回收内存空间 { if(storage != 0) delete [] storage; std::cout<<"~Stash() 回收内存空间"<<std::endl; } int add(void* element); //添加元素 void* fetch(int index) const { require(0 <= index, "Stash::fetch (-)index"); if(index >= next) return 0; //超出内存空间的大小 return &(storage[index*size]); } int count() const {return next;} }; #endif // STASH4_H_INCLUDED
Stash4.cpp
/** * 书本:【ThinkingInC++】 * 功能:带内联函数的Stash * 时间:2014年9月12日08:17:14 * 作者:cutter_point */ #include "Stash4.h" #include <cassert> #include <iostream> using namespace std; const int increment=100; // void inflate(int increase); //空间不够用的时候增加空间大小 // int add(void* element); //添加元素 void Stash::inflate(int increase)//空间不够用的时候增加空间大小 { //判定increase是大于0的 assert(increase >= 0); //判断是否是等于0,如果等于0那就直接返回不用增加 if(increase == 0) return; //大于0 的话 //1、求得新空间的总个数 int newQuantity=quantity+increase; //2、新空间需求的字节数 int newBytes=newQuantity*size; //3、申请新空间需求的内存 unsigned char* b=new unsigned char[newBytes]; //4、吧旧的空间的数据转化到新空间上 //首先要只要旧的成员数据直接数 int oldBytes=quantity*size; //移动到新的上 for(int i=0 ; i<oldBytes ; ++i) b[i]=storage[i]; //5、内存回收 delete [](storage); //6、新空间的成员数据更新 storage=b; quantity=newQuantity; } // int add(void* element); //添加元素,并返回最后一个元素的位置 int Stash::add(void* element) { //判断能不能添加,空间够不够 if(next >= quantity) inflate(increment); //找到要添加的开始位置 int startBytes=next*size; //吧element转化成unsigned char*的数组 unsigned char* e=(unsigned char*)element; //添加元素到数据类型中 for(int i=0 ; i<size ; ++i) //一个元素的字节长度,就是添加一个元素的长度 storage[startBytes+i]=e[i]; //吧next更新 ++next; //返回位置 return (next-1); }
Stash4Test.cpp
/** * 书本:【ThinkingInC++】 * 功能:带内联函数的Stash * 时间:2014年9月12日08:18:19 * 作者:cutter_point */ #include "Stash4.cpp" #include "../require.h" #include <fstream> #include <iostream> #include <string> using namespace std; int main() { Stash intStash(sizeof(int)); //就是转化成int类型 for(int i=0 ; i<100 ; ++i) //吧0到99存入到这个数据类型的数组中 intStash.add(&i); //全部输出看看 for(int j=0 ; j<100 ; ++j) cout<<"intStash.fetch("<<j<<")=" <<*(int*)intStash.fetch(j)<<endl; //再创建一个长度为80的字符串数组,每个字符串长度都是80个字节 const int bufsize=80; Stash stringStash(sizeof(char)*bufsize, 100); ifstream in("Stash4Test.cpp"); assure(in, "Stash4Test.cpp"); string line; while(getline(in, line)) { stringStash.add((char*)line.c_str()); //吧字符串转化成char*存入到数组中 } //输出来看看 int k=0; //计数 char* cp; //指向每一个string的地址 while((cp=(char*)stringStash.fetch(k++)) != 0) cout<<"stringStash.fetch("<<k<<")="<<cp<<endl; return 0; }
最后我们看一看关于枚举类型的知识
枚举类型直接输出里面的字符
http://topic.csdn.net/t/20050408/19/3921153.html
#include <iostream> #include <string> #include <map> using namespace std; enum MPType { MPT_None, MPT_Other, MPT_Board, MPT_Length };
//方案一,直接用数组
string MPTypeString[MPT_Length] = { "MPT_None ", "MPT_Other ", "MPT_Board " };
//方案二,用map
class MPTypeConverter { public: MPTypeConverter() { map.insert(make_pair(MPT_None,"MPT_None ")); map.insert(make_pair(MPT_Other,"MPT_Other ")); map.insert(make_pair(MPT_Board,"MPT_Board ")); }
string ToString(MPType key) { MPTypeStringMap::iterator pos =map.find(key); if (pos != map.end()) return pos-> second; return string( " "); } private: typedef map <MPType, string>MPTypeStringMap; MPTypeStringMap map; }; int main() { MPTypeConverter converter; cout < < MPTypeString[MPT_Board]< < endl; cout < < converter.ToString(MPT_Board)< < endl; return 0; }
【ThinkingInC++】49、带内联函数的Stash
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。