1 #include "StdAfx.h" 2 #include <iostream> 3 #include <fstream> 4 #include <cassert> 5 #include <string> 6 7 using namespace std; 8 9 const int increment = 100; 10 11 typedef struct CStashTag{ 12 int size; 13 int quantity; 14 int next; 15 unsigned char* storage; 16 }CStash; 17 18 void initialize(CStash* s,int size); 19 void cleanup(CStash* s); 20 int add(CStash* s,const void* element); 21 void* fetch(CStash* s,int index); 22 int count(CStash* s); 23 void inflate(CStash* s,int increase); 24 25 void initialize(CStash* s,int sz){ 26 s->size = sz; 27 s->quantity = 0; 28 s->storage = 0; 29 s->next = 0; 30 } 31 32 int add(CStash* s,const void* element){ 33 if(s->next >= s->quantity) 34 inflate(s,increment); 35 int startBytes = s->next * s->size; 36 unsigned char* e=(unsigned char*)element; 37 for(int i=0;i<s->size;i++) 38 s->storage[startBytes + i] = e[i]; 39 s->next++; 40 return(s->next -1); 41 } 42 43 void* fetch(CStash* s,int index){ 44 assert(0 <= index); 45 if(index >= s->next) 46 return 0; 47 return &(s->storage[index * s->size]); 48 } 49 50 int count(CStash* s){ 51 return s->next; 52 } 53 54 void inflate(CStash* s,int increase){ 55 assert(increase > 0); 56 int newQuantity = s->quantity + increase; 57 int newBytes = newQuantity * s->size; 58 int oldBytes = s->quantity*s->size; 59 unsigned char* b = new unsigned char[newBytes]; 60 for(int i=0;i<oldBytes;i++) 61 b[i] = s->storage[i]; 62 delete [](s->storage); 63 s->storage = b; 64 s->quantity = newQuantity; 65 } 66 67 void cleanup(CStash* s){ 68 if(s->storage != 0) 69 { 70 cout<<"freeing storage"<<endl; 71 delete []s->storage; 72 } 73 } 74 75 int main() 76 { 77 CStash intStash,stringStash; 78 int i; 79 char* cp; 80 ifstream in; 81 string line; 82 const int bufsize = 80; 83 initialize(&intStash,sizeof(int)); 84 for(i =0;i<100;i++) 85 add(&intStash,&i); 86 for(i=0;i<count(&intStash);i++) 87 cout<<"fetch(&intStash,"<<i<<")"<<*(int*)fetch(&intStash,i)<<endl; 88 initialize(&stringStash,sizeof(char)*bufsize); 89 in.open("stdafx.cpp"); 90 assert(in); 91 while(getline(in,line)) 92 add(&stringStash,line.c_str()); 93 i=0; 94 while((cp=(char*)fetch(&stringStash,i++))!=0) 95 cout<<"fetch(&stringStash,"<<i<<")"<<cp<<endl; 96 cleanup(&intStash); 97 cleanup(&stringStash); 98 return 0; 99 }
执行结果: