终于有了间茅草棚

——我走时,会否有随风飘散的痕迹?

外面的风好大,雨也淅淅沥沥的。

世间种种的诱惑不惊不扰我清梦,山高路远不绝我追踪你绝美的笑容,登高一呼时才懂始终在为你心痛,俯首对花影摇动都是东风在捉弄

世间种种的迷惑都是因你而猜错,水光月光又交融描述这朗朗的夜空,生死到头的相从似狂花落叶般从容,当一切泯灭如梦就在远山被绝
随笔 - 40, 文章 - 2, 评论 - 257, 引用 - 3

导航

<2006年9月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

留言簿(11)

随笔档案

文章档案

收藏夹

其它的我

友情连接

网页连接

搜索

最新评论

  • 1. re: 关于质数(素数)的算法
  • 1121=19*59
  • --李圆欢
  • 2. re: void *几用
  • 方法都不错
  • --员工生日礼物
  • 3. re: void *几用
  • to oshj:
    最近才悟道这个用法,没想到你都用了很多了。

    to brent:
    不是为了玩才玩,这里每种用法在特定的情况下,都有他相应的好处。不过,我是做为自己记录的,指不定什么时候就忘记了,还可以这么用。
    1. 可以使得头文件简单,而且出于实现保密的需要,还是很有用处的。
    2. 很多时候对象本身应该简洁,但往往应对不同的需要,通常需要数据对应。举个例子,比如玩家在哪个房间,在哪个房间最好不要直接记在玩家身上,用数据注入的方式,能够很快的获得该信息。
    3. 因为是做为库暴露头文件的,使用者并不关心void *的实际意义,而且能够加快编译速度。真正要关心时,就Graphics.h这个头文件是不够的,通常会需要了解整底层个实现,才能较好的扩充。
  • --清风雨
  • 4. re: void *几用
  • 还在玩C++语言,你这玩法, 又不是用在导弹导航上...
    别人看不懂的代码,都不是好代码,分数为0

    int sub(any) { any; return TRUE;}
    (void)sub(any);

  • --brent
  • 5. re: void *几用
  • 个人用3 的情况比较多
  • --oshj
  • 6. re: 简要记录sizeof和内存对齐
  • 很清楚,受教了
  • --rdeam
  • 7. re: 局部变量
  • 我不用ATL,一般都是用标准c++支持的和平台API。
    crt里的wcs和mbs转换的函数,ms的实现是不完整的,在它的实现代码里有一段说明;而且还要设置local,比较烦琐。
  • --清风雨
  • 8. re: 简单字符串转换
  • win下,atl中有CT2CA, CW2CA等一系列转换类。
    crt中有wcstombs和mbstowcs
  • --局部变量
  • 9. re: 一个奇怪但可能有用的缓存
  • vc资料站:http://www.vcmsdn.com/     对学习很有帮助的,可以上去

    看看,或加群46138350,里面有高手可以请教的。
  • --maggie
  • 10. #progma整理
  • #pragma整理
  • --hi_wyl
  • 11. re: hpho
  • 缓冲在一等程度上是临时性的,而且实际上如果保持std::vector的iterator下次使用,也会有问题。

    所以,这个问题也就是使用时不允许这样用。
  • --清风雨
  • 12. re: 一个奇怪但可能有用的缓存
  • 如果有指针引用着arrange()所调整的那块内存,那就乱了.
  • --hpho
  • 13. re: 一个奇怪但可能有用的缓存
  • 用std::string不就行了?
  • --金庆
  • 14. re: ZiDing
  • 鉴于你的建议,前段时间我看了下boost的内存对象池,没有过于深入,
    判断下来属于做法类似,性能应该相当,甚至可能我这个略好一点。

    因为编写测试是一件相当麻烦,而且要求也很高的事,而要全面又很难。

    boost的代码我看起来比较难读,维护、调试起来对我来说是一个大麻烦。所以,我一般不选择boost。
  • --清风雨
  • 15. re: 简单内存对象池
  • 和boost的对比过没有?
  • --ZiDing

阅读排行榜

评论排行榜

自己的lzw实现

好久没有写点内容了。
一是工作忙;另一个也是才疏学浅没什么独到见解可写;而且,我写blog往往都是想用于记录。

