<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>技术</title><link>http://yxd.cndev.org/category/446.aspx</link><description>技术</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><item><dc:creator>YXD</dc:creator><title>C++范型数据列表结构最终完成功能列表</title><link>http://yxd.cndev.org/archive/2004/09/28/3768.aspx</link><pubDate>2004-09-28 11:51:00Z</pubDate><guid>http://yxd.cndev.org/archive/2004/09/28/3768.aspx</guid><wfw:comment>http://yxd.cndev.org/comments/3768.aspx</wfw:comment><comments>http://yxd.cndev.org/archive/2004/09/28/3768.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://yxd.cndev.org/comments/commentRss/3768.aspx</wfw:commentRss><trackback:ping>http://yxd.cndev.org/services/trackbacks/3768.aspx</trackback:ping><description>&lt;P&gt;基本类型：&lt;BR&gt;NullType//为了表示对Loki及其作者的敬意:&amp;gt;，其定义为typdef Loki::TL::NullType NullType;&lt;/P&gt;
&lt;P&gt;宏定义：用来定义范型数据列表最多支持20种类型，可扩充PARAMEERLIST_...来增加支持的数据类型&lt;BR&gt;PARAMEERLIST(num)&lt;BR&gt;PARAMEERLIST_1 ~ PARAMEERLIST_20&lt;/P&gt;
&lt;P&gt;模板类：&lt;BR&gt;ParameterList//范型数据列表&lt;BR&gt;MakeParameterList//定义范型数据列表，可最多支持40种类型，同样可以扩充，比宏定义的方式代码更简洁、可靠&lt;BR&gt;EraseType//从范型数据列表结构删除指定的类型，如果指定的类型有重复，只删除第一个&lt;BR&gt;EraseTypeAll//从范型数据列表结构删除与指定的类型相同的所有类型&lt;BR&gt;NoDuplicateTypes//从范型数据列表结构中得到无重复类型的列表结构&lt;BR&gt;TotalOfTypes//得到范型数据列表的类型数量&lt;BR&gt;TypeAt//从索引号得到范型数据列表中的类型&lt;BR&gt;IteratorAt//从索引号得到范型数据列表中的类型的iterator&lt;BR&gt;TypeIndexOf//从类型得到其在范型数据列表的索引号&lt;/P&gt;
&lt;P&gt;模板类（仿函数）：&lt;BR&gt;ValueListPtrAt//从索引号得到范型数据列表对象中对应的列表指针&lt;BR&gt;Visit//遍历范型数据列表数据&lt;BR&gt;Clear//清除范型数据列表数据&lt;BR&gt;EraseFunctor//清除指定的范型数据列表数据&lt;BR&gt;FindFunctor//查找范型数据列表数据&lt;BR&gt;FindifFunctor//自定义规则查找范型数据列表数据&lt;/P&gt;
&lt;P&gt;模板函数&lt;BR&gt;Insert//往范型数据列表中添加数据&lt;BR&gt;Erase//功能同EraseFunctor，不同的是Erase为真实的函数，而EraseFunctor为仿函数，下同&lt;BR&gt;Find//功能同FindFunctor&lt;BR&gt;Findif//功能同FindifFunctor&lt;BR&gt;&lt;/P&gt;&lt;img src ="http://yxd.cndev.org/aggbug/3768.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>YXD</dc:creator><title>完成最新版本的“真正包容各种类型”的数据链表结构，已经可以作实用。</title><link>http://yxd.cndev.org/archive/2004/09/24/3698.aspx</link><pubDate>2004-09-24 12:38:00Z</pubDate><guid>http://yxd.cndev.org/archive/2004/09/24/3698.aspx</guid><wfw:comment>http://yxd.cndev.org/comments/3698.aspx</wfw:comment><comments>http://yxd.cndev.org/archive/2004/09/24/3698.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://yxd.cndev.org/comments/commentRss/3698.aspx</wfw:commentRss><trackback:ping>http://yxd.cndev.org/services/trackbacks/3698.aspx</trackback:ping><description>&lt;P&gt;// ParameterListDemo.cpp : Defines the entry point for the console application.&lt;BR&gt;//&lt;/P&gt;
&lt;P&gt;#include "stdafx.h"&lt;BR&gt;#include &lt;IOSTREAM&gt;&lt;BR&gt;#include &lt;STRING&gt;&lt;BR&gt;using namespace std;&lt;/P&gt;
&lt;P&gt;#include "ParameterList.h"&lt;BR&gt;using namespace face::PL;&lt;/P&gt;
&lt;P&gt;typedef struct tagPoint&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;long x;&lt;BR&gt;&amp;nbsp;long y;&lt;BR&gt;}_POINT, *_LPPOINT;&lt;/P&gt;
&lt;P&gt;typedef PARAMEERLIST(5)(int,char,string,double,_POINT) MyParameters;&lt;/P&gt;
&lt;P&gt;template &amp;lt; class T &amp;gt;&lt;BR&gt;struct Print&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;typedef T _T;&lt;BR&gt;&amp;nbsp;void operator ()( _T&amp;amp; value )&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;::std::cout &amp;lt;&amp;lt; "Comman Print Functor&amp;lt;&amp;lt; " &amp;lt;&amp;lt; value &amp;lt;&amp;lt; endl;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;};&lt;/P&gt;
&lt;P&gt;template &amp;lt;&amp;gt;&lt;BR&gt;struct Print&amp;lt; ::std::string &amp;gt;&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;void operator()( ::std::string&amp;amp; value )&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;::std::cout &amp;lt;&amp;lt; "std::string Print Functor&amp;lt;&amp;lt; " &amp;lt;&amp;lt; value &amp;lt;&amp;lt; endl;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;};&lt;/P&gt;
&lt;P&gt;template &amp;lt;&amp;gt;&lt;BR&gt;struct Print&amp;lt; _POINT &amp;gt;&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;void operator()( _POINT&amp;amp; value )&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;::std::cout &amp;lt;&amp;lt; "struct tagPoint Print Functor&amp;lt;&amp;lt; x = " &amp;lt;&amp;lt; value.x &amp;lt;&amp;lt; ", y = " &amp;lt;&amp;lt; value.y &amp;lt;&amp;lt; endl;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;};&lt;/P&gt;
&lt;P&gt;int _tmain(int argc, _TCHAR* argv[])&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;MyParameters theParameters;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;InsertData( theParameters, 1111 );&lt;BR&gt;&amp;nbsp;InsertData( theParameters, 2222 );&lt;BR&gt;&amp;nbsp;InsertData( theParameters, 'A' );&lt;BR&gt;&amp;nbsp;InsertData( theParameters, 'B' );&lt;BR&gt;&amp;nbsp;InsertData&amp;lt; MyParameters, std::string &amp;gt;( theParameters, "Hello!" );&lt;BR&gt;&amp;nbsp;InsertData&amp;lt; MyParameters, std::string &amp;gt;( theParameters, "你好！" );&lt;BR&gt;&amp;nbsp;string strTest = "this is a test.";&lt;BR&gt;&amp;nbsp;InsertData( theParameters, strTest );&lt;BR&gt;&amp;nbsp;_POINT pt1 = { 100, 200 }, pt2 = { 60, -100 };&lt;BR&gt;&amp;nbsp;InsertData( theParameters, pt1 );&lt;BR&gt;&amp;nbsp;InsertData( theParameters, pt2 );&lt;/P&gt;
&lt;P&gt;&amp;nbsp;VisitParameterList&amp;lt; MyParameters, Print &amp;gt;::Do( theParameters );&lt;/P&gt;
&lt;P&gt;&amp;nbsp;return 0;&lt;BR&gt;}&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;screen output:&lt;/P&gt;
&lt;P&gt;Comman Print Functor&amp;lt;&amp;lt; 1111&lt;BR&gt;Comman Print Functor&amp;lt;&amp;lt; 2222&lt;BR&gt;Comman Print Functor&amp;lt;&amp;lt; A&lt;BR&gt;Comman Print Functor&amp;lt;&amp;lt; B&lt;BR&gt;std::string Print Functor&amp;lt;&amp;lt; Hello!&lt;BR&gt;std::string Print Functor&amp;lt;&amp;lt; 你好！&lt;BR&gt;std::string Print Functor&amp;lt;&amp;lt; this is a test.&lt;BR&gt;struct tagPoint Print Functor&amp;lt;&amp;lt; x = 100, y = 200&lt;BR&gt;struct tagPoint Print Functor&amp;lt;&amp;lt; x = 60, y = -100&lt;/P&gt;&lt;img src ="http://yxd.cndev.org/aggbug/3698.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>YXD</dc:creator><title>:D俺苦思冥想终于实现了一个“真正”包容各种数据类型的C++参数列表类型。</title><link>http://yxd.cndev.org/archive/2004/09/16/3478.aspx</link><pubDate>2004-09-16 17:02:00Z</pubDate><guid>http://yxd.cndev.org/archive/2004/09/16/3478.aspx</guid><wfw:comment>http://yxd.cndev.org/comments/3478.aspx</wfw:comment><comments>http://yxd.cndev.org/archive/2004/09/16/3478.aspx#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://yxd.cndev.org/comments/commentRss/3478.aspx</wfw:commentRss><trackback:ping>http://yxd.cndev.org/services/trackbacks/3478.aspx</trackback:ping><description>&lt;P&gt;通常情况下，我们描述一个物体总会提到物体的各种属性，在C++程序中，一个对象的属性就是用不同类型的数据来描述。比如：&lt;/P&gt;
&lt;P&gt;class Cat&lt;BR&gt;{&lt;BR&gt;public:&lt;BR&gt;??? Cat() {}&lt;BR&gt;??? ~Cat() {}&lt;BR&gt;??? int age;&lt;BR&gt;??? std::string name;&lt;BR&gt;};&lt;/P&gt;
&lt;P&gt;如何对这些&amp;#8220;属性&amp;#8221;做一个统一的管理呢，比如需要序列化的时候？当然上面的例子只有很少类型、很少量的数据，这种情况就好办多了。能否有这样的一种通用的数据结构具备如下能够包容不同数据类型数据的功能？&lt;/P&gt;
&lt;P&gt;DataList theList;&lt;BR&gt;theList.insert( 23 );&lt;BR&gt;theList.insert( "Tom" );&lt;BR&gt;//ColorType white;&lt;BR&gt;theList.insert( white );&lt;/P&gt;
&lt;P&gt;在C++里，或许可以借助像VARIANT这样的方式&amp;#8220;比较象地&amp;#8221;实现如上需求。但是VARIANT依然不是真正意义的泛型！并且不是强类型安全的。借助C++模板，我实现了这个结构，虽然使用形式还不像上例那么完美，但是已经达到还能让我满意的效果:)，下面的就是我的ParameterList的使用Demo程序：&lt;/P&gt;
&lt;P&gt;// ParameterListDemo.cpp : Defines the entry point for the console application.&lt;BR&gt;//&lt;/P&gt;
&lt;P&gt;#include "stdafx.h"&lt;BR&gt;#include &lt;iostream&gt;&lt;BR&gt;#include &lt;string&gt;&lt;BR&gt;using namespace std;&lt;/P&gt;
&lt;P&gt;#include "ParameterList.h"&lt;BR&gt;using namespace face::PL;&lt;/P&gt;
&lt;P&gt;typedef PARAMEERLIST(4)(int,char,string,double) MyParameters;&lt;/P&gt;
&lt;P&gt;typedef int Int;&lt;/P&gt;
&lt;P&gt;int _tmain(int argc, _TCHAR* argv[])&lt;BR&gt;{&lt;BR&gt;?MyParameters theParameters;&lt;BR&gt;?ValueListPtrAt&lt; MyParameters, 0 &gt;::ValueListPtr ptr0 =&lt;BR&gt;??ValueListPtrAt&lt; MyParameters, 0 &gt;::Get( theParameters );&lt;BR&gt;?ValueListPtrAt&lt; MyParameters, 1 &gt;::ValueListPtr ptr1 =&lt;BR&gt;??ValueListPtrAt&lt; MyParameters, 1 &gt;::Get( theParameters );&lt;BR&gt;?ValueListPtrAt&lt; MyParameters, 2 &gt;::ValueListPtr ptr2 =&lt;BR&gt;??ValueListPtrAt&lt; MyParameters, 2 &gt;::Get( theParameters );&lt;BR&gt;?ValueListPtrAt&lt; MyParameters, 3 &gt;::ValueListPtr ptr3 =&lt;BR&gt;??ValueListPtrAt&lt; MyParameters, 3 &gt;::Get( theParameters );&lt;/P&gt;
&lt;P&gt;?ptr0-&gt;push_back( 888 ); ptr0-&gt;push_back( 999 );&lt;BR&gt;?ptr1-&gt;push_back( 'a' ); ptr1-&gt;push_back( 'A' );&lt;BR&gt;?ptr2-&gt;push_back( "Hello!" ); ptr2-&gt;push_back( "中文" );&lt;BR&gt;?ptr3-&gt;push_back( 3.14 ); ptr3-&gt;push_back( 234.13124 );&lt;/P&gt;
&lt;P&gt;?cout &lt;&lt; "&lt;int&gt;" &lt;&lt; endl;&lt;BR&gt;?for ( IteratorAt&lt; MyParameters, 0 &gt;::Result it = ptr0-&gt;begin(); ptr0-&gt;end() != it; ++ it )&lt;BR&gt;?{&lt;BR&gt;??cout &lt;&lt; *it &lt;&lt; endl;&lt;BR&gt;?}&lt;BR&gt;?cout &lt;&lt; "&lt;char&gt;" &lt;&lt; endl;&lt;BR&gt;?for ( IteratorAt&lt; MyParameters, 1 &gt;::Result it = ptr1-&gt;begin(); ptr1-&gt;end() != it; ++ it )&lt;BR&gt;?{&lt;BR&gt;??cout &lt;&lt; *it &lt;&lt; endl;&lt;BR&gt;?}&lt;BR&gt;?cout &lt;&lt; "&lt;std::string&gt;" &lt;&lt; endl;&lt;BR&gt;?for ( IteratorAt&lt; MyParameters, 2 &gt;::Result it = ptr2-&gt;begin(); ptr2-&gt;end() != it; ++ it )&lt;BR&gt;?{&lt;BR&gt;??cout &lt;&lt; *it &lt;&lt; endl;&lt;BR&gt;?}&lt;BR&gt;?cout &lt;&lt; "&lt;double&gt;" &lt;&lt; endl;&lt;BR&gt;?for ( IteratorAt&lt; MyParameters, 3 &gt;::Result it = ptr3-&gt;begin(); ptr3-&gt;end() != it; ++ it )&lt;BR&gt;?{&lt;BR&gt;??cout &lt;&lt; *it &lt;&lt; endl;&lt;BR&gt;?}&lt;/P&gt;
&lt;P&gt;?cout &lt;&lt; "&lt;Total of types&gt;" &lt;&lt; endl;&lt;BR&gt;?cout &lt;&lt; TotalOfTypes&lt; MyParameters &gt;::value &lt;&lt; endl;&lt;BR&gt;?return 0;&lt;BR&gt;}&lt;BR&gt;输出：&lt;BR&gt;&lt;int&gt;&lt;BR&gt;888&lt;BR&gt;999&lt;BR&gt;&lt;char&gt;&lt;BR&gt;a&lt;BR&gt;A&lt;BR&gt;&lt;std::string&gt;&lt;BR&gt;Hello!&lt;BR&gt;中文&lt;BR&gt;&lt;double&gt;&lt;BR&gt;3.14&lt;BR&gt;234.131&lt;BR&gt;&lt;Total of types&gt;&lt;BR&gt;4&lt;/P&gt;
&lt;P&gt;呵呵。。。&lt;/P&gt;&lt;img src ="http://yxd.cndev.org/aggbug/3478.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>