<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>YXD's Blog</title><link>http://yxd.cndev.org/</link><description /><managingEditor>YXD</managingEditor><dc:language>zh-CHS</dc:language><generator>.Text Version 0.95.2004.101</generator><item><dc:creator>YXD</dc:creator><title>这段时间用了WTL，感觉着实不错，很是轻巧。。。</title><link>http://yxd.cndev.org/archive/2005/02/04/6404.aspx</link><pubDate>2005-02-04 20:34:00Z</pubDate><guid>http://yxd.cndev.org/archive/2005/02/04/6404.aspx</guid><wfw:comment>http://yxd.cndev.org/comments/6404.aspx</wfw:comment><comments>http://yxd.cndev.org/archive/2005/02/04/6404.aspx#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://yxd.cndev.org/comments/commentRss/6404.aspx</wfw:commentRss><trackback:ping>http://yxd.cndev.org/services/trackbacks/6404.aspx</trackback:ping><description>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd"&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;
&lt;title&gt;无标题文档&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;table width="612" border="0" cellspacing="0" cellpadding="0"&gt;
  &lt;tr&gt;
    &lt;td width="612"&gt;&lt;p&gt;最显而易见的一个效果就是程序的体积会减小不少，我基于wtl写了一个SDI的程序（Release，无document/view architecture支持，静态链接atl库），并添加功能性代码2000多行（也作的模板封装），体积为112K，但是用MFC（Release，无document/view architecture支持，静态链接MFC库），程序通过VC向导自动生成，未添加任何代码体积就已有304k。 &lt;/p&gt;
      &lt;p&gt;模板&amp;#8220;被用到才被编译&amp;#8221;的特性不觉中起到了缩小程序体积的效果。 &lt;/p&gt;
      &lt;p&gt;wtl的使用也很方便，类、方法名称和MFC几乎一致，与MFC里的类几乎都可以一一对应起来，同时对CE也有支持（当然MFC也有for CE，不过通常我不会用，因为往往手持设备的硬件条件并不像PC那样富余），而且同样因为模板封装的缘故，使得其在CE上的程序体积既表现与纯sdk程序相差不大，wtl出来这么久，才用它实在是惭愧，俺早先固执的认为GUI的编程并不适合用模板的风格，看来对不了解的东西抱着既定的思维去看待必定会产生很大的偏差。 &lt;/p&gt;
      &lt;p&gt;模板封装的方式也无意更叫巧妙、代码也更具高复用性。 &lt;/p&gt;
    &lt;p&gt;附图，我写的那个wtl的程序（其实是老早就想写的Java Script菜单编辑器，托了很长时间上周末才开始写的。。。。:&amp;gt;，争取过年这段时间能利用上。。。） &lt;/p&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&lt;img src="http://www.cndev.org/.imgdb/sn10045/GUID-BC077E6D-FC98-4CB9-B439-89C0A35DFF56.jpg" width="710" height="512"&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;&lt;img src ="http://yxd.cndev.org/aggbug/6404.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>YXD</dc:creator><title>实现了一个通用的内存流模板类，支持与标准流(stl)的高效直接通信，具有线程策略选择机制，也可用于对COM接口IStream的封装中。</title><link>http://yxd.cndev.org/archive/2004/12/20/5032.aspx</link><pubDate>2004-12-20 14:31:00Z</pubDate><guid>http://yxd.cndev.org/archive/2004/12/20/5032.aspx</guid><wfw:comment>http://yxd.cndev.org/comments/5032.aspx</wfw:comment><comments>http://yxd.cndev.org/archive/2004/12/20/5032.aspx#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://yxd.cndev.org/comments/commentRss/5032.aspx</wfw:commentRss><trackback:ping>http://yxd.cndev.org/services/trackbacks/5032.aspx</trackback:ping><description>&lt;P&gt;早先简单封装了一个CByteStream类（继承了IStream COM接口），但是很低效，且不够灵活。利用周末的两天实现了如下定义的通用内存流类。&lt;BR&gt;&lt;FONT color=#0000ff&gt;template&lt;BR&gt;&amp;lt;&lt;BR&gt;&amp;nbsp;class _Ty,&lt;BR&gt;&amp;nbsp;template &amp;lt; class &amp;gt; class _ThreadingModel = DefaultThreadingModel,&lt;BR&gt;&amp;nbsp;template &amp;lt; class &amp;gt; class _Allocator = ::std::allocator,&lt;BR&gt;&amp;nbsp;class _Size = long,&lt;BR&gt;&amp;nbsp;_Size _block_size = 4096&lt;BR&gt;&amp;gt;&lt;BR&gt;class MemoryStream: public _ThreadingModel&amp;lt; MemoryStream&amp;lt; _Ty, _ThreadingModel, _Allocator &amp;gt; &amp;gt;&lt;BR&gt;{&lt;BR&gt;public:&lt;BR&gt;&amp;nbsp;typedef _Ty&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value_type;&lt;BR&gt;&amp;nbsp;typedef value_type*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pointer;&lt;BR&gt;&amp;nbsp;typedef const value_type*&amp;nbsp;&amp;nbsp;const_pointer;&lt;BR&gt;&amp;nbsp;typedef value_type&amp;amp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;reference;&lt;BR&gt;&amp;nbsp;typedef const value_type&amp;amp;&amp;nbsp;&amp;nbsp;const_reference;&lt;BR&gt;&amp;nbsp;typedef _ThreadingModel&amp;lt; MemoryStream&amp;lt; _Ty, _ThreadingModel, _Allocator &amp;gt; &amp;gt;&amp;nbsp;ThreadingModel;&lt;BR&gt;&amp;nbsp;typedef _Allocator&amp;lt; _Ty &amp;gt;&amp;nbsp;&amp;nbsp;block_allocator;&lt;BR&gt;&amp;nbsp;typedef _Size&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;size_t;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#006400&gt;//&lt;BR&gt;// ...&lt;BR&gt;//&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;除了内存管理器(Allocator)外与内存相关访问的封装：&lt;BR&gt;&lt;FONT color=#0000ff&gt;template &amp;lt; class _Ty, class _Size = unsigned int &amp;gt;&lt;BR&gt;struct MemCopier&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;_Ty* operator()( _Ty* pDest, const _Ty* pSrc, _Size cbCopy )&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;::memcpy( pDest, pSrc, cbCopy * sizeof( _Ty ) );&lt;BR&gt;&amp;nbsp;&amp;nbsp;return pDest;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;};&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;提供如下公开的调用接口：&lt;BR&gt;函数：&lt;BR&gt;&lt;FONT color=#006400&gt;// Read a specified number of type_sizes from the stream object&lt;BR&gt;&amp;nbsp;// into memory, starting at the current seek pointer.&lt;BR&gt;&amp;nbsp;// Return the actual number of type_sizes read from the stream&lt;BR&gt;&amp;nbsp;// object.&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&lt;FONT color=#0000ff&gt;size_t Read( pointer pBuf, size_t cbRead )&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#006400&gt;&amp;nbsp;// Write a specified number of type_sizes into the stream object&lt;BR&gt;&amp;nbsp;// starting at the current seek pointer.&lt;BR&gt;&amp;nbsp;// Return the actual number of type_sizes written into the stream&lt;BR&gt;&amp;nbsp;// object.&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&lt;FONT color=#0000ff&gt;size_t Write( const_pointer pBuf, size_t cbWrite )&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#006400&gt;&amp;nbsp;// Copy a specified number of bytes from the current seek pointer&lt;BR&gt;&amp;nbsp;// in the stream to the current seek pointer in another stream.&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;size_t CopyTo( MemoryStream&amp;amp; stream, size_t cbCopy )&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#006400&gt;&amp;nbsp;// Generic version of CopyTo function&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;template &amp;lt; class _OutStream &amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;size_t CopyTo( _OutStream&amp;amp; stream, size_t cbCopy )&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#006400&gt;&amp;nbsp;// Getneric CopyFrom function&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&lt;FONT color=#0000ff&gt;template &amp;lt; class _InStream &amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;size_t CopyFrom( const _InStream&amp;amp; stream, size_t cbCopy )&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#006400&gt;&amp;nbsp;// Move the stream pointer to a specified location.&lt;BR&gt;&amp;nbsp;// Return the new position of the stream pointer.&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;size_t Seek( size_t offset, int nSeekMode = MemoryBase::seek_cur )&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#006400&gt;&amp;nbsp;// Release the memory space occupied by the stream object.&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&lt;FONT color=#0000ff&gt;void Clear()&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#006400&gt;&amp;nbsp;// Return the number of type_sizes of the data existing in the&lt;BR&gt;&amp;nbsp;// stream object.&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;size_t GetSize() const&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;FONT color=#006400&gt;// Return the current position of the pointer of the stream object.&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;size_t Tell() const&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;FONT color=#006400&gt;// Judge whether the stream pointer is at the end of the stream&lt;BR&gt;&amp;nbsp;// object.&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;bool End() const&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#006400&gt;&amp;nbsp;// Judge whether the stream object has data.&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;bool Empty() const&lt;/FONT&gt;&lt;BR&gt;操作符：&lt;BR&gt;&amp;nbsp;&lt;FONT color=#0000ff&gt;MemoryStream&amp;amp; operator = ( const MemoryStream&amp;amp; stream )&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#006400&gt;&amp;nbsp;// operator &amp;gt;&amp;gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;MemoryStream&amp;amp; operator &amp;gt;&amp;gt; ( const_reference vInput )&lt;BR&gt;&amp;nbsp;MemoryStream&amp;amp; operator &amp;gt;&amp;gt; ( const_pointer pInput )&lt;BR&gt;&amp;nbsp;template &amp;lt; class _InStream &amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;MemoryStream&amp;amp; operator &amp;gt;&amp;gt; ( const _InStream&amp;amp; stream )&lt;BR&gt;&amp;nbsp;MemoryStream&amp;amp; operator &amp;gt;&amp;gt; ( MemoryStream&amp;amp; stream )&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#006400&gt;&amp;nbsp;// operator &amp;lt;&amp;lt;&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&lt;FONT color=#0000ff&gt;MemoryStream&amp;amp; operator &amp;lt;&amp;lt; ( reference vOutput )&lt;BR&gt;&amp;nbsp;MemoryStream&amp;amp; operator &amp;lt;&amp;lt; ( pointer pOutput )&lt;BR&gt;&amp;nbsp;template &amp;lt; class _OutStream &amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;MemoryStream&amp;amp; operator &amp;lt;&amp;lt; ( _OutStream&amp;amp; stream )&lt;BR&gt;&amp;nbsp;MemoryStream&amp;amp; operator &amp;lt;&amp;lt; ( MemoryStream&amp;amp; stream )&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;几个测试用例如下：&lt;BR&gt;&lt;FONT color=#0000ff&gt;void Test1()&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;fstream infile;&lt;BR&gt;&amp;nbsp;infile.open( "E:\\yxd\\fuzhuang.mpg", ios_base::in | ios_base::binary );&lt;BR&gt;&amp;nbsp;MemoryStream&amp;lt; char &amp;gt; theStream;&lt;BR&gt;&amp;nbsp;theStream &amp;gt;&amp;gt; infile;&lt;BR&gt;&amp;nbsp;infile.close();&lt;BR&gt;&amp;nbsp;fstream outfile;&lt;BR&gt;&amp;nbsp;outfile.open( "E:\\fuzhuang.mpg", ios_base::out | ios_base::binary );&lt;BR&gt;&amp;nbsp;theStream.Seek( 0, MemoryBase::seek_set );&lt;BR&gt;&amp;nbsp;theStream &amp;lt;&amp;lt; outfile;&lt;BR&gt;&amp;nbsp;outfile.close();&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;void Test2()&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;MemoryStream&amp;lt; char &amp;gt; theStream;&lt;BR&gt;&amp;nbsp;for ( char n = 'a'; n &amp;lt; 'z' + 1; ++ n )&lt;BR&gt;&amp;nbsp;&amp;nbsp;theStream &amp;gt;&amp;gt; n;&lt;BR&gt;&amp;nbsp;theStream &amp;gt;&amp;gt; 'A';&lt;BR&gt;&amp;nbsp;theStream.Seek( 0, MemoryBase::seek_set );&lt;BR&gt;&amp;nbsp;theStream &amp;lt;&amp;lt; cout;&lt;BR&gt;&amp;nbsp;cout &amp;lt;&amp;lt; endl;&lt;BR&gt;&amp;nbsp;char szText[] = "this is a test.";&lt;BR&gt;&amp;nbsp;theStream.Write( szText, MemoryStream&amp;lt; char &amp;gt;::size_t( strlen( szText ) ) );&lt;BR&gt;&amp;nbsp;theStream.Seek( 0, MemoryBase::seek_set );&lt;BR&gt;&amp;nbsp;theStream &amp;lt;&amp;lt; cout;&lt;BR&gt;&amp;nbsp;cout &amp;lt;&amp;lt; endl;&lt;BR&gt;&amp;nbsp;theStream.Seek( 10, MemoryBase::seek_end );&lt;BR&gt;&amp;nbsp;theStream &amp;lt;&amp;lt; cout;&lt;BR&gt;&amp;nbsp;cout &amp;lt;&amp;lt; endl;&lt;BR&gt;&amp;nbsp;theStream.Seek( -20, MemoryBase::seek_cur );&lt;BR&gt;&amp;nbsp;theStream &amp;lt;&amp;lt; cout;&lt;BR&gt;&amp;nbsp;cout &amp;lt;&amp;lt; endl;&lt;BR&gt;&amp;nbsp;MemoryStream&amp;lt; char &amp;gt; theStream1( theStream );&lt;BR&gt;&amp;nbsp;theStream1 &amp;lt;&amp;lt; cout;&lt;BR&gt;&amp;nbsp;cout &amp;lt;&amp;lt; endl;&lt;BR&gt;&amp;nbsp;MemoryStream&amp;lt; char &amp;gt; theStream2 = theStream1;&lt;BR&gt;&amp;nbsp;theStream2 &amp;lt;&amp;lt; cout;&lt;BR&gt;&amp;nbsp;cout &amp;lt;&amp;lt; endl;&lt;BR&gt;&amp;nbsp;MemoryStream&amp;lt; char &amp;gt; theStream3;&lt;BR&gt;&amp;nbsp;theStream2.Seek( 13, MemoryBase::seek_set );&lt;BR&gt;&amp;nbsp;theStream3 &amp;gt;&amp;gt; theStream2;&lt;BR&gt;&amp;nbsp;theStream3.Seek( 0, MemoryBase::seek_set );&lt;BR&gt;&amp;nbsp;theStream3 &amp;lt;&amp;lt; cout;&lt;BR&gt;&amp;nbsp;cout &amp;lt;&amp;lt; endl;&lt;BR&gt;&amp;nbsp;char szRead[256] = { 0 };&lt;BR&gt;&amp;nbsp;theStream.Seek( 0, MemoryBase::seek_set );&lt;BR&gt;&amp;nbsp;cout &amp;lt;&amp;lt; "Total read size is " &amp;lt;&amp;lt; theStream.Read( szRead, 256 ) &amp;lt;&amp;lt; " bytes:" &amp;lt;&amp;lt; endl;&lt;BR&gt;&amp;nbsp;cout &amp;lt;&amp;lt; szRead &amp;lt;&amp;lt; endl;&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;void Test3()&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;MemoryStream&amp;lt; char &amp;gt; theStream1;&lt;BR&gt;&amp;nbsp;theStream1.CopyFrom( cin, 10 );&lt;BR&gt;&amp;nbsp;theStream1.Seek( -10 );&lt;BR&gt;&amp;nbsp;theStream1 &amp;lt;&amp;lt; cout;&lt;BR&gt;&amp;nbsp;cout &amp;lt;&amp;lt; endl;&lt;BR&gt;&amp;nbsp;theStream1.Seek( 0, MemoryBase::seek_set );&lt;BR&gt;&amp;nbsp;MemoryStream&amp;lt; char &amp;gt; theStream2;&lt;BR&gt;&amp;nbsp;theStream1.CopyTo( theStream2, theStream2.GetSize() );&lt;BR&gt;&amp;nbsp;theStream2.Seek( 0, MemoryBase::seek_set );&lt;BR&gt;&amp;nbsp;theStream2 &amp;lt;&amp;lt; cout;&lt;BR&gt;&amp;nbsp;cout &amp;lt;&amp;lt; endl;&lt;BR&gt;&amp;nbsp;MemoryStream&amp;lt; char &amp;gt; theStream3;&lt;BR&gt;&amp;nbsp;theStream1.Seek( 5, MemoryBase::seek_set );&lt;BR&gt;&amp;nbsp;cout &amp;lt;&amp;lt; "Copied " &amp;lt;&amp;lt; theStream1.CopyTo( theStream3, theStream1.GetSize() ) &amp;lt;&amp;lt; " bytes from theStream1 to theStream3:" &amp;lt;&amp;lt; endl;&lt;BR&gt;&amp;nbsp;theStream3.Seek( 0, MemoryBase::seek_set );&lt;BR&gt;&amp;nbsp;theStream3 &amp;lt;&amp;lt; cout;&lt;BR&gt;&amp;nbsp;cout &amp;lt;&amp;lt; endl;&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;void Test4()&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;MemoryStream&amp;lt; char, ::Loki::ObjectLevelLockable &amp;gt;* theLockableStream = new MemoryStream&amp;lt; char, ::Loki::ObjectLevelLockable &amp;gt;;&lt;BR&gt;&amp;nbsp;for ( unsigned char c = 0; c &amp;lt; 255; ++ c )&lt;BR&gt;&amp;nbsp;&amp;nbsp;*theLockableStream &amp;gt;&amp;gt; char( c );&lt;BR&gt;&amp;nbsp;theLockableStream-&amp;gt;Seek( 0, MemoryBase::seek_set );&lt;BR&gt;&amp;nbsp;*theLockableStream &amp;lt;&amp;lt; cout;&lt;BR&gt;&amp;nbsp;cout &amp;lt;&amp;lt; endl;&lt;BR&gt;&lt;FONT color=#006400&gt;&amp;nbsp;//RunStreamPrint( theLockableStream );// Thread #1&lt;BR&gt;&amp;nbsp;//RunStreamPrint( theLockableStream );// Thread #2&lt;BR&gt;&amp;nbsp;//RunStreamPrint( theLockableStream );// Thread #3&lt;BR&gt;&amp;nbsp;//RunStreamPrint( theLockableStream );// Thread #4&lt;BR&gt;&amp;nbsp;//RunStreamPrint( theLockableStream );// Thread #5&lt;BR&gt;&amp;nbsp;//RunStreamPrint( theLockableStream );// Thread #6&lt;/FONT&gt;&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;MemoryStream内部的内存组织方式采用的是基于::std::map这样的索引方式，采用散列的方式在大多数情况下性能应该会有更好的表现，但是这样代码的复杂性会增加，所以我就借用了::std::map，这层针对MemoryStream内部内存结构的组织策略原本也向上一层延迟，交给用户自己决定，但是还是复杂性太高，俺也没想出太好的方法，并且不像线程模型、allocator这样的有很多现成的东西可供选择。另外暂时还缺少对模板参数_Ty一样的MemoryStream之间的直接通信支持，不过比较容易实现。&lt;/FONT&gt;&lt;/P&gt;&lt;img src ="http://yxd.cndev.org/aggbug/5032.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>YXD</dc:creator><title>网上收罗的几道程序笔试题，并附上我的C++解答，有兴趣的可以看看，如果有好的题望不吝赐教。。。俺急需这样的题啊</title><link>http://yxd.cndev.org/archive/2004/12/14/4937.aspx</link><pubDate>2004-12-14 12:16:00Z</pubDate><guid>http://yxd.cndev.org/archive/2004/12/14/4937.aspx</guid><wfw:comment>http://yxd.cndev.org/comments/4937.aspx</wfw:comment><comments>http://yxd.cndev.org/archive/2004/12/14/4937.aspx#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://yxd.cndev.org/comments/commentRss/4937.aspx</wfw:commentRss><trackback:ping>http://yxd.cndev.org/services/trackbacks/4937.aspx</trackback:ping><description>&lt;P&gt;1、从字符串A中找到匹配字符串B的第一个子串的位置，以下的代码经测试比Plauger的stl（VC7）中的&lt;BR&gt;::std::string::find要快30%左右&lt;BR&gt;// 仿函数版本&lt;BR&gt;&lt;FONT color=#000080&gt;template &amp;lt; class Character = char, class Size = int &amp;gt;&lt;BR&gt;struct StringFinder&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;typedef Size size_t;&lt;BR&gt;&amp;nbsp;typedef Character char_t;&lt;BR&gt;&amp;nbsp;size_t operator()( const char_t* lpszSource, const char_t* lpszSearch )&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;// maybe the processing of the following line can delay to the caller&lt;BR&gt;&amp;nbsp;&amp;nbsp;if ( ( NULL == lpszSource ) || ( NULL == lpszSearch ) ) return -1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;const char_t&amp;amp; cSource = *lpszSource;&lt;BR&gt;&amp;nbsp;&amp;nbsp;const char_t&amp;amp; cSearch = *lpszSearch;&lt;BR&gt;&amp;nbsp;&amp;nbsp;for ( ; ; )&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ( 0 == *lpszSearch )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ( lpszSource - ( lpszSearch - &amp;amp;cSearch ) - &amp;amp;cSource );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ( 0 == *lpszSource ) return -1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ( *lpszSource != *lpszSearch )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lpszSource -= lpszSearch - &amp;amp;cSearch - 1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lpszSearch = &amp;amp;cSearch;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;++ lpszSource;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;++ lpszSearch;&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;return -1;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;};&lt;BR&gt;&lt;/FONT&gt;// 函数版本&lt;BR&gt;&lt;FONT color=#000080&gt;template &amp;lt; class char_t, class size_t &amp;gt;&lt;BR&gt;size_t StringFind( const char_t* lpszSource, const char_t* lpszSearch )&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;// maybe the processing of the following line can delay to the caller&lt;BR&gt;&amp;nbsp;if ( ( NULL == lpszSource ) || ( NULL == lpszSearch ) ) return -1;&lt;BR&gt;&amp;nbsp;const char_t&amp;amp; cSource = *lpszSource;&lt;BR&gt;&amp;nbsp;const char_t&amp;amp; cSearch = *lpszSearch;&lt;BR&gt;&amp;nbsp;for ( ; ; )&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;if ( 0 == *lpszSearch )&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return ( lpszSource - ( lpszSearch - &amp;amp;cSearch ) - &amp;amp;cSource );&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;if ( 0 == *lpszSource ) return -1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;if ( *lpszSource != *lpszSearch )&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;lpszSource -= lpszSearch - &amp;amp;cSearch - 1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;lpszSearch = &amp;amp;cSearch;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue;&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;++ lpszSource;&lt;BR&gt;&amp;nbsp;&amp;nbsp;++ lpszSearch;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;return -1;&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;2、字符串比较，同strcmp的功能，以下为仿函数版本。&lt;BR&gt;&lt;FONT color=#000080&gt;struct StringCmp&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;int operator()( const char* lpszStr1, const char* lpszStr2 )&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;if ( NULL == lpszStr1 )&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ( NULL == lpszStr2 ) return 0;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return -1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;if ( NULL == lpszStr2 ) return 1;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000080&gt;&amp;nbsp;&amp;nbsp;for ( ; ( 0 != ( ( *lpszStr1 ) &amp;amp; ( *lpszStr2 ) ) ); ++ lpszStr1, ++ lpszStr2 )&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ( *lpszStr1 &amp;lt; *lpszStr2 ) return -1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ( *lpszStr1 &amp;gt; *lpszStr2 ) return 1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;if ( 0 != *lpszStr2 ) return -1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;if ( 0 != *lpszStr1 ) return 1;&lt;BR&gt;&amp;nbsp;&amp;nbsp;return 0;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;};&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;3、快速排序算法（做了优化处理的），当元素总数不超过给定的阈值（threshold）时，采用插入排序，如果这个&lt;BR&gt;做笔试题的话，个人认为难度偏大，因为其中程序部分可能技巧性比较强，需要很细心。俺也是花了很长时间上机&lt;BR&gt;调试，我认为可能冒泡、插入排序更适合笔试。做完此题后，我还参读了Plauger's stl(VC7)中::std::sort&lt;BR&gt;的源码，不同的是，其阈值默认为32，并且在超过阈值时也作了优化，小于或等于则都用了插入排序，呵呵。。。&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000080&gt;struct NullType;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000080&gt;template &amp;lt; class T, class Iterator = T*, class Pr = NullType, class Diff = __int64, Diff threshold = 9 &amp;gt;&lt;BR&gt;struct Sorter;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000080&gt;template &amp;lt; class T, class Iterator, class Diff, Diff threshold &amp;gt;&lt;BR&gt;struct Sorter&amp;lt; T, Iterator, NullType, Diff, threshold &amp;gt;// sort by operator &amp;lt;&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;typedef T type;&lt;BR&gt;&amp;nbsp;typedef T&amp;amp; reference;&lt;BR&gt;&amp;nbsp;typedef const T&amp;amp; const_reference;&lt;BR&gt;&amp;nbsp;typedef T* pointer;&lt;BR&gt;&amp;nbsp;typedef Iterator iterator;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000080&gt;&amp;nbsp;void operator()( iterator begin, iterator end )// sort in field [begin, end)&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;QuickSort( begin, end );&lt;BR&gt;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000080&gt;&amp;nbsp;void InsertionSort( iterator begin, iterator end )// sort in field [begin, end)&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;type swap_temp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;for ( iterator i = begin + 1; i &amp;lt; end; ++ i )&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;for ( iterator j = i; ( j &amp;gt; begin ) &amp;amp;&amp;amp; ( *j &amp;lt; *( j - 1 )&amp;nbsp; ); -- j )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;swap_temp = *j;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;j[0] = j[-1];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;j[-1] = swap_temp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000080&gt;&amp;nbsp;void QuickSort( iterator begin, iterator end )// sort in field [begin, end)&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;Diff diff = end - begin;&lt;BR&gt;&amp;nbsp;&amp;nbsp;// optimize speed with InsertionSort if the number of elements is not more than threshold&lt;BR&gt;&amp;nbsp;&amp;nbsp;if ( threshold &amp;gt;= diff )&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;InsertionSort( begin, end );&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000080&gt;&amp;nbsp;&amp;nbsp;// find pivot&lt;BR&gt;&amp;nbsp;&amp;nbsp;iterator pivot = begin + ( diff &amp;gt;&amp;gt; 1 );&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000080&gt;&amp;nbsp;&amp;nbsp;// swap pivot with the element before end&lt;BR&gt;&amp;nbsp;&amp;nbsp;type swap_temp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;swap_temp = end[-1];&lt;BR&gt;&amp;nbsp;&amp;nbsp;end[-1] = *pivot;&lt;BR&gt;&amp;nbsp;&amp;nbsp;pivot[0] = swap_temp;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000080&gt;&amp;nbsp;&amp;nbsp;// partition&lt;BR&gt;&amp;nbsp;&amp;nbsp;iterator right_first = Partition( begin, end - 2, end[-1] );&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000080&gt;&amp;nbsp;&amp;nbsp;// restore pivot to primary position&lt;BR&gt;&amp;nbsp;&amp;nbsp;if ( right_first &amp;lt; ( end - 1 ) )&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;swap_temp = right_first[0];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;right_first[0] = end[-1];&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;end[-1] = swap_temp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000080&gt;&amp;nbsp;&amp;nbsp;if ( ( right_first - begin ) &amp;gt; 2 )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;QuickSort( begin, right_first );// sort in field [begin, right_first)&lt;BR&gt;&amp;nbsp;&amp;nbsp;if ( ( end - right_first ) &amp;gt; 3 )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;QuickSort( right_first + 1, end );// sort in field [right_first + 1, end )&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;private:&lt;BR&gt;&amp;nbsp;iterator Partition( iterator first, iterator last, const_reference pivot )&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;iterator last_temp = last;&lt;BR&gt;&amp;nbsp;&amp;nbsp;type swap_temp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;for ( ; first &amp;lt; last; )&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ( *last &amp;lt; pivot )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ( *first &amp;lt; pivot )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;++ first;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;swap_temp = *first;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;first[0] = *last;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;last[0] = swap_temp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;++ first;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-- last;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ( *first &amp;lt; pivot )&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;++ first;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-- last;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-- last;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;continue;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;// calculate the first position of right part&lt;BR&gt;&amp;nbsp;&amp;nbsp;for ( ; ( !( pivot &amp;lt; *last ) )&amp;amp;&amp;amp; ( last &amp;lt;= last_temp ); ++ last ) {}&lt;BR&gt;&amp;nbsp;&amp;nbsp;return last;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;};&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000080&gt;template &amp;lt; class T, class Iterator, class Pr, class Diff, Diff threshold &amp;gt;&lt;BR&gt;struct Sorter&amp;lt; T, Iterator, Pr, Diff, threshold &amp;gt;// sort by Pr&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;// Just change it1 &amp;lt; it 2 to Pr( it1, it2 )&lt;BR&gt;};&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000080&gt;&lt;FONT color=#000000&gt;4、判断字符串是否为回环串，类似于"abcdcba"（？），这个可能挺简单，但是好像很多大公司出的&lt;BR&gt;笔试题似乎都很简单，不知其考察点在于什么。。。&lt;/FONT&gt;&lt;BR&gt;template &amp;lt; class Character = char &amp;gt;&lt;BR&gt;struct IsCircleString&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;typedef Character char_t;&lt;BR&gt;&amp;nbsp;bool operator()( const char_t* pStr )&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;const char_t* pLast = pStr;&lt;BR&gt;&amp;nbsp;&amp;nbsp;for ( ; 0 != *pLast; ++ pLast ) {}&lt;BR&gt;&amp;nbsp;&amp;nbsp;if ( ( ( pLast - pStr ) &amp;amp; 0x1 ) == 0 ) return false;//偶数即返回false&lt;BR&gt;&amp;nbsp;&amp;nbsp;-- pLast;&lt;BR&gt;&amp;nbsp;&amp;nbsp;for ( ; pStr &amp;lt; pLast; ++ pStr, -- pLast )&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ( *pStr != *pLast ) return false;&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;return true;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;};&lt;/FONT&gt;&lt;/P&gt;&lt;img src ="http://yxd.cndev.org/aggbug/4937.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>YXD</dc:creator><title>刚写的程序中犯的一个低级错误。。。。</title><link>http://yxd.cndev.org/archive/2004/11/25/4703.aspx</link><pubDate>2004-11-25 19:03:00Z</pubDate><guid>http://yxd.cndev.org/archive/2004/11/25/4703.aspx</guid><wfw:comment>http://yxd.cndev.org/comments/4703.aspx</wfw:comment><comments>http://yxd.cndev.org/archive/2004/11/25/4703.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://yxd.cndev.org/comments/commentRss/4703.aspx</wfw:commentRss><trackback:ping>http://yxd.cndev.org/services/trackbacks/4703.aspx</trackback:ping><description>&lt;P&gt;typedef ::std::vector&amp;lt; int &amp;gt; IntArray;&lt;/P&gt;