自己写的lzw算法的实现,vc8.0 和 g++ 3.2.3 编译通过(看看一堆的typedef typename就是为了g++)。
由于lzw是流式无损压缩算法,本想用于网络,实际测试下来压缩效果并不是很理想(可能和我所取的编码位数有关)。
现将代码贴于下面,有需要的朋友可以直接使用;如有性能、内存方面的优化实现,如果方便,希望能和我分享。
#ifndef __COMPRESS__
#define __COMPRESS__
//#pragma once
#include <cassert>
#include <vector>
#include <map>
#include <algorithm>

namespace coder
{

 template< unsigned bit >
 struct size_max
 {
  enum
  {
   VALUE = 2*size_max< bit-1 >::VALUE,
  };
 };
 template< >
 struct size_max< 1 >
 {
  enum
  {
   VALUE = 2,
  };
 };

 template< class source_t,class code_t,int bit = sizeof(code_t)*8 >
 struct encode_eq
 {
  ///最大静态编码
  static const code_t max_code = size_max< sizeof(source_t)*8 >::VALUE;
  const code_t operator()( const source_t &data ) const
  {
   return ( max_code - 1 ) & data;
  }
 };
 template< class source_t,class code_t,int bit = sizeof(code_t)*8 >
 struct decode_eq
 {
  ///最大静态编码
  static const code_t max_code = size_max< sizeof(source_t)*8 >::VALUE;
  const source_t operator()( const code_t &data ) const
  {
   assert( data < max_code );
   return static_cast< source_t >( data );
  }
 };

 ///源码、码字、源码位长、编码位长、静态编码器
 template< class source_t,
  class code_t,int bit = sizeof(code_t)*8,
  class encoder = encode_eq< source_t,code_t,bit > >
 struct compressor
 {
  ///源码流数据
  typedef std::vector< source_t >    datas_t;
  ///码字流数据
  typedef std::vector< code_t >    codes_t;
 private:
  ///动态码字
  struct codeEx_t
  {
   code_t prefix,suffix;
   bool operator < ( const codeEx_t &code ) const
   {
    if( prefix == code.prefix )
    {
     return suffix < code.suffix;
    }
    else
    {
     return prefix < code.prefix;
    }
   }
  };
  ///动态码表
  typedef std::map< const codeEx_t,code_t > codesEx_t;
  ///最多扩展编码数
  enum
  {
   num_codeEx = size_max< bit >::VALUE - encoder::max_code,
  };
 public:
  compressor( encoder en = encoder() ) : m_encode( en ) {}
  void operator()( const datas_t &in,codes_t &out )
  {
   assert( !in.empty() );
   codeEx_t code;
   code.prefix = m_encode( in.front() );
   typedef typename datas_t::const_iterator iter_t;
   for( iter_t i = in.begin() + 1; i != in.end(); ++i )
   {
    code.suffix = m_encode( *i );
    typedef typename codesEx_t::iterator iter2_t;
    iter2_t j = m_cat.find( code );
    if( j != m_cat.end() )
    {
     const code_t c = j->second;
     code.prefix = j->second;
    }
    else
    {
     if( m_cat.size() < num_codeEx )
     {
      const code_t c = m_cat.size() + encoder::max_code;
      typedef typename codesEx_t::value_type value_t;
      m_cat.insert( m_cat.end(),value_t(code,c) );
     }
     out.push_back( code.prefix );
     code.prefix = code.suffix;
    }
   }
   out.push_back( code.prefix );
  }
 private:
  ///基础编码器
  encoder m_encode;
  ///动态编码表
  codesEx_t m_cat;
 };

