zoukankan      html  css  js  c++  java
  • 袖珍C库

     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 }

    执行结果:

  • 相关阅读:
    一个有趣的.net程序死锁问题
    腾讯2013年实习生笔试题目(附答案)
    C#函数式程序设计初探基础理论篇
    IE的BUG?
    OpenPetra 以及CentOS Mono 3.0 部署包
    自己封装的内存缓存类DotNet.Caches.Bytecached
    Windows Azure Services安装及故障排查
    接口
    利用SQL Server的扩展属性自动生成数据字典
    CentOS配置ssh无密码登录的注意点
  • 原文地址:https://www.cnblogs.com/xing901022/p/2718791.html
Copyright © 2011-2022 走看看