&lt;P&gt;...&lt;/P&gt;
&lt;P&gt;IntArray theInts;&lt;/P&gt;
&lt;P&gt;...&lt;/P&gt;
&lt;P&gt;IntArray::iterator it1, it2;&lt;/P&gt;
&lt;P&gt;....&lt;/P&gt;
&lt;P&gt;::std::swap( it1, it2 );// error!, should be ::std::swap( *it1, *it2 );&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;很早以前曾犯的另一个错误：&lt;/P&gt;
&lt;P&gt;IntArray theInts;&lt;/P&gt;
&lt;P&gt;...&lt;/P&gt;
&lt;P&gt;int* g_pTheInt;&lt;/P&gt;
&lt;P&gt;...&lt;/P&gt;
&lt;P&gt;g_pTheInt = &amp;amp;( *it ) or it;//无效，::std::vector会reallocate。。。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;自醒。。。&lt;/P&gt;&lt;img src ="http://yxd.cndev.org/aggbug/4703.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>YXD</dc:creator><title>最近有一个把类似BT的东西与P2P整合在一起做一个服务的想法，虽然概念比较模糊，但是感觉应该会比较有意思</title><link>http://yxd.cndev.org/archive/2004/10/21/4235.aspx</link><pubDate>2004-10-21 01:35:00Z</pubDate><guid>http://yxd.cndev.org/archive/2004/10/21/4235.aspx</guid><wfw:comment>http://yxd.cndev.org/comments/4235.aspx</wfw:comment><comments>http://yxd.cndev.org/archive/2004/10/21/4235.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://yxd.cndev.org/comments/commentRss/4235.aspx</wfw:commentRss><trackback:ping>http://yxd.cndev.org/services/trackbacks/4235.aspx</trackback:ping><description>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Untitled Document&lt;/title&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;p&gt;最近有一个把类似BT的东西与P2P整合在一起做一个服务的想法，虽然概念比较模糊，但是感觉应该会比较有意思（不知道是缺点还是有点，当每有新想法时，俺总想立即写出代码印证一下）， 
  随即便先实现了一个我特定应用的http server(对于BT还是P2P应用来说，应该都会很有必要)，呵呵，尽管很简陋，但的确是可行的。。。如下图。&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.cndev.org/.imgdb/sn10038/GUID-CA728FC0-F1AE-4515-829E-74E7D7FBC929.jpg" width="541" height="251"&gt;&lt;/p&gt;
&lt;p&gt;But，虽然想做的事很多，人的精力毕竟有限啊，烦心的事也多，fuck！只有一件一件地先做好吧。恨不得做梦也梦见有人给我投资让我无忧无虑地专心写程序。。。&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;&lt;img src ="http://yxd.cndev.org/aggbug/4235.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>