 ///源码、码字、每码位长、静态解码器
 template< class source_t,
  class code_t,int bit = sizeof(code_t)*8,
  class decoder = decode_eq< source_t,code_t,bit > >
 struct decompressor {
  ///源码流数据
  typedef std::vector< source_t >    datas_t;
  ///码字流数据
  typedef std::vector< code_t >    codes_t;
 private:
  ///动态码字
  struct codeEx_t
  {
   code_t prefix,suffix;
   bool operator < ( const codeEx_t &code ) const
   {
    if( prefix == code.prefix )
    {
     return suffix < code.suffix;
    }
    else
    {
     return prefix < code.prefix;
    }
   }
  };
  ///动态码表
  typedef std::map< const codeEx_t,code_t > codesEx_t;
  typedef std::map< code_t,const codeEx_t > decode_t;
  ///最多扩展编码数
  enum
  {
   num_codeEx = size_max< bit >::VALUE - decoder::max_code,
  };
 public:
  decompressor( decoder de = decoder() ) : m_decode( de ) {}
  void operator()( const codes_t &in,datas_t &out )
  {
   assert( !in.empty() );
   code_t code0 = in.front();
   out.push_back( m_decode(code0) );
   typedef typename codes_t::const_iterator iter_t;
   for( iter_t i = in.begin() + 1; i != in.end(); ++i )
   {
    code0 = decode( code0,*i,out );
   }
  }
 private:
  bool valid( code_t code ) const
  {
   if( code >= decoder::max_code )
   {
    typedef typename decode_t::const_iterator iter_t;
    iter_t i = m_dec.find( code );
    return i != m_dec.end();
   }
   else
   {
    return true;
   }
  }
  const code_t suffix( code_t code ) const
  {
   assert( valid(code) );
   if( code >= decoder::max_code )
   {
    const codeEx_t &c = m_dec.find( code )->second;
    assert(  c.suffix < decoder::max_code );
    return c.suffix;
   }
   else
   {
    return code;
   }
  }
  const code_t prefix( code_t code ) const
  {
   assert( valid(code) );
   while( code >= decoder::max_code )
   {
    const codeEx_t &c = m_dec.find( code )->second;
    code = c.prefix;
    assert( valid(code) );
   }
   return code;
  }
  const code_t encode( code_t prefix,code_t suffix )
  {
   const codeEx_t k1 = { prefix,suffix };
   typedef typename codesEx_t::iterator iter_t;
   iter_t i = m_cat.find( k1 );
   if( i != m_cat.end() )
   {
    return i->second;
   }
   else
   {
    if( m_cat.size() < num_codeEx )
    {
     const code_t k2 = m_cat.size() + decoder::max_code;
     typedef typename codesEx_t::value_type value1_t;
     m_cat.insert( m_cat.end(),value1_t(k1,k2) );
     typedef typename decode_t::value_type value2_t;
     m_dec.insert( m_dec.end(),value2_t(k2,k1) );
    }
    return suffix;
   }
  }
  const code_t decode( code_t previous,code_t code,datas_t &out )
  {
   assert( valid(previous) );
   if( code >= decoder::max_code )
   {
    typedef typename decode_t::iterator iter_t;
    const iter_t i = m_dec.find( code );
    if( i != m_dec.end() )
    {
     const codeEx_t &c = i->second;
     decode( previous,c.prefix,out );
     out.push_back( m_decode(c.suffix) );
    }
    else
    {
     assert( code == m_cat.size() + decoder::max_code );
     const code_t tmp = encode( previous,prefix(previous) );
     assert( tmp == prefix(previous) );
     decode( previous,code,out );
    }
   }
   else
   {
    encode( previous,code );
    out.push_back( m_decode(code) );
   }
   return code;
  }
  ///基础解码器
  decoder m_decode;
  ///解码动态表
  decode_t m_dec;
  ///动态编码表
  codesEx_t m_cat;
 };

};

#endif //__COMPRESS__

posted on 2006-09-22 09:51 终于有了间茅草棚 阅读(3036) 评论(3)  编辑 收藏

评论

# re: 自己的lzw实现

自己测试了没有?我最近在协助女朋友写一篇论文,其中要用到压缩技术,不知道这个怎么样?我想采用nsis使用的那个,因为那个是开元的。 :)
2006-09-26 08:21 | 晓寒

# re: 晓寒

自己跑过。
做解压时网上找资料都不是很明确,自己通过数据和压缩推测的解压。
说压缩效果不是很好,就是通过测试得来的。
不过,比较担心测试不是很全面。—— 自己的数据是全都通过了,毕竟解压是自己推测的,是否完备比较担心。——不知道怎么做这个覆盖测试。
2006-09-26 11:24 | 清风雨

# 对了

有什么好的流失压缩算法,各位路过的朋友还请推荐一下,不过,希望压缩解压都要简易的、不能占CPU和内存。要找一个比较可观的用于网络传输时的压缩和解压。
2006-09-26 11:32 | 清风雨
标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]