﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><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>C++博客-兔子的技术博客-随笔分类-C++库，组件</title><link>http://www.cppblog.com/flyinghare/category/11474.html</link><description>兔子</description><language>zh-cn</language><lastBuildDate>Fri, 11 Oct 2013 12:55:19 GMT</lastBuildDate><pubDate>Fri, 11 Oct 2013 12:55:19 GMT</pubDate><ttl>60</ttl><item><title>C++操作mysql数据库文章资料汇总</title><link>http://www.cppblog.com/flyinghare/archive/2013/10/11/203664.html</link><dc:creator>会飞的兔子</dc:creator><author>会飞的兔子</author><pubDate>Fri, 11 Oct 2013 09:56:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghare/archive/2013/10/11/203664.html</guid><wfw:comment>http://www.cppblog.com/flyinghare/comments/203664.html</wfw:comment><comments>http://www.cppblog.com/flyinghare/archive/2013/10/11/203664.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghare/comments/commentRss/203664.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghare/services/trackbacks/203664.html</trackback:ping><description><![CDATA[<table border="0" cellspacing="1" cellpadding="1" align="center" style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff; width: 680px;"><tbody><tr><td><table border="0" cellspacing="0" cellpadding="5" style="width: 676px;"><tbody><tr><td><strong>usidc5</strong></td><td align="right">2010-07-19 00:19</td></tr><tr bgcolor="#ffffff"><td colspan="2"><h1>C++操作mysql数据库文章资料汇总</h1><span style="font-family: tahoma; font-size: 14px; color: #222222; line-height: 23px;"><p style="margin: 15px 0pt; padding: 0px;">VC的MySQL编程<br />在你的程式中使用数据库是个不做的注意。如果已经有可用的MySQL服务 器，在VC中可以按照如下方法实现与数据库的连接。</p><p style="margin: 15px 0pt; padding: 0px;">1、 找來MySQL(Win32)安裝目录下的include文件夾， 將其添加到VC头文件目录列表中；</p><p style="margin: 15px 0pt; padding: 0px;">（VC6 -&gt; Options -&gt; Directories -&gt; 加入此目录）</p><p style="margin: 15px 0pt; padding: 0px;">（VC2005 -&gt; 工具 -&gt;&nbsp;选项 -&gt; 项目和解決方案 -&gt; VC++目录 -&gt; 显示以下内容的目录 -&gt; 包含文件 -&gt; 加入此目录）</p><p style="margin: 15px 0pt; padding: 0px;">2、找到MySQL(Win32)安裝目 录下的lib文件夹， 將其添加到VC库文件目录列表中；</p><p style="margin: 15px 0pt; padding: 0px;">（VC6 -&gt; Options -&gt; Directories -&gt; 加入此目录）</p><p style="margin: 15px 0pt; padding: 0px;">（VC2005 -&gt; 工具 -&gt; 选项 -&gt; 项目和解决方案 -&gt; VC++目录 -&gt; 显示以下内容的目录 -&gt; 库文件 -&gt; 加入此目录，注意是lib/debug或lib/opt）</p><p style="margin: 15px 0pt; padding: 0px;">3、新建一个工程，参考如下代码；</p><p style="margin: 15px 0pt; padding: 0px;">// mysql.cpp : Defines the entry point for the console application.<br />//</p><p style="margin: 15px 0pt; padding: 0px;">#include "stdafx.h"<br />#include &lt;stdio.h&gt;<br />#include &lt;winsock.h&gt;<br />#include &lt;mysql.h&gt;<br />#include &lt;windows.h&gt;</p><p style="margin: 15px 0pt; padding: 0px;">#pragma comment(lib, "libmysql.lib")</p><p style="margin: 15px 0pt; padding: 0px;"><br />int main(int argc, char* argv[])<br />...{<br />unsigned short Port = 3306;<br />char *IPAddress = "192.168.31.56";<br />char *UserName = "root";<br />char *Password = "";<br />char *DBName = "SAS_1_2_0";</p><p style="margin: 15px 0pt; padding: 0px;">printf("Start... ");<br /><br />MYSQL *ssock;<br />//char execsql[500];</p><p style="margin: 15px 0pt; padding: 0px;">ssock = (MYSQL *)malloc(sizeof(MYSQL));<br /><br />// 在某些版本中，不需要该初始化工作，可观看mysql.H以及readme<br />mysql_init(ssock);<br />if(ssock == NULL)<br />...{<br />printf("EROR: MySQL ssock init error. ");<br />return FALSE;<br />}</p><p style="margin: 15px 0pt; padding: 0px;">//连接指定数据库<br />ssock = mysql_real_connect(ssock, IPAddress, UserName, Password, NULL, Port, NULL, 0);<br />if(!ssock)<br />...{<br />printf("conn fail... ");</p><p style="margin: 15px 0pt; padding: 0px;">//memcpy(eee, mysql_error(ssock), 20);<br />//fprintf(stderr, "Failed to connect to database: Error: %s ", mysql_error(ssock));</p><p style="margin: 15px 0pt; padding: 0px;">//printf("%c ", eee);<br />unsigned int mtint = mysql_errno(ssock);<br />//printf("%d ");<br />return FALSE;<br />}</p><p style="margin: 15px 0pt; padding: 0px;">if(mysql_select_db(ssock, DBName) != 0)<br />...{<br />printf("select db error. ");<br />return FALSE;<br />}</p><p style="margin: 15px 0pt; padding: 0px;">printf("version=%d ", mysql_get_server_version(ssock));<br />//exec my execsql string<br />//sprintf(execsql,"create table girls (name char(10),age int)");<br />//mysql_real_query(ssock,execsql,strlen(execsql));<br />mysql_close(ssock);</p><p style="margin: 15px 0pt; padding: 0px;">printf("End... ");<br />return TRUE;<br />}<br />4、编译连接，运行即可。</p><p style="margin: 15px 0pt; padding: 0px;">&nbsp;</p></span></td></tr></tbody></table></td></tr></tbody></table><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;</p><table border="0" cellspacing="1" cellpadding="1" align="center" style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff; width: 680px;"><tbody><tr><td><table border="0" cellspacing="0" cellpadding="5" style="width: 676px;"><tbody><tr><td><strong>usidc5</strong></td><td align="right">2010-07-19 00:21</td></tr><tr bgcolor="#ffffff"><td colspan="2">这里归纳了C API可使用的函数，并在下一节详细介绍了它们。<br /><br />函数<br />描述<br /><br />mysql_affected_rows()<br />返 回上次UPDATE、DELETE或INSERT查询更改／删除／插入的行数。<br /><br />mysql_autocommit()<br />切换 autocommit模式，ON/OFF<br /><br />mysql_change_user()<br />更改打开连接上的用户和数据库。<br /><br />mysql_charset_name()<br />返 回用于连接的默认字符集的名称。<br /><br />mysql_close()<br />关闭服务器连接。<br /><br />mysql_commit()<br />提 交事务。<br /><br />mysql_connect()<br />连接到MySQL服务器。该函数已不再被重视，使用 mysql_real_connect()取代。<br /><br />mysql_create_db()<br />创建数据库。该函数已不再被重视，使用 SQL语句CREATE DATABASE取而代之。<br /><br />mysql_data_seek()<br />在查询结果集中查找属性行编号。<br /><br />mysql_debug()<br />用 给定的字符串执行DBUG_PUSH。<br /><br />mysql_drop_db()<br />撤销数据库。该函数已不再被重视，使用SQL语句DROP DATABASE取而代之。<br /><br />mysql_dump_debug_info()<br />让服务器将调试信息写入日志。<br /><br />mysql_eof()<br />确 定是否读取了结果集的最后一行。该函数已不再被重视，可以使用mysql_errno()或mysql_error()取而代之。<br /><br />mysql_errno()<br />返 回上次调用的MySQL函数的错误编号。<br /><br />mysql_error()<br />返回上次调用的MySQL函数的错误消息。<br /><br />mysql_escape_string()<br />为 了用在SQL语句中，对特殊字符进行转义处理。<br /><br />mysql_fetch_field()<br />返回下一个表字段的类型。<br /><br />mysql_fetch_field_direct()<br />给 定字段编号，返回表字段的类型。<br /><br />mysql_fetch_fields()<br />返回所有字段结构的数组。<br /><br />mysql_fetch_lengths()<br />返 回当前行中所有列的长度。<br /><br />mysql_fetch_row()<br />从结果集中获取下一行<br /><br />mysql_field_seek()<br />将 列光标置于指定的列。<br /><br />mysql_field_count()<br />返回上次执行语句的结果列的数目。<br /><br />mysql_field_tell()<br />返 回上次mysql_fetch_field()所使用字段光标的位置。<br /><br />mysql_free_result()<br />释放结果集使用的 内存。<br />mysql_get_client_info()<br />以字符串形式返回客户端版本信息。<br /><br />mysql_get_client_version()<br />以 整数形式返回客户端版本信息。<br /><br />mysql_get_host_info()<br />返回描述连接的字符串。<br /><br />mysql_get_server_version()<br />以 整数形式返回服务器的版本号。<br /><br />mysql_get_proto_info()<br />返回连接所使用的协议版本。<br /><br />mysql_get_server_info()<br />返 回服务器的版本号。<br /><br />mysql_info()<br />返回关于最近所执行查询的信息。<br /><br />mysql_init()<br />获 取或初始化MYSQL结构。<br /><br />mysql_insert_id()<br />返回上一个查询为AUTO_INCREMENT列生成的ID。<br /><br />mysql_kill()<br />杀 死给定的线程。<br /><br />mysql_library_end()<br />最终确定MySQL C API库。<br /><br />mysql_library_init()<br />初 始化MySQL C API库。<br /><br />mysql_list_dbs()<br />返回与简单正则表达式匹配的数据库名称。<br /><br />mysql_list_fields()<br />返 回与简单正则表达式匹配的字段名称。<br /><br />mysql_list_processes()<br />返回当前服务器线程的列表。<br /><br />mysql_list_tables()<br />返 回与简单正则表达式匹配的表名。<br /><br />mysql_more_results()<br />检查是否还存在其他结果。<br /><br />mysql_next_result()<br />在 多语句执行过程中返回/初始化下一个结果。<br /><br />mysql_num_fields()<br />返回结果集中的列数。<br /><br />mysql_num_rows()<br />返 回结果集中的行数。<br /><br />mysql_options()<br />为mysql_connect()设置连接选项。<br /><br />mysql_ping()<br />检 查与服务器的连接是否工作，如有必要重新连接。<br /><br />mysql_query()<br />执行指定为&#8220;以Null终结的字符串&#8221;的SQL查询。<br /><br />mysql_real_connect()<br />连 接到MySQL服务器。<br /><br />mysql_real_escape_string()<br />考虑到连接的当前字符集，为了在SQL语句中使 用，对字符串中的特殊字符进行转义处理。<br /><br />mysql_real_query()<br />执行指定为计数字符串的SQL查询。<br /><br />mysql_refresh()<br />刷 新或复位表和高速缓冲。<br /><br />mysql_reload()<br />通知服务器再次加载授权表。<br />mysql_rollback()<br />回 滚事务。<br /><br />mysql_row_seek()<br />使用从mysql_row_tell()返回的值，查找结果集中的行偏移。<br /><br />mysql_row_tell()<br />返 回行光标位置。<br /><br />mysql_select_db()<br />选择数据库。<br /><br />mysql_server_end()<br />最 终确定嵌入式服务器库。<br /><br />mysql_server_init()<br />初始化嵌入式服务器库。<br /><br />mysql_set_server_option()<br />为 连接设置选项（如多语句）。<br /><br />mysql_sqlstate()<br />返回关于上一个错误的SQLSTATE错误代码。<br /><br />mysql_shutdown()<br />关 闭数据库服务器。<br /><br />mysql_stat()<br />以字符串形式返回服务器状态。<br /><br />mysql_store_result()<br />检 索完整的结果集至客户端。<br /><br />mysql_thread_id()<br />返回当前线程ID。<br /><br />mysql_thread_safe()<br />如 果客户端已编译为线程安全的，返回1。<br /><br />mysql_use_result()<br />初始化逐行的结果集检索。<br /><br />mysql_warning_count()<br />返 回上一个SQL语句的告警数。<br />&nbsp;<br /></td></tr></tbody></table></td></tr></tbody></table><p style="margin: 0px; padding: 0px; color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff;">&nbsp;</p><table border="0" cellspacing="0" cellpadding="5" style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; background-color: #ffffff; width: 694px;"><tbody><tr><td><strong>usidc5</strong></td><td align="right">2010-07-19 00:22</td></tr><tr bgcolor="#ffffff"><td colspan="2"><span style="font-size: small;"><span style="font-family: tahoma;"><span style="color: #222222;"><div>与MySQL交互时， 应用程序应使用该一般性原则：</div><div></div><div>1. 通过调用mysql_library_init()，初始化MySQL库。库可以是mysqlclient C客户端库，或mysqld嵌入式服务器库，具体情况取决于应用程序是否与&#8220;-libmysqlclient&#8221;或&#8220;-libmysqld&#8221;标志链接。</div><div></div><div>2. 通过调用mysql_init()初始化连接处理程序，并通过调用mysql_real_connect()连接到服务器。</div><div></div><div>3. 发出SQL语句并处理其结果。（在下面的讨论中，详细介绍了使用它的方法）。</div><div></div><div>4. 通过调用mysql_close()，关闭与MySQL服务器的连接。</div><div></div><div>5. 通过调用mysql_library_end()，结束MySQL库的使用。</div><div></div><div>调用 mysql_library_init()和mysql_library_end()的目的在于，为MySQL库提供恰当的初始化和结束处理。对于与客户 端库链接的应用程序，它们提供了改进的内存管理功能。如果不调用mysql_library_end()，内存块仍将保持分配状态（这不会增加应用程序使 用的内存量，但某些内存泄漏检测器将抗议它）。对于与嵌入式服务器链接的应用程序，这些调用会启动并停止服务器。</div><div></div><div>mysql_library_init() 和mysql_library_end()实际上是#define符号，这类符号使得它们等效于mysql_server_init()和 mysql_server_end()，但其名称更清楚地指明，无论应用程序使用的是mysqlclient或mysqld库，启动或结束MySQL库 时，应调用它们。对于早期的MySQL版本，可调用mysql_server_init()和mysql_server_end()取而代之。</div><div></div><div>如 果愿意，可省略对mysql_library_init()的调用，这是因为，必要时，mysql_init()会自动调用它。</div><div></div><div>要 想连接到服务器，可调用mysql_init()来初始化连接处理程序，然后用该处理程序（以及其他信息，如主机名、用户名和密码）调用 mysql_real_connect()。建立连接后，在低于5.0.3版的API中，mysql_real_connect()会将再连接标志 （MYSQL结构的一部分）设置为1，或在较新的版本中，将其设置为0。对于该标志，值&#8220;1&#8221;指明，如果因连接丢失而无法执行语句，放弃之前，会尝试再次 连接到服务器。从MySQL 5.0.13开始，可以在mysql_options()上使用MYSQL_OPT_RECONNECT选项，以控制再连接行为。完成连接后，调用 mysql_close()中止它。</div><div></div><div>当连接处于活动状态时，客户端或许会使用 mysql_query()或mysql_real_query()向服务器发出SQL查询。两者的差别在于，mysql_query()预期的查询为指 定的、由Null终结的字符串，而mysql_real_query()预期的是计数字符串。如果字符串包含二进制数据（其中可能包含Null字节），就 必须使用mysql_real_query()。</div><div></div><div>对于每个非SELECT查询（例如INSERT、 UPDATE、DELETE），通过调用mysql_affected_rows()，可发现有多少行已被改变（影响）。</div><div></div><div>对 于SELECT查询，能够检索作为结果集的行。注意，某些语句因其返回行，类似与SELECT。包括SHOW、DESCRIBE和EXPLAIN。应按照 对待SELECT语句的方式处理它们。</div><div></div><div>客户端处理结果集的方式有两种。一种方式是，通过调用 mysql_store_result()，一次性地检索整个结果集。该函数能从服务器获得查询返回的所有行，并将它们保存在客户端。第二种方式是针对客 户端的，通过调用mysql_use_result()，对&#8220;按行&#8221;结果集检索进行初始化处理。该函数能初始化检索结果，但不能从服务器获得任何实际行。</div><div></div><div>在 这两种情况下，均能通过调用mysql_fetch_row()访问行。通过 mysql_store_result()，mysql_fetch_row()能够访问以前从服务器获得的行。通过 mysql_use_result()，mysql_fetch_row()能够实际地检索来自服务器的行。通过调用 mysql_fetch_lengths()，能获得关于各行中数据大小的信息。</div><div></div><div>完成结果集操作 后，请调用mysql_free_result()释放结果集使用的内存。</div><div></div><div>这两种检索机制是互补 的。客户端程序应选择最能满足其要求的方法。实际上，客户端最常使用的是mysql_store_result()。</div><div></div><div>mysql_store_result() 的1个优点在于，由于将行全部提取到了客户端上，你不仅能连续访问行，还能使用mysql_data_seek()或mysql_row_seek()在 结果集中向前或向后移动，以更改结果集内当前行的位置。通过调用mysql_num_rows()，还能发现有多少行。另一方面，对于大的结果 集，mysql_store_result()所需的内存可能会很大，你很可能遇到内存溢出状况。</div><div></div><div>mysql_use_result() 的1个优点在于，客户端所需的用于结果集的内存较少，原因在于，一次它仅维护一行（由于分配开销较低，mysql_use_result()能更快）。它 的缺点在于，你必须快速处理每一行以避免妨碍服务器，你不能随机访问结果集中的行（只能连续访问行），你不知道结果集中有多少行，直至全部检索了它们为 止。不仅如此，即使在检索过程中你判定已找到所寻找的信息，也必须检索所有的行。</div><div></div><div>通过API，客户 端能够恰当地对查询作出响应（仅在必要时检索行），而无需知道查询是否是SELECT查询。可以在每次mysql_query()或 mysql_real_query()后，通过调用mysql_store_result()完成该操作。如果结果集调用成功，查询为SELECT，而且 能够读取行。如果结果集调用失败，可调用mysql_field_count()来判断结果是否的确是所预期的。如果 mysql_field_count()返回0，查询不返回数据（表明它是INSERT、UPDATE、DELETE等），而且不返回行。如果 mysql_field_count()是非0值，查询应返回行，但没有返回行。这表明查询是失败了的SELECT。关于如何实现该操作的示例，请参见关 于mysql_field_count()的介绍。</div><div></div><div>无论是 mysql_store_result()还是mysql_use_result()，均允许你获取关于构成结果集的字段的信息（字段数目，它们的名称和 类型等）。通过重复调用mysql_fetch_field()，可以按顺序访问行内的字段信息，或者，通过调用 mysql_fetch_field_direct()，能够在行内按字段编号访问字段信息。通过调用mysql_field_seek()，可以改变当 前字段的光标位置。对字段光标的设置将影响后续的mysql_fetch_field()调用。此外，你也能通过调用 mysql_fetch_fields()，一次性地获得关于字段的所有信息。</div><div></div><div>为了检测和通报错 误，MySQL提供了使用mysql_errno()和mysql_error()函数访问错误信息的机制。它们能返回关于最近调用的函数的错误代码或错 误消息，最近调用的函数可能成功也可能失败，这样，你就能判断错误是在何时出现的，以及错误是什么。</div></span></span></span></td></tr></tbody></table>转自：<a href="http://blog.csdn.net/ghost1236/article/details/5746905">http://blog.csdn.net/ghost1236/article/details/5746905</a><img src ="http://www.cppblog.com/flyinghare/aggbug/203664.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghare/" target="_blank">会飞的兔子</a> 2013-10-11 17:56 <a href="http://www.cppblog.com/flyinghare/archive/2013/10/11/203664.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>lua静态库的编译</title><link>http://www.cppblog.com/flyinghare/archive/2013/09/29/203495.html</link><dc:creator>会飞的兔子</dc:creator><author>会飞的兔子</author><pubDate>Sun, 29 Sep 2013 12:54:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghare/archive/2013/09/29/203495.html</guid><wfw:comment>http://www.cppblog.com/flyinghare/comments/203495.html</wfw:comment><comments>http://www.cppblog.com/flyinghare/archive/2013/09/29/203495.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghare/comments/commentRss/203495.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghare/services/trackbacks/203495.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: lua静态库的编译使用lua除了可以直接使用DLL之外，再有一个方法就是直接使用lua的静态lib，在这里我们将介绍使用静态lib的方法。1.编译静态lib我们这里使用的是lua-5.1.4.CN.7z版本，我们新建一个lib工程，注意不勾选&#8220;Pre-Compiled&nbsp;header&#8221;支持，然后将源码文件里src下目录文件全部拷贝到新建的工程目录下，除了print....&nbsp;&nbsp;<a href='http://www.cppblog.com/flyinghare/archive/2013/09/29/203495.html'>阅读全文</a><img src ="http://www.cppblog.com/flyinghare/aggbug/203495.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghare/" target="_blank">会飞的兔子</a> 2013-09-29 20:54 <a href="http://www.cppblog.com/flyinghare/archive/2013/09/29/203495.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Metatable In Lua 浅尝辄止</title><link>http://www.cppblog.com/flyinghare/archive/2013/09/29/203493.html</link><dc:creator>会飞的兔子</dc:creator><author>会飞的兔子</author><pubDate>Sun, 29 Sep 2013 10:39:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghare/archive/2013/09/29/203493.html</guid><wfw:comment>http://www.cppblog.com/flyinghare/comments/203493.html</wfw:comment><comments>http://www.cppblog.com/flyinghare/archive/2013/09/29/203493.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghare/comments/commentRss/203493.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghare/services/trackbacks/203493.html</trackback:ping><description><![CDATA[<p style="margin-top: 10px; margin-bottom: 10px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; background-color: #eeeedd;"><strong>什么是Metatable</strong>&nbsp;</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; background-color: #eeeedd;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Lua中Metatable这个概念, 国内将他翻译为元表. 元表为重定义Lua中任意一个对象(值)的默认行为提供了一种公开入口. 如同许多OO语言的操作符重载或方法重载. Metatable能够为我们带来非常灵活的编程方式.&nbsp;</p><p style="margin-top: 10px; margin-bottom: 10px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; background-color: #eeeedd;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;具体的说, Lua中每种类型的值都有都有他的默认操作方式, 如, 数字可以做加减乘除等操作, 字符串可以做连接操作, 函数可以做调用操作, 表可以做表项的取值赋值操作. 他们都遵循这些操作的默认逻辑执行, 而这些操作可以通过Metatable来改变. 如, 你可以定义2个表如何相加等.&nbsp;<br /><br /></p><p style="margin-top: 10px; margin-bottom: 10px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; background-color: #eeeedd;"></p><p style="margin-top: 10px; margin-bottom: 10px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; background-color: #eeeedd;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;看一个最简单的例子, 重定义了2个表的加法操作. 这个例子中将c的__add域改写后将a的Metatable设置为c, 当执行到加法的操作时, Lua首先会检查a是否有Metatable并且Metatable中是否存在__add域, 如果有则调用, 否则将检查b的条件(和a相同), 如果都没有则调用默认加法运算, 而table没有定义默认加法运算, 则会报错.</p><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; line-height: normal; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 895.71875px; word-break: break-all; background-color: #eeeeee;">--定义2个表<br />a&nbsp;=&nbsp;{5,&nbsp;6}<br />b&nbsp;=&nbsp;{7,&nbsp;8}<br />--用c来做Metatable<br />c&nbsp;=&nbsp;{}<br />--重定义加法操作<br />c.__add&nbsp;=&nbsp;function(op1,&nbsp;op2)<br />&nbsp;&nbsp;&nbsp;for&nbsp;_,&nbsp;item&nbsp;in&nbsp;ipairs(op2)&nbsp;do<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table.insert(op1,&nbsp;item)<br />&nbsp;&nbsp;&nbsp;end<br />&nbsp;&nbsp;&nbsp;return&nbsp;op1<br />end<br />--将a的Metatable设置为c<br />setmetatable(a,&nbsp;c)<br />--d现在的样子是{5,6,7,8}<br />d&nbsp;=&nbsp;a&nbsp;+&nbsp;b</div><p style="margin-top: 10px; margin-bottom: 10px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; background-color: #eeeedd;">有了个感性的认识后, 我们看看Metatable的具体特性.<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Metatable并不神秘, 他只是一个普通的table, 在table这个数据结构当中, Lua定义了许多重定义这些操作的入口. 他们均以双下划线开头为table的域, 如上面例子的__add. 当你为一个值设置了Metatable, 并在Metatable中设置了重写了相应的操作域, 在这个值执行这个操作的时候就会触发重写的自定义操作. 当然每个操作都有每个操作的方法格式签名, 如__add会将加号两边的两个操作数做为参数传入并且要求一个返回值. 有人把这样的行为比作事件, 当xx行为触发会激活事件自定义操作.</p><fieldset style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; line-height: normal; background-color: #eeeedd;"><legend>Metatable中定义的操作</legend>add, sub, mul, div, mod, pow, unm, concat, len, eq, lt, le, tostring, gc, index, newindex, call...</fieldset><p style="margin-top: 10px; margin-bottom: 10px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; background-color: #eeeedd;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在Lua中任何一个值都有Metatable, 不同的值可以有不同的Metatable也可以共享同样的Metatable, 但在Lua本身提供的功能中, 不允许你改变除了table类型值外的任何其他类型值的Metatable, 除非使用C扩展或其他库. setmetatable和getmetatable是唯一一组操作table类型的Metatable的方法.<br /><br /><br /><strong>Metatable与面向对象</strong><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Lua是个面向过程的语言, 但通过Metatable可以模拟出面向对象的样子. 其关键就在于__index这个域. 他提供了表的索引值入口. 这很像重写C#中的索引器, 当表要索引一个值时如table[key], Lua会首先在table本身中查找key的值, 如果没有并且这个table存在一个带有__index属性的Metatable, 则Lua会按照__index所定义的函数逻辑查找. 仔细想想, 这不正为面向对象中的核心思想继承, 提供了实现方式么. Lua中实现面向对象的方式非常多, 但无论哪种都离不开__index.<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这个例子中我使用了Programming In Lua中的实现OO的方式, 建立了Bird(鸟)对象, 拥有会飞的属性, 其他鸟对象基于此原型, Ostrich(鸵鸟)是鸟的一种但不会飞. 结果很明显, Bird和Ostrich分别有独立的状态.<br /><br /></p><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; line-height: normal; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 895.71875px; word-break: break-all; background-color: #eeeeee;">local&nbsp;Bird&nbsp;=&nbsp;{CanFly&nbsp;=&nbsp;true}<br /><br />function&nbsp;Bird:New()<br />&nbsp;&nbsp;&nbsp;&nbsp;local&nbsp;b&nbsp;=&nbsp;{}<br />&nbsp;&nbsp;&nbsp;&nbsp;setmetatable(b,&nbsp;self)<br />&nbsp;&nbsp;&nbsp;&nbsp;self.__index&nbsp;=&nbsp;self<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;b<br />end<br /><br />local&nbsp;Ostrich&nbsp;=&nbsp;Bird:New()&nbsp;--Bird.CanFly&nbsp;is&nbsp;true,&nbsp;Ostrich.CanFly&nbsp;is&nbsp;true<br />Ostrich.CanFly&nbsp;=&nbsp;false&nbsp;--Bird.CanFly&nbsp;is&nbsp;true,&nbsp;Ostrich.CanFly&nbsp;is&nbsp;false</div><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; line-height: normal; background-color: #eeeedd;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; line-height: normal; background-color: #eeeedd;">__newindex与__index相对应, 在对table的key做更新时触发. 可以使用rawset和rawget对table的key操作来跳过这些事件的触发.&nbsp;</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; line-height: normal; background-color: #eeeedd;" /><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; line-height: normal; background-color: #eeeedd;" /><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; line-height: normal; background-color: #eeeedd;" /><strong style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; line-height: normal; background-color: #eeeedd;">调用与截获</strong><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; line-height: normal; background-color: #eeeedd;" /><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; line-height: normal; background-color: #eeeedd;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; line-height: normal; background-color: #eeeedd;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java与C#中需要费不少周折来实现动态代理和AOP, 类似这样的功能在Lua中确很简单, 虽然被限制了很多, 但你依然能够感受到Lua的灵活. 这就是__call操作, 当值被调用时触发.&nbsp;</span><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; line-height: normal; background-color: #eeeedd;" /><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; line-height: normal; background-color: #eeeedd;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; line-height: normal; background-color: #eeeedd;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里我将table类型的a做了一个函数方式的调用a(), 会触发__call. 另一个应用示例可以参见我的另一篇文章</span><a href="http://www.cnblogs.com/simonw/archive/2006/12/20/597986.html" style="color: #770000; text-decoration: none; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; line-height: normal; background-color: #eeeedd;">Lua中实现类似C#的事件机制<br /></a><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; line-height: normal; background-color: #eeeedd;" /><div style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; line-height: normal; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 895.71875px; word-break: break-all; background-color: #eeeeee;">a&nbsp;=&nbsp;{}<br />function&nbsp;a:Func()<br />&nbsp;&nbsp;&nbsp;print("simonw")<br />end<br />c&nbsp;=&nbsp;{}<br />c.__call&nbsp;=&nbsp;function(t,&nbsp;)<br />&nbsp;&nbsp;&nbsp;print("Start")<br />&nbsp;&nbsp;&nbsp;t.Func()<br />&nbsp;&nbsp;&nbsp;print("End")<br />end<br />setmetatable(a,&nbsp;c)<br />a()<br />--[[<br />Start<br />simonw<br />End<br />]]</div><br style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; line-height: normal; background-color: #eeeedd;" /><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; line-height: normal; background-color: #eeeedd;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里的示例都是以最简单的方式展现, 以便能更清晰的描述核心, 更多的资料以及具体应用请参考Programming In Lua和Lua参考手册.</span><br />转自：<a href="http://www.cnblogs.com/simonw/archive/2007/01/17/622032.html">http://www.cnblogs.com/simonw/archive/2007/01/17/622032.html</a><img src ="http://www.cppblog.com/flyinghare/aggbug/203493.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghare/" target="_blank">会飞的兔子</a> 2013-09-29 18:39 <a href="http://www.cppblog.com/flyinghare/archive/2013/09/29/203493.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自己编译lua5.2.1</title><link>http://www.cppblog.com/flyinghare/archive/2013/09/29/203491.html</link><dc:creator>会飞的兔子</dc:creator><author>会飞的兔子</author><pubDate>Sun, 29 Sep 2013 09:43:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghare/archive/2013/09/29/203491.html</guid><wfw:comment>http://www.cppblog.com/flyinghare/comments/203491.html</wfw:comment><comments>http://www.cppblog.com/flyinghare/archive/2013/09/29/203491.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghare/comments/commentRss/203491.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghare/services/trackbacks/203491.html</trackback:ping><description><![CDATA[<p style="padding: 0px; margin: 12px 0px; line-height: 25px; letter-spacing: 1px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">官方发布<span style="padding: 0px; margin: 0px;">库还是5.1.4的，而且由于失误导致必须带着2个dll文件。最新的</span>源代码是5.2.1的，我们自己编译吧，目标是静态库，免得带着 dll 满世界跑。</p><p style="padding: 0px; margin: 12px 0px; line-height: 25px; letter-spacing: 1px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">下载源代码：<a href="http://www.lua.org/ftp/lua-5.2.1.tar.gz" rel="nofollow" style="padding: 0px; margin: 0px; color: #4466bb; outline: 0px;">http://www.lua.org/ftp/lua-5.2.1.tar.gz</a></p><p style="padding: 0px; margin: 12px 0px; line-height: 25px; letter-spacing: 1px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">解压备用。<span style="padding: 0px; margin: 0px;"><s style="padding: 0px; margin: 0px;">这里说句题外话，lauxlib.h 和&nbsp;lauxlib.c 我认为也应该是官方的失误，本意应该是 luaxlib.h 和 luaxlib.c 吧？</s></span></p><p style="padding: 0px; margin: 12px 0px; line-height: 25px; letter-spacing: 1px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">新建一个 static library 工程，把解压得到的目录下的src子目录中的所有.h和.c文件拷贝到新工程目录下。</p><p style="padding: 0px; margin: 12px 0px; line-height: 25px; letter-spacing: 1px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">工程中删除自动生成的 main.c 文件，添加进<span style="padding: 0px; margin: 0px; color: #e53333;">除lua.c、luac.c和</span><span style="padding: 0px; margin: 0px; color: #e53333;">lua.hpp</span><span style="padding: 0px; margin: 0px; color: #e53333;">外</span>的所有.h和.c文件。</p><p style="padding: 0px; margin: 12px 0px; line-height: 25px; letter-spacing: 1px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;"><span style="padding: 0px; margin: 0px;">编译，得到&nbsp;</span><span style="padding: 0px; margin: 0px;">libLua.a&nbsp;</span><span style="padding: 0px; margin: 0px;">即是库。注意，如果你没有重设过输出目录，这个 liblua.a 文件应该在你的源代码目录里。</span></p><p style="padding: 0px; margin: 12px 0px; line-height: 25px; letter-spacing: 1px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;"><span style="padding: 0px; margin: 0px;">然后把&nbsp;<span style="padding: 0px; margin: 0px;">libLua.a 放到编译器的 Lib</span>&nbsp;目录下，把&nbsp;<span style="padding: 0px; margin: 0px; line-height: 21px;">&nbsp;lauxlib.h、lua.h、luaconf.h、lualib.h 放到编译器的 include 目录下（C++用户再添加个&nbsp;lua.hpp），最好新建个 lua</span>&nbsp;子目录存放头文件更清晰。</span></p><p style="padding: 0px; margin: 12px 0px; line-height: 25px; letter-spacing: 1px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;"><br style="padding: 0px; margin: 0px;" />其实最关键就是除开不必要的文件，实际上：<br style="padding: 0px; margin: 0px;" />编译 lua（lua.exe，解析器） 时删除luac.c，加入lua.c。<br style="padding: 0px; margin: 0px;" />编译 luac（luac.exe，字节码编译器）时删除lua.c，加入luac.c。<br style="padding: 0px; margin: 0px;" />编译 lib和dll（liblua.a和lua.dll，库）时把lua.c和luac.c都删除。</p><p style="padding: 0px; margin: 12px 0px; line-height: 25px; letter-spacing: 1px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;"><br style="padding: 0px; margin: 0px;" /></p><p style="padding: 0px; margin: 12px 0px; line-height: 25px; letter-spacing: 1px; color: #333333; font-family: 微软雅黑, Verdana, sans-serif, 宋体; background-color: #ffffff;">另外要注意：lua 5.2.1 创建一个指向Lua解释器的指针的函数&nbsp;<span style="padding: 0px; margin: 0px;">lua_open 修改</span>为 luaL_newstate。<br style="padding: 0px; margin: 0px;" />即把工程从lua5.1库转到5.2库时，在<span style="padding: 0px; margin: 0px;">调用&nbsp;</span>lua_open() 的地方都<span style="padding: 0px; margin: 0px;">需要修改</span>为 luaL_newstate()。</p><br />转自：<a href="http://my.oschina.net/u/580100/blog/108468">http://my.oschina.net/u/580100/blog/108468</a><img src ="http://www.cppblog.com/flyinghare/aggbug/203491.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghare/" target="_blank">会飞的兔子</a> 2013-09-29 17:43 <a href="http://www.cppblog.com/flyinghare/archive/2013/09/29/203491.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>失效迭代器（Invalidating Iterators）</title><link>http://www.cppblog.com/flyinghare/archive/2013/09/24/203415.html</link><dc:creator>会飞的兔子</dc:creator><author>会飞的兔子</author><pubDate>Tue, 24 Sep 2013 13:12:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghare/archive/2013/09/24/203415.html</guid><wfw:comment>http://www.cppblog.com/flyinghare/comments/203415.html</wfw:comment><comments>http://www.cppblog.com/flyinghare/archive/2013/09/24/203415.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghare/comments/commentRss/203415.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghare/services/trackbacks/203415.html</trackback:ping><description><![CDATA[<div id="article_content" style="margin: 20px 0px 0px; line-height: 26px; font-family: Arial; color: #333333; background-color: #ffffff;"><div style="font-family: Arial, Verdana, sans-serif; font-size: 12px; word-break: break-word; word-wrap: break-word; margin: 5px; overflow-y: auto;">当一个容器变化时，指向该容器中元素的迭代器可能失效。这使得在迭代器变化期间改变容器容易出现问题。在这方面，不同的容器提供不同的保障：<br />vectors: 引起内存重新分配的插入运算使所有迭代器失效，插入也使得插入位置及其后位置的迭代器失效，删除运算使得删除位置及其后位置的迭代器失效.<br />vector的push_back操作 可能没事，但是一旦引发内存重分配，所有迭代器都会失效；<br />vector的insert操作 插入点之后的所有迭代器失效；但一旦引发内存重分配，所有迭代器都会失效；<br />vector的erase操作 插入点之后的所有迭代器失效；<br />vector的reserve操作 所有迭代器失效（因为它导致内存重分配）；<br /><br />list/map: 插入不会使得任何迭代器失效；删除运算使指向删除位置的迭代器失效，但是不会失效其他迭代器.<br />deque的insert操作 所有迭代器失效；<br />deque的erase操作 所有迭代器失效；<br /><br />1. 对于<span style="color: #ff0000;">关联容器(如map, set, multimap,multiset)，</span>删除当前的iterator，仅仅会使当前的iterator失效，只要在erase时，递增当前iterator即可。这是因为map之类的容器，使用了红黑树来实现，插入、删除一个结点不会对其他结点造成影响。erase迭代器只是被删元素的迭代器失效，但是返回值为void，所以要采用<span style="color: #ff0000;">erase(iter++)</span>的方式删除迭代器。<br />for (iter = cont.begin(); it != cont.end();)<br />{<br />&nbsp; &nbsp;(*iter)-&gt;doSomething();<br />&nbsp; &nbsp;if (shouldDelete(*iter))<br />&nbsp; &nbsp; &nbsp; cont.erase(iter++);<br />&nbsp; &nbsp;else<br />&nbsp; &nbsp; &nbsp; ++iter;<br />}<br /><br />2. 对于<span style="color: #ff0000;">序列式容器(如vector,deque)</span>，删除当前的iterator会使后面所有元素的iterator都失效。这是因为vetor,deque使用了连续分配的内存，删除一个元素导致后面所有的元素会向前移动一个位置。所以不能使用erase(iter++)的方式，还好erase方法可以返回下一个有效的iterator。<br />for (iter = cont.begin(); iter != cont.end();)<br />{<br />&nbsp; &nbsp;(*it)-&gt;doSomething();<br />&nbsp; &nbsp;if (shouldDelete(*iter))<br />&nbsp; &nbsp; &nbsp;&nbsp;<span style="color: #ff0000;">iter = cont.erase(iter);&nbsp;</span><br />&nbsp; &nbsp;else<br />&nbsp; &nbsp; &nbsp; ++iter;<br />}<br />3. 对于<span style="color: #ff0000;">list</span>来说，它使用了不连续分配的内存，并且它的erase方法也会返回下一个有效的iterator，因此<span style="color: #ff0000;">上面两种方法都可以使用。</span><br /><br />删除数组中某个元素后连续重复的元素，例如 1，1，2，3，3，1，1，1，4，0 ---&gt; 1， 2，3，1，4，0。给出问题的一个正确的实现：<br /><div bg_cpp"="" style="width: 677.15625px;"><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">iostream</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;&nbsp;<br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">vector</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;&nbsp;<br /></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; ">&nbsp;std;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;argc,&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;argv[])&nbsp;&nbsp;<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;a[]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">4</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">};&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;size&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(a)</span><span style="color: #000000; ">/</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(a[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]);&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;vec(a,&nbsp;a</span><span style="color: #000000; ">+</span><span style="color: #000000; ">size);&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">::iterator&nbsp;iter&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;vec.begin();&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;previous&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">iter;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">iter;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(;&nbsp;iter&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;vec.end();)&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">iter&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;previous)&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iter&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;vec.erase(iter);&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;previous&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">iter;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">iter;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(iter&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;vec.begin();&nbsp;iter&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;vec.end();&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">iter)&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">iter&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;endl;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;&nbsp;<br />} &nbsp;</span></div></div>PS. 不过实际上这个问题，用vector来实现不是很适合，因为每次删除一个元素，都会引起vector的一个resize操作。resize的时间复杂度是O(n)，整个的resize操作要花费O(n^2)。最好是选择list最为容器，list最适合那些需要在容器中间做插入、删除的例子。</div><div></div></div><br />转自：<a href="http://blog.csdn.net/heyutao007/article/details/6937236">http://blog.csdn.net/heyutao007/article/details/6937236</a><img src ="http://www.cppblog.com/flyinghare/aggbug/203415.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghare/" target="_blank">会飞的兔子</a> 2013-09-24 21:12 <a href="http://www.cppblog.com/flyinghare/archive/2013/09/24/203415.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>标准C/C++程序通过gSOAP调用WebService</title><link>http://www.cppblog.com/flyinghare/archive/2012/08/15/187267.html</link><dc:creator>会飞的兔子</dc:creator><author>会飞的兔子</author><pubDate>Wed, 15 Aug 2012 04:26:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghare/archive/2012/08/15/187267.html</guid><wfw:comment>http://www.cppblog.com/flyinghare/comments/187267.html</wfw:comment><comments>http://www.cppblog.com/flyinghare/archive/2012/08/15/187267.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghare/comments/commentRss/187267.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghare/services/trackbacks/187267.html</trackback:ping><description><![CDATA[<div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; ">一、 环境准备</div><blockquote style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; "><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">在本文中，所有程序均在Linux下开发完成，经测试能够正常运行。&nbsp;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />在开发过程中，我们需要用到gSOAP，可以从以下网址下载获得：<a title="http://www.cs.fsu.edu/~engelen/soap.html" href="http://www.cs.fsu.edu/~engelen/soap.html" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #015f91; text-decoration: none; ">[url]http://www.cs.fsu.edu/~engelen/soap.html[/url]</a>&nbsp;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />我下载的是gsoap_2.7.12.tar.gz</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">下载下来解压缩，按正常安装过程进行编译、安装。</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "># tar zxvf gsozp_2.7.12.tar.gz&nbsp;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " /># cd gsoap_2.7.12&nbsp;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " /># ./configure &#8211;-prefix=/usr/local/gSOAP（指定安装路径）&nbsp;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " /># make&nbsp;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " /># make install</div></blockquote><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; ">二、 生成相关文件</div><blockquote style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; "><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">1、通过WSDL文档，生成C/C++头文件</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "># /usr/local/gSOAP/bin/wsdl2h &#8211;c &#8211;o TestHeader.h&nbsp;<a href="http://192.168.0.151:8080/services/TestWS?wsdl" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #015f91; text-decoration: none; ">[url]http://192.168.0.151:8080/services/TestWS?wsdl[/url]</a></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">2、拷贝gSOAP源代码中import文件夹下的stlvector.h文件到TestHeader.h同一目录，如果在解析WSDL文档时使用了-s参数，即不使用STL，则不需要拷贝这一文件。</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">3、解析TestHeader.h文件，生成存根程序</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "># /usr/local/gSOAP/bin/soapcpp2 &#8211;c &#8211;C TestHeader.h</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">命令中参数-c代表生成标准C程序，若没有这个参数，则生成C++程序。&nbsp;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />命令中参数-C代表仅生成客户端程序，若没有这个参数，则默认生成客户端和服务端程序。</div></blockquote><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; ">三、 进行相关开发</div><blockquote style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; "><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">1、新建工程</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">新建一个C的工程，并将刚刚生成的文件拷贝到工程中，设置工程属性，包含gSOAP源代码目录，链接属性处，需要包含文件libgsoap.a（使用C语言开发）或者libgsoap++.a（使用C++开发）。</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">2、代码开发</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">WebService的具体调用方式可以参见生成的soapStub.h文件。</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">Demo代码（调用WebService的addUser）：</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><div style="padding-top: 4px; padding-right: 4px; padding-bottom: 4px; padding-left: 4px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; border-right-color: #cccccc; border-right-width: 1px; border-right-style: solid; border-top-color: #cccccc; border-top-width: 1px; border-top-style: solid; font-size: 10pt; border-left-color: #cccccc; border-left-width: 1px; border-left-style: solid; width: 705px; color: #000000; word-break: break-all; line-height: 16px; border-bottom-color: #cccccc; border-bottom-width: 1px; border-bottom-style: solid; font-family: verdana, 宋体; background-color: #eeeeee; ">#include &#8220;soapH.h&#8221;&nbsp;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />#include &#8220;TestHeaderHttpBinding.nsmap&#8221;&nbsp;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " /><br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />int main()&nbsp;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />{&nbsp;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct soap clientSOAP;&nbsp;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct _ns1__addUser addUserMsg;&nbsp;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct _ns1__addUserResponse addUserResponse;&nbsp;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " /><br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;soap_init(&amp;clientSOAP);&nbsp;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " /><br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addUserMsg.in0 = &#8220;test&#8221;;&nbsp;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addUserMsg.in1 = &#8220;test&#8221;;&nbsp;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addUserMsg.in2 = &#8220;test&#8221;;&nbsp;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " /><br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(soap_call___ns1__addUser(&amp;clientSOAP, NULL, NULL, &amp;addUserMsg, &amp;addUserResponse) == SOAP_OK)&nbsp;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&#8220;%s\n&#8221;, *addUserResponse.out);&nbsp;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&#8220;Error\n&#8221;);&nbsp;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;soap_destroy(&amp;clientSOAP);&nbsp;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;soap_end(&amp;clientSOAP);&nbsp;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;soap_done(&amp;clientSOAP);&nbsp;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " /><br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;&nbsp;<br style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " />}</div></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">正常的话，编译运行后能够在控制台看到WebService返回的处理结果。</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">在这段代码中，_ns1__addUser、_ns1__addUserResponse、soap_call___ns1__addUser都是在soapStub.h中获得，具体应用可能会根据不同的服务端生成不同的代码。</div></blockquote><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 15px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #555555; font-family: 宋体, 'Arial Narrow', arial, serif; line-height: 28px; background-color: #ffffff; ">本文出自 &#8220;<a href="http://commandos.blog.51cto.com/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #015f91; text-decoration: none; ">玄武&#183;巴依</a>&#8221; 博客，请务必保留此出处<a href="http://commandos.blog.51cto.com/154976/130652" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: #015f91; text-decoration: none; ">http://commandos.blog.51cto.com/154976/130652</a></p>转自：<a href="http://commandos.blog.51cto.com/154976/130652/">http://commandos.blog.51cto.com/154976/130652/</a><img src ="http://www.cppblog.com/flyinghare/aggbug/187267.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghare/" target="_blank">会飞的兔子</a> 2012-08-15 12:26 <a href="http://www.cppblog.com/flyinghare/archive/2012/08/15/187267.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>跑步的好处</title><link>http://www.cppblog.com/flyinghare/archive/2012/05/15/174954.html</link><dc:creator>会飞的兔子</dc:creator><author>会飞的兔子</author><pubDate>Tue, 15 May 2012 03:36:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghare/archive/2012/05/15/174954.html</guid><wfw:comment>http://www.cppblog.com/flyinghare/comments/174954.html</wfw:comment><comments>http://www.cppblog.com/flyinghare/archive/2012/05/15/174954.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghare/comments/commentRss/174954.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghare/services/trackbacks/174954.html</trackback:ping><description><![CDATA[<span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; ">1.告别臃肿身材。&nbsp;</span><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; ">许多人开始跑步就是因为减肥，跑步确实减肥的最好运动方式，跑步每分钟比起其他运动燃烧更多的卡路里。&nbsp;</span><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; ">2.防止你的骨骼，肌肉退化。&nbsp;</span><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; ">我们的骨骼是和你的身体需求相互协调的。长期坐在显示器前的我们让我们的骨骼越来越脆弱。而长期的，经常的运动会使你的骨骼保持健康。更进一步说就是防止我们身体内部老化的更快。经常的高强度锻炼，例如跑步，被证明可以促进人体荷尔蒙的生长，荷尔蒙就是那些名人为了看起来更年轻而持续注射的药剂。&nbsp;</span><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; ">3.抵抗疾病&nbsp;</span><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; ">跑步可以降低得中风和乳腺癌的风险。经常的跑步已经成为医生对那些容易引发或在已经处在早期的骨质疏松，糖尿病，高血压病人的治疗建议。&nbsp;</span><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; ">4.维持并提高总体的身体水平。&nbsp;</span><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; ">跑步是是人们可以采取的最好的锻炼身体的运动。它可以提高胆固醇,降低血液凝块的危险，锻炼你的50%的经常处于闲置状态的肺。跑步还可以通过增加你的淋巴细胞来增强你的免疫力。&nbsp;</span><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; ">5.让你更加自信。&nbsp;</span><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; ">慢跑像其他一些单人运动一样，它可以增强你的自信心。跑步让你完成一次又一次的尝试，让你变得更强大，更加肯定自己。他让你真实的越过某个山峰，穿过某个障碍.在意识到你的身体已经更加强壮，更加有用，你会得到被赋予力量和自由的感觉。自信更是那些通过跑步成功的减肥并得到自己心中理想身材的跑步者的宝贵财富。&nbsp;</span><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; ">6.放松自己，减轻压力。&nbsp;</span><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; ">慢跑可以转移聂注意力，沐浴在路旁的风景中，你的烦恼一定会消失殆尽。&nbsp;</span><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; ">长跑适合那些正处在一堆头疼，恼人的烦心事的人。还有比在两个小时的长跑中，清理的的头脑、舒缓自己的神经更好的主意了吗。&nbsp;</span><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; ">如果你此时觉得异常压抑，何不快跑一下呢，之后你会一个好的心情。&nbsp;</span><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; ">7.著名的&#8220;跑步者高峰体验&#8221;&nbsp;</span><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; ">包括释放压力，慢跑被证明提高你的心态。跑步，特别在户外和旅行中,会使身体释放一种物质让你产生一种幸福愉悦感（跑步者高峰体验）或者就是快乐的感觉。跑步已经被采用了多年来治疗临床抑郁症，上瘾等。更少的压力，更少的压抑，更少的疲劳，更少的混乱，经过一段时间的经常跑步，病人很快就有了变化。跑步让他们有了注意的对象，让他们看到了除了他们消极的状态和沉溺的事务，还有一些美好的东西的存在。&nbsp;</span><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; ">8.锻炼你的头脑。&nbsp;</span><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; ">像对你的身体有所帮助一样，跑步同样对你的头脑很有帮助。通过在跑步中克服一系列的障碍，你学会了专注和决心.在经历那些你几乎要放弃的长跑或其他项目后你会发现：你在跑步过程中产生的意志和体魄的增强让你在其他方面有着同样的专注和决心。&nbsp;</span><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; ">9.增强合作精神。&nbsp;</span><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; ">又是一个非常值得去做的好处。这点好处或许让很多人感到惊奇，因为人们认为跑步不可能得到这种益处，仅仅由于跑步是单人运动。但是跑步确实有时涉及到互相合作。旅行跑步，特别是在那些路况不好的地方，需要极大的合作意识。这些路面经常会有一些 障碍如石头、灌木让跑步进行的很困难。&nbsp;</span><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; ">10.随时随地，简单。&nbsp;</span><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; ">不是很多的运动可以在任何地方，几乎不需要设备的。我敢肯定古代希腊人会争辩说甚至是鞋子和衣服也不需要。今天，我们只是需要一双好点的跑步鞋然后就可以出发了。从市中心到郊区,整个世界的地方等待你的探索。经常出差吗？你的旅行箱里肯定会有空间来装你的运动鞋的。这个世界就是你的健身房，去再次发现它吧。&nbsp;</span><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; ">Here are some tips for how to make running a practice:&nbsp;</span><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; ">Be consistent in your running program. Plan your weekly workout schedule and stick to it. This will teach you persistence.&nbsp;</span><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; ">Know which focuses you'll use during every run. This will teach you planning and mindfulness, and improve your mind/body connection.&nbsp;</span><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; ">Constantly practice relaxing your muscles. This will help to relieve tension and train you to relax no matter what activity you're doing.&nbsp;</span><br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; " /><span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; ">At the end of your run, spend a few minutes doing an "end-of-run review." Ask yourself how well you did with keeping your focuses, how your body felt during the run. What did you come away with that will help your next run? Then, the next time you go out for a run, you'll have something to work on that you brought forward from your last run. In this way you'll build a healthy, growing and sustainable running program.&nbsp;</span>&nbsp;<br />转自：<a href="http://www.douban.com/group/topic/20749798/">http://www.douban.com/group/topic/20749798/</a><img src ="http://www.cppblog.com/flyinghare/aggbug/174954.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghare/" target="_blank">会飞的兔子</a> 2012-05-15 11:36 <a href="http://www.cppblog.com/flyinghare/archive/2012/05/15/174954.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC的MySQL编程</title><link>http://www.cppblog.com/flyinghare/archive/2012/03/13/167793.html</link><dc:creator>会飞的兔子</dc:creator><author>会飞的兔子</author><pubDate>Tue, 13 Mar 2012 10:00:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghare/archive/2012/03/13/167793.html</guid><wfw:comment>http://www.cppblog.com/flyinghare/comments/167793.html</wfw:comment><comments>http://www.cppblog.com/flyinghare/archive/2012/03/13/167793.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghare/comments/commentRss/167793.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghare/services/trackbacks/167793.html</trackback:ping><description><![CDATA[<br /><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">一、在你的程序中使用数据库是不错的注意。如果已经有可用的MySQL服务器，在VC中可以按照如下方法实现与数据库的连接。<br />1、找来MySQL(Win32)安装目录下的include文件夹，将其添加到VC头文件目录列表中；<br />（VC6 -&gt; Options -&gt;&nbsp;Directories -&gt; 加入此目录）<br />（VC2005 -&gt;&nbsp;工具 -&gt;&nbsp;选择 -&gt;项目和解决方案 -&gt; VC++目录 -&gt;&nbsp;显示以下內容的目录 -&gt;&nbsp;包含文件 -&gt; 加入此目录）2、找来MySQL(Win32)安装目录下的lib文件夹，将&nbsp;其添加到VC库文件目录列表中；<br />（VC6 -&gt; Options -&gt;&nbsp;Directories -&gt; 加入此目录）<br />（VC2005 -&gt;&nbsp;工具 -&gt;选择 -&gt;&nbsp;项目和解決方案 -&gt; VC++目录 -&gt;&nbsp;显示以下內容的目录 -&gt;&nbsp;库文件 -&gt; 加入此目录，注意是lib/debug或lib/opt）<br />3、新建一个工程，参考如下代码：<br />// mysql.cpp : Defines the entry point for the console application.<br /><br />#include "stdafx.h"<br />#include &lt;stdio.h&gt;<stdio.h></stdio.h><br />#include &lt;winsock.h&gt;<winsock.h></winsock.h><br />#include &lt;mysql.h&gt;<mysql.h></mysql.h><br />#include &lt;windows.h&gt;<br />#pragma comment(lib, "libmysql.lib")<br />int main(int argc, char* argv[])<br />{<br />&nbsp;&nbsp;&nbsp; unsigned short Port = 3306;<br />&nbsp;&nbsp;&nbsp; char *IPAddress = "192.168.31.56";<br />&nbsp;&nbsp;&nbsp; char *UserName = "root";<br />&nbsp;&nbsp;&nbsp; char *Password = "";<br />&nbsp;&nbsp;&nbsp; char *DBName = "SAS_1_2_0";<br />&nbsp;&nbsp;&nbsp; printf("Start... ");<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; MYSQL *ssock;<br />&nbsp;&nbsp;&nbsp; //char execsql[500];<br />&nbsp;&nbsp;&nbsp; ssock = (MYSQL *)malloc(sizeof(MYSQL));&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; //在某些版本中，不需要该初始化工作，可观看mysql.H以及readme<br />&nbsp;&nbsp;&nbsp; mysql_init(ssock);<br />&nbsp;&nbsp;&nbsp; if(ssock == NULL)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("EROR: MySQL ssock init error. ");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;<br />&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp; //连接到指定的数据库<br />&nbsp;&nbsp;&nbsp; ssock = mysql_real_connect(ssock, IPAddress, UserName, Password, NULL, Port, NULL, 0);<br />&nbsp;&nbsp;&nbsp; if(!ssock)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("conn fail... ");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //memcpy(eee, mysql_error(ssock), 20);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //fprintf(stderr, "Failed to connect to database: Error: %s ", mysql_error(ssock));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //printf("%c ", eee);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unsigned int mtint = mysql_errno(ssock);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //printf("%d ");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; if(mysql_select_db(ssock, DBName) != 0)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("select db error. ");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return FALSE;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; printf("version=%d ", mysql_get_server_version(ssock));<br />&nbsp;&nbsp;&nbsp; //exec my execsql string<br />&nbsp;&nbsp;&nbsp; //sprintf(execsql,"create table girls (name char(10),age int)");<br />&nbsp;&nbsp;&nbsp; //mysql_real_query(ssock,execsql,strlen(execsql));<br />&nbsp;&nbsp;&nbsp; mysql_close(ssock);<br />&nbsp;&nbsp;&nbsp; printf("End... ");<br />&nbsp;&nbsp;&nbsp; return TRUE;<br />}&nbsp;</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">二、怎样用c/c++编程连接mysql数据库<br />&nbsp;&nbsp;&nbsp;&nbsp; 执行一个查询有以下几个步骤要做。首先执行一个查询，然后保存结果，&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; &nbsp; 得到的是一个子集。这里是一个小例子：&nbsp;&nbsp;&nbsp;<br />&nbsp; #include&nbsp;&nbsp;&nbsp;&lt;stdio.h&gt;&nbsp;&nbsp;<br />&nbsp; #include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp; #include&nbsp;&nbsp; &lt;mysql.h&gt;<br />&nbsp; MYSQL&nbsp;&nbsp; mysql;&nbsp;&nbsp;&nbsp;<br />&nbsp; MYSQL_RES&nbsp;&nbsp; *res;&nbsp;&nbsp;&nbsp;<br />&nbsp; MYSQL_ROW&nbsp;&nbsp; row;&nbsp;&nbsp;&nbsp;<br />&nbsp; void&nbsp;&nbsp; exiterr(int&nbsp;&nbsp; exitcode)&nbsp;&nbsp;&nbsp;<br />&nbsp; {&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf(&nbsp;&nbsp; stderr,&nbsp;&nbsp; "%s/n",&nbsp;&nbsp; mysql_error(&amp;mysql)&nbsp;&nbsp; );&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;exit(&nbsp;&nbsp; exitcode&nbsp;&nbsp; );&nbsp;&nbsp;&nbsp;<br />&nbsp; }&nbsp;&nbsp;&nbsp;<br />&nbsp; int&nbsp;&nbsp; main()&nbsp;&nbsp;&nbsp;<br />&nbsp; {&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uint&nbsp;&nbsp; i&nbsp;&nbsp; =&nbsp;&nbsp; 0;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp;&nbsp; (!(mysql_connect(&amp;mysql,"host","username","password")))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exiterr(1);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp;&nbsp; (mysql_select_db(&amp;mysql,"payroll"))&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;exiterr(2);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp;&nbsp; (mysql_query(&amp;mysql,"SELECT&nbsp;&nbsp; name,rate&nbsp;&nbsp; FROM&nbsp;&nbsp; emp_master"))&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;exiterr(3);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;if&nbsp;&nbsp; (!(res&nbsp;&nbsp; =&nbsp;&nbsp; mysql_store_result(&amp;mysql)))&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;exiterr(4);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((row&nbsp;&nbsp; =&nbsp;&nbsp; mysql_fetch_row(res)))&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for&nbsp;&nbsp; (i=0&nbsp;&nbsp; ;&nbsp;&nbsp; i&nbsp;&nbsp; &lt;&nbsp;&nbsp; mysql_num_fields(res);&nbsp;&nbsp; i++)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%s/n",row[i]);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mysql_free_result(res);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;mysql_close(&amp;mysql);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;mysql_query&nbsp;&nbsp; 函数将把查询送给服务器，如果查询成功，调用mysql_store_result 函数将分配一个MYSQL_RES&nbsp;&nbsp; 结构并且重新从服务器获得一个结果集。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 你可以用mysql_fetch_row&nbsp;&nbsp; 函数来查看数据。这样做你将获得一个&nbsp;&nbsp;&nbsp;MYSQL_ROW&nbsp;&nbsp; 指针指向数据中的一行。&nbsp;&nbsp; MYSQL_ROW&nbsp;&nbsp; 指针是一简单的字符串数组。所有的数据类型被转换成字符串送到客户端。&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;mysql_num_fields函数将告诉你返回的列数。你可以继续调用mysql_fetch_row直到它返回一个空指针以得到查询中的每一行。&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意在这个例子里，我们没有检查有空指针的列。如果你不使用非空列的表，那么你必须检查一个特殊行的列是否为空。一旦你使用完毕一个结果集，你必须释放它。这通过&nbsp;&nbsp; mysql_free_result&nbsp;&nbsp; 来完成。&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最后调用mysql_close来关闭你和数据库之间的连接。&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查看结果集你可以不用调用mysql_fetch_row就查出返回的结果集共有多少行。这由<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp; mysql_num_rows(MYSQL_RES&nbsp;&nbsp; *result)来完成。&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 改变到被下一个&nbsp;&nbsp; mysql_fetch_row&nbsp;&nbsp; 调用返回的行，你可以用void&nbsp;&nbsp; mysql_data_seek(MYSQL_RES&nbsp;&nbsp; *res,&nbsp;&nbsp; uint&nbsp;&nbsp; offset)&nbsp;&nbsp; 改变到任意一行。&nbsp; 获得更多的信息 你可以使用这几个额外的函数来找出关于一个查询的更多的信息，并从服务器获得这些信息。&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果你执行一个UPDATE，&nbsp;&nbsp; INSERT&nbsp;&nbsp; 或者&nbsp;&nbsp; DELETE&nbsp;&nbsp; 查询，你可以用int&nbsp;&nbsp; mysql_affected_rows&nbsp;&nbsp; 来查出共有多少行数据被你影响到。&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;如果在你的数据库里有二进制数据，那么得知数据的长度将是有用的。unsigned&nbsp;&nbsp;int&nbsp;&nbsp; *mysql_fetch_lengths(MYSQL_RES&nbsp;&nbsp; *mysql)&nbsp;&nbsp; 将返回一指出了结果集中每一列 的长度的整型数组。&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; &nbsp; 当你插入一个带有&nbsp;&nbsp; AUTO_INCREMENT&nbsp;&nbsp; 列的表的时候，你可以用int&nbsp;&nbsp; mysql_insert_id(MYSQL&nbsp;&nbsp; *mysql)&nbsp;&nbsp; 来查出生成的那一行的ID。&nbsp;&nbsp;&nbsp;<br />======================<br /></p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">int main()<br />{<br />&nbsp;&nbsp; &nbsp;MYSQL mysql;<br />&nbsp;&nbsp;&nbsp; MYSQL_RES * res ;&nbsp;<br />&nbsp;&nbsp;&nbsp; MYSQL_FIELD * fd ;&nbsp;<br />&nbsp;&nbsp;&nbsp; MYSQL_ROW row ;&nbsp;<br />&nbsp;&nbsp; &nbsp;int id[10000];<br />&nbsp;&nbsp;&nbsp; double result[10000][8];<br />&nbsp;&nbsp; &nbsp;vector&lt;string&gt; v;</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp; if(mysql_init(&amp;mysql) == NULL)<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp; &nbsp;&nbsp;std::cout&lt;&lt;"init mysql data status fail"&lt;&lt;std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;return false;<br />&nbsp; &nbsp;}&nbsp;<br />&nbsp;else<br />&nbsp;{<br />&nbsp;&nbsp;std::cout&lt;&lt;"init mysql data status success"&lt;&lt;std::endl;<br />&nbsp;}<br />&nbsp;<br />&nbsp;if(NULL == mysql_real_connect(&amp;mysql,"localhost","root","","wsnss",MYSQL_PORT,NULL,0))<br />&nbsp;{<br />&nbsp;&nbsp;std::cout&lt;&lt;"connect database fail"&lt;&lt;std::endl&lt;&lt;mysql_error(&amp;mysql)&lt;&lt;std::endl;;<br />&nbsp;&nbsp;return false;<br />&nbsp;}<br />&nbsp;else{<br />&nbsp;&nbsp;std::cout&lt;&lt;"connect database success"&lt;&lt;std::endl;<br />&nbsp;}</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">&nbsp;char&nbsp;&nbsp; szSqlText[500]="";&nbsp;<br />&nbsp;int j = 0;</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">&nbsp;sprintf(szSqlText,"%s","select * from data_receive ");&nbsp;<br />&nbsp;if (mysql_query( &amp;mysql, szSqlText))&nbsp;<br />&nbsp;//进行数据检索&nbsp;<br />&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; //执行SQL语句出错&nbsp;<br />&nbsp;&nbsp;cout&lt;&lt;"query error"&lt;&lt;endl;<br />&nbsp;&nbsp;mysql_close( &amp;mysql ) ;&nbsp;<br />&nbsp;&nbsp;return FALSE ;&nbsp;<br />&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp; else&nbsp;<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;res = mysql_store_result( &amp;mysql ) ;&nbsp;<br />&nbsp;&nbsp;int i; &nbsp;&nbsp;<br />&nbsp;&nbsp;while((row&nbsp;&nbsp; =&nbsp;&nbsp; mysql_fetch_row(res)))&nbsp;&nbsp; {&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;id[j] = atoi(row[0]);<br />&nbsp;&nbsp;&nbsp; for&nbsp;&nbsp; (i = 1; i &lt; mysql_num_fields(res); i++)&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp; result[j][i-1] =&nbsp; atof(row[i]);<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; j++;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;for(int i = 0 ; i &lt; 10000; i++)<br />&nbsp;{<br />&nbsp;&nbsp;if(i&gt;=j)<br />&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;char str[10000];<br />&nbsp;&nbsp;stringstream ss;</p><p style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ss&lt;&lt;"insert into data_receive(ID,data1,data2,data3,&nbsp;data4,data5,data6,data7,data8)values('"&lt;&lt;id[i]&lt;&lt;"','"&lt;&lt;<br />&nbsp;&nbsp;&nbsp;result[i][0]&lt;&lt;"','"&lt;&lt;result[i][1]&lt;&lt;"','"&lt;&lt;result[i][2]&lt;&lt;"','"&lt;&lt;<br />&nbsp;&nbsp;&nbsp;result[i][3]&lt;&lt;"','"&lt;&lt;result[i][4]&lt;&lt;"','"&lt;&lt;result[i][5]&lt;&lt;"','"&lt;&lt;<br />&nbsp;&nbsp;&nbsp;result[i][6]&lt;&lt;"','"&lt;&lt;result[i][7]&lt;&lt;"');";<br />&nbsp;&nbsp;string s = ss.str();<br />&nbsp;&nbsp;v.push_back(s);&nbsp;&nbsp;<br />&nbsp;}<br />&nbsp;for(vector&lt;string&gt;::iterator iter = v.begin();&nbsp; iter != v.end(); ++iter)<br />&nbsp;{<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;if(mysql_query(&amp;mysql,(*iter).c_str())!=0)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;std::cout&lt;&lt;"execute insert syntax fail"&lt;&lt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::endl&lt;&lt;mysql_error(&amp;mysql)&lt;&lt;endl;<br />&nbsp;&nbsp;&nbsp;mysql_close(&amp;mysql);<br />&nbsp;&nbsp;&nbsp;return 1;<br />&nbsp;&nbsp;}<br />&nbsp;}<br />&nbsp;&nbsp;&nbsp; mysql_free_result(res);<br />&nbsp;&nbsp;&nbsp; mysql_close(&amp;mysql);<br />&nbsp;&nbsp;&nbsp; return 0;<br />}&nbsp;</p>转自：<a href="http://blog.csdn.net/ztj111/article/details/2512147">http://blog.csdn.net/ztj111/article/details/2512147</a><img src ="http://www.cppblog.com/flyinghare/aggbug/167793.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghare/" target="_blank">会飞的兔子</a> 2012-03-13 18:00 <a href="http://www.cppblog.com/flyinghare/archive/2012/03/13/167793.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lua的C++封装</title><link>http://www.cppblog.com/flyinghare/archive/2012/02/10/165299.html</link><dc:creator>会飞的兔子</dc:creator><author>会飞的兔子</author><pubDate>Fri, 10 Feb 2012 08:01:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghare/archive/2012/02/10/165299.html</guid><wfw:comment>http://www.cppblog.com/flyinghare/comments/165299.html</wfw:comment><comments>http://www.cppblog.com/flyinghare/archive/2012/02/10/165299.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghare/comments/commentRss/165299.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghare/services/trackbacks/165299.html</trackback:ping><description><![CDATA[<span style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; ">前段时间由于公司项目需要，做了ＬＵＡ的Ｃ＋＋封装，为此看了LuaPlus（感觉过于庞大，挺混乱的．．）跟LuaTinker（一个韩国人写的，只有两个代码文件，实现了大多数需要的功能）的代码，在实现ＬＵＡ与Ｃ＋＋的交互中最重要的功能莫过于实现在ＬＵＡ中注册任意类型的Ｃ＋＋函数和类，现将自己所得到的一些方法简单说下，如有不对的地方还请各位多多指正</span><br style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; font-size: 13px; line-height: 20px; background-color: #ffffff; " /><span style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; font-size: 13px; line-height: 20px; background-color: #ffffff; ">　　</span><p style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; "><strong>注册C++函数</strong></p><p style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; ">当Lua 调用C 函数的时候， 使用和C 调用Lua 相同类型的栈来交互。C 函数从栈中获取她的参数， 调用结束后将返回结果放到栈中。为了区分返回结果和栈中的其他的值， 每个C函数还会返回结果的个数 。这儿有一个重要的概念：用来交互的栈不是全局变量， 每一个函数都有他自己的私有栈。当Lua 调用C 函数的时候，第一个参数总是在这个私有栈的index=1 的位置<br /><br />LUA中可注册的C函数类型</p><p style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; ">任何在Lua 中注册的函数必须有同样的原型，这个原型声明定义就是lua.h 中的</p><div style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; font-size: 13px; line-height: 20px; background-color: #eeeeee; border-right-color: #cccccc; border-right-width: 1px; border-right-style: solid; padding-right: 5px; border-top-color: #cccccc; border-top-width: 1px; border-top-style: solid; padding-left: 4px; padding-bottom: 4px; border-left-color: #cccccc; border-left-width: 1px; border-left-style: solid; width: 885px; word-break: break-all; padding-top: 4px; border-bottom-color: #cccccc; border-bottom-width: 1px; border-bottom-style: solid; height: 33px; "><span style="font-size: 12pt; ">lua_CFunction&nbsp;：typedef&nbsp;int&nbsp;(*lua_CFunction)&nbsp;(lua_State&nbsp;*L);</span><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></div><p style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; ">&nbsp;例子</p><div style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; font-size: 13px; line-height: 20px; background-color: #eeeeee; border-right-color: #cccccc; border-right-width: 1px; border-right-style: solid; padding-right: 5px; border-top-color: #cccccc; border-top-width: 1px; border-top-style: solid; padding-left: 4px; padding-bottom: 4px; border-left-color: #cccccc; border-left-width: 1px; border-left-style: solid; width: 885px; word-break: break-all; padding-top: 4px; border-bottom-color: #cccccc; border-bottom-width: 1px; border-bottom-style: solid; height: 64px; "><span style="font-size: 12pt; ">lua_pushcfunction(l,&nbsp;l_sin);<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />lua_setglobal(l,&nbsp;"mysin");</span><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></div><p style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; ">第一行将类型为function 的值入栈， 第二行将</p><p style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; ">function 赋值给全局变量mysin</p><p style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; ">&nbsp;<br />注册任意类型的C函数：</p><p style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; ">如果要向lua注册一个非lua_CFunction类型的函数，需要：<br />1． 为该函数实现一个封装调用。<br />2． 在封装调用函数中从lua栈中取得提供的参数。<br />3． 使用参数调用该函数。<br />4． 向lua传递其结果。</p><p style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; ">&nbsp;<br />首先必须有一个LUA规定类型的C函数，例如：</p><div style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; font-size: 13px; line-height: 20px; background-color: #eeeeee; border-right-color: #cccccc; border-right-width: 1px; border-right-style: solid; padding-right: 5px; border-top-color: #cccccc; border-top-width: 1px; border-top-style: solid; padding-left: 4px; padding-bottom: 4px; border-left-color: #cccccc; border-left-width: 1px; border-left-style: solid; width: 885px; word-break: break-all; padding-top: 4px; border-bottom-color: #cccccc; border-bottom-width: 1px; border-bottom-style: solid; "><span style="font-size: 12pt; ">template&lt;typename&nbsp;Func&gt;<br />int&nbsp;TempCallFun(lua_State*&nbsp;L)</span><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></div><p align="left" style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; ">注意这里有个typename Func，是函数的类型，稍后会讲这个的作用</p><p align="left" style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; ">&nbsp;<br />然后必须在这个函数中调用真正的C函数，这个函数通过栈来传递，LUA中提供了传递用户数据的接口</p><p style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; ">用户数据</p><p style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; ">Lua提供了一个函数可以存储用户数据：</p><div style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; font-size: 13px; line-height: 20px; background-color: #eeeeee; border-right-color: #cccccc; border-right-width: 1px; border-right-style: solid; padding-right: 5px; border-top-color: #cccccc; border-top-width: 1px; border-top-style: solid; padding-left: 4px; padding-bottom: 4px; border-left-color: #cccccc; border-left-width: 1px; border-left-style: solid; width: 885px; word-break: break-all; padding-top: 4px; border-bottom-color: #cccccc; border-bottom-width: 1px; border-bottom-style: solid; "><span style="font-size: 12pt; ">LUA_API 　<span style="color: #0000ff; ">void</span>&nbsp;*　lua_newuserdata (lua_State *L, size_t size)</span></div><br style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; font-size: 13px; line-height: 20px; background-color: #ffffff; " /><p style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; ">在适当的时刻，我们可以通过这个函数再取出这个数据：</p><div style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #eeeeee; border-right-color: #cccccc; border-right-width: 1px; border-right-style: solid; padding-right: 5px; border-top-color: #cccccc; border-top-width: 1px; border-top-style: solid; padding-left: 4px; font-size: 12pt; padding-bottom: 4px; border-left-color: #cccccc; border-left-width: 1px; border-left-style: solid; width: 885px; word-break: break-all; padding-top: 4px; border-bottom-color: #cccccc; border-bottom-width: 1px; border-bottom-style: solid; "><span style="color: #000000; ">LUA_API&nbsp;　</span><span style="color: #0000ff; ">void&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">lua_touserdata&nbsp;(lua_State&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">L,&nbsp;</span><span style="color: #0000ff; ">int</span><span style="color: #000000; ">&nbsp;idx)</span></div><p style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; ">这样我们可以在注册C++函数时，把这个函数指针当作用户数据压栈，然后在调用TempCallFun时把这个函数取出</p><p style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; ">这里有个关键就是在调用时必须得到正确的参数类型和个数，以正确调用函数并向LUA传递结果，在网上流传的LUA的C++封装中，实现这一功能都是用模板，在TempCallFun中，可以这样调用从栈中取出的函数指针：</p><div style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; font-size: 13px; line-height: 20px; background-color: #eeeeee; border-right-color: #cccccc; border-right-width: 1px; border-right-style: solid; padding-right: 5px; border-top-color: #cccccc; border-top-width: 1px; border-top-style: solid; padding-left: 4px; padding-bottom: 4px; border-left-color: #cccccc; border-left-width: 1px; border-left-style: solid; width: 885px; word-break: break-all; padding-top: 4px; border-bottom-color: #cccccc; border-bottom-width: 1px; border-bottom-style: solid; "><span style="font-size: 12pt; ">buffer&nbsp;=&nbsp;(unsigned&nbsp;char*)lua_touserdata(L,lua_upvalueindex1));//取出用户数据<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />return&nbsp;Call((*(Func*)buffer),L,1);//调用</span><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></div><p style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; ">注意这个Func就是我们要调用的C++的函数类型，也就是上面说的要把函数指针类型传进来的目的</p><p style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; ">接下来是Call的其中两个定义</p><div style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; font-size: 13px; line-height: 20px; background-color: #eeeeee; border-right-color: #cccccc; border-right-width: 1px; border-right-style: solid; padding-right: 5px; border-top-color: #cccccc; border-top-width: 1px; border-top-style: solid; padding-left: 4px; padding-bottom: 4px; border-left-color: #cccccc; border-left-width: 1px; border-left-style: solid; width: 885px; word-break: break-all; padding-top: 4px; border-bottom-color: #cccccc; border-bottom-width: 1px; border-bottom-style: solid; "><span style="font-size: 12pt; ">template&nbsp;&lt;typename&nbsp;RT&gt;<br />int&nbsp;Call(RT&nbsp;(*func)(),&nbsp;lua_State*&nbsp;&nbsp;L,&nbsp;int&nbsp;index)//匹配没有参数的C++函数<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;ReturnType&lt;RT&gt;::Call(func,&nbsp;L,&nbsp;index);<br />}<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />template&nbsp;&lt;typename&nbsp;RT,&nbsp;typename&nbsp;P1&gt;<br />int&nbsp;Call(RT&nbsp;(*func)(P1),&nbsp;lua_State*&nbsp;&nbsp;L,&nbsp;int&nbsp;index)//匹配有一个参数的C++函数<br />{<br />&nbsp;&nbsp;&nbsp; &nbsp;return&nbsp;ReturnType&lt;RT&gt;::Call(func,&nbsp;L,&nbsp;index);<br />}<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div><p align="left" style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; "><br />假如有一个 int Test(int a)的C++函数，那么在调用时，就会转到int Call(RT (*func)(P1), lua_State*&nbsp; L, int index)里面，这样我们就可以在这个函数具体处理有一个参数的C++函数的情况，因为参数类型也已经通过模板传进来了，所以可以继续通过模板来取得把栈中的参数转为正确的类型以供C++函数调用，这里有个技巧是封装栈操作：</p><div style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; font-size: 13px; line-height: 20px; background-color: #eeeeee; border-right-color: #cccccc; border-right-width: 1px; border-right-style: solid; padding-right: 5px; border-top-color: #cccccc; border-top-width: 1px; border-top-style: solid; padding-left: 4px; padding-bottom: 4px; border-left-color: #cccccc; border-left-width: 1px; border-left-style: solid; width: 885px; word-break: break-all; padding-top: 4px; border-bottom-color: #cccccc; border-bottom-width: 1px; border-bottom-style: solid; "><span style="font-size: 12pt; ">template&lt;class&nbsp;T&gt;&nbsp;struct&nbsp;TypeWrapper&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />{};<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />inline&nbsp;char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Get(TypeWrapper&lt;char&gt;,&nbsp;lua_State*&nbsp; L,&nbsp;int&nbsp;idx)<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />inline&nbsp;short&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Get(TypeWrapper&lt;short&gt;,&nbsp;lua_State*&nbsp; L,&nbsp;int&nbsp;idx)<br /></span><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></div><p align="left" style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; "><br />这里的TypeWrapper&lt;typename T&gt;只是为了传递栈中的参数类型</p><p style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; ">定义所有类型可能的类型的Get函数，就能方便的取得栈中的元素了，在上面的ReturnType&lt;RT&gt;::Call(func, L, index)里面，可以这样调用真正的C++函数，</p><div style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #eeeeee; border-right-color: #cccccc; border-right-width: 1px; border-right-style: solid; padding-right: 5px; border-top-color: #cccccc; border-top-width: 1px; border-top-style: solid; padding-left: 4px; font-size: 12pt; padding-bottom: 4px; border-left-color: #cccccc; border-left-width: 1px; border-left-style: solid; width: 885px; word-break: break-all; padding-top: 4px; border-bottom-color: #cccccc; border-bottom-width: 1px; border-bottom-style: solid; "><span style="color: #000000; ">RT &nbsp;ReturnVal&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">*</span><span style="color: #000000; ">func)(Get(TypeWrapper</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">P1</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(),&nbsp;L,&nbsp;index&nbsp;</span><span style="color: #000000; ">+</span>&nbsp;<span style="color: #000000; ">0</span><span style="color: #000000; ">))</span></div><p align="left" style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; "><br />最后把返回值压栈传给LUA，这样就实现了任意C++函数类型的注册。&nbsp;注册C++类的成员函数方法一样，只是要把这个类的某个实例也当作用户数据压栈</p><p style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; ">&nbsp;<br /><strong>注册C++类</strong></p><p style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; ">实现这个要比较复杂，因为LUA并不支持面向对象的特性，要实现这个必须通过一些技巧扩展，LUA中的表就是实现这个功能的媒介，也就是用表模拟C++中类的行为，具体实现方法就不详细说了，大家可以去看LuaTinker的代码，这里只说一下要点<br /><br />表其实就是一种数据元素的集合，每个元素都有一个索引，用户可通过索引来访问表里的元素</p><p style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; ">&nbsp;要注册类，关键要做到两点</p><p style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; ">1、&nbsp; LUA中的表跟C++中的类的关联，也就是在LUA中构造一个表相应在C++中也必须构造一个类</p><p style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; ">2、&nbsp; 表中元素跟类中的元素的映射，以得到LUA中的表跟C++中的类的行为的一致性</p><p style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; "><br />因为类是自己定义的类型，要实现一个通用的注册类的功能的话，还必须对传递给LUA中的类做一个封装，在LuaTinker中，这个类是：</p><div style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #eeeeee; border-right-color: #cccccc; border-right-width: 1px; border-right-style: solid; padding-right: 5px; border-top-color: #cccccc; border-top-width: 1px; border-top-style: solid; padding-left: 4px; font-size: 12pt; padding-bottom: 4px; border-left-color: #cccccc; border-left-width: 1px; border-left-style: solid; width: 885px; word-break: break-all; padding-top: 4px; border-bottom-color: #cccccc; border-bottom-width: 1px; border-bottom-style: solid; "><span style="color: #0000ff; ">struct</span><span style="color: #000000; ">&nbsp;user<br /></span><span id="Codehighlighter1_12_112_Open_Text"><span style="color: #000000; ">{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; user(</span><span style="color: #0000ff; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;p)&nbsp;:&nbsp;m_p(p)&nbsp;</span><span id="Codehighlighter1_50_51_Open_Text"><span style="color: #000000; ">{}</span></span><span style="color: #000000; "><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /><img id="Codehighlighter1_82_83_Open_Image" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff; ">virtual</span>&nbsp;<span style="color: #000000; ">~</span><span style="color: #000000; ">user()&nbsp;</span><span id="Codehighlighter1_82_83_Open_Text"><span style="color: #000000; ">{}</span></span><span style="color: #000000; "><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff; ">void</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;m_p;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />}</span></span><span style="color: #000000; ">;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />template</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000ff; ">struct</span><span style="color: #000000; ">&nbsp;val2user&nbsp;:&nbsp;user<br /></span><span id="Codehighlighter1_178_430_Open_Text"><span style="color: #000000; ">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val2user()&nbsp;:&nbsp;user(</span><span style="color: #0000ff; ">new</span><span style="color: #000000; ">&nbsp;T)&nbsp;</span><span id="Codehighlighter1_218_219_Open_Text"><span style="color: #000000; ">{}</span></span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">构造函数没有参数的类</span><span style="color: #008000; "><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000; "><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp; template</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">typename&nbsp;T1</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">构造函数有一个参数的类</span><span style="color: #008000; "><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; val2user(T1&nbsp;t1)&nbsp;:&nbsp;user(</span><span style="color: #0000ff; ">new</span><span style="color: #000000; ">&nbsp;T(t1))&nbsp;</span><span id="Codehighlighter1_338_339_Open_Text"><span style="color: #000000; ">{}</span></span><span style="color: #000000; "><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp; &nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">以此类推。。。。。。。</span><span style="color: #008000; "><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000; "><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp; &nbsp;</span><span style="color: #000000; ">~</span><span style="color: #000000; ">val2user()&nbsp;</span><span id="Codehighlighter1_399_419_Open_Text"><span style="color: #000000; ">{&nbsp;delete&nbsp;((T</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)m_p);&nbsp;}</span></span><span style="color: #000000; "><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />}</span></span><span style="color: #000000; ">;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div><p style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; ">与LUA中的表关联的只是这个val2user，构造一个表就构造一个val2user，在val2user中再构造具体的类<br /></p><p style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; ">下面是几个在ＬＵＡ中预定义的事件<br /><br />The __call Metamethod</p><p style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; ">这是在创建一个表的时候会触发的事件，可以通过在此事件的元方法中调用类的构造函数，以达到在LUA中创建元表的同时在C++中创建类</p><p align="left" style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; ">&nbsp;<br />LUA中的表有几个比较重要的预定义的错误行为的事件</p><p style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; ">The __index Metamethod</p><p style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; ">当我们访问一个表的不存在的域， 返回结果为nil ， 这是正确的， 但并不一定正确。实际上， 这种访问触发lua 解释器去查找__index metamethod ： 如果不存在， 返回结果为nil ,如果存在则由__index metamethod 返回结果。</p><p style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; "><br />The&nbsp; __newindex metamethod</p><p style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; ">用来对表更新， __index 则用来对表访问。当你给表的一个缺少的域赋值，解释器就会查找__newindex metamethod ： 如果存在则调用这个函数而不进行赋值操作。像__index 一样， 如果metamethod 是一个表,解释器对指定的那个表， 而不是原始的表进行赋值操作。<br /><br />可以通过定义这两个特性的元方法来实现对类中变量的访问和设置，因为userdata是没有元素的，所以访问时一定会触发__index，_newindex元方法，通过设置此元方法既可实现对类以及其基类中变量的访问<br /><br />The &nbsp;__gc Metamethod</p><p style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; background-color: #ffffff; font-size: 12pt; ">这个元方法只对userdata 类型的值有效。当一个userdatum 将被收集的时候， 并且usedatum 有一个__gc 域， Lua 会调用这个域的值（ 应该是一个函数）：以userdatum作为这个函数的参数调用。这个函数负责释放与userdatum 相关的所有资源。</p><p style="color: #4b4b4b; font-family: georgia, verdana, Arial, helvetica, sans-seriff; line-height: 20px; font-size: 12pt; background-color: #ffffff; ">&nbsp;<br />可以设置此事件的元方法来析构类<br /><br />转自：<a href="http://www.cppblog.com/zzxhang/archive/2008/07/16/56311.html">http://www.cppblog.com/zzxhang/archive/2008/07/16/56311.html</a></p><img src ="http://www.cppblog.com/flyinghare/aggbug/165299.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghare/" target="_blank">会飞的兔子</a> 2012-02-10 16:01 <a href="http://www.cppblog.com/flyinghare/archive/2012/02/10/165299.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>应用boost::filesystem递归拷贝目录树</title><link>http://www.cppblog.com/flyinghare/archive/2011/11/01/159441.html</link><dc:creator>会飞的兔子</dc:creator><author>会飞的兔子</author><pubDate>Tue, 01 Nov 2011 03:01:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghare/archive/2011/11/01/159441.html</guid><wfw:comment>http://www.cppblog.com/flyinghare/comments/159441.html</wfw:comment><comments>http://www.cppblog.com/flyinghare/archive/2011/11/01/159441.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghare/comments/commentRss/159441.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghare/services/trackbacks/159441.html</trackback:ping><description><![CDATA[<p>操作系统提供的API通常不支持直接拷贝目录树。不过，可以通过递归的方法实现。下面，我们用boost的filesystem库实现该功能。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="dp-highlighter bg_cpp:nocontrols">
<div class="bar"></div>
<ol class="dp-cpp"><li class="alt"><span class="comment">// recusively copy file or directory from $src to $dst</span><span> </span></li><li><span class="keyword">void</span><span> CopyFiles(</span><span class="keyword">const</span><span> boost::filesystem::path &amp;src, </span><span class="keyword">const</span><span> boost::filesystem::path &amp;dst) </span></li><li class="alt"><span>{ </span></li><li><span class="keyword">if</span><span> (! boost::filesystem::exists(dst)) </span></li><li class="alt"><span>{ </span></li><li><span>boost::filesystem::create_directories(dst); </span></li><li class="alt"><span>} </span></li><li><span class="keyword">for</span><span> (boost::filesystem::directory_iterator it(src); it != boost::filesystem::directory_iterator(); ++it) </span></li><li class="alt"><span>{ </span></li><li><span class="keyword">const</span><span> boost::filesystem::path newSrc = src / it-&gt;filename(); </span></li><li class="alt"><span class="keyword">const</span><span> boost::filesystem::path newDst = dst / it-&gt;filename(); </span></li><li><span class="keyword">if</span><span> (boost::filesystem::is_directory(newSrc)) </span></li><li class="alt"><span>{ </span></li><li><span>CopyFiles(newSrc, newDst); </span></li><li class="alt"><span>} </span></li><li><span class="keyword">else</span><span> </span><span class="keyword">if</span><span> (boost::filesystem::is_regular_file(newSrc)) </span></li><li class="alt"><span>{ </span></li><li><span>boost::filesystem::copy_file(newSrc, newDst, boost::filesystem::copy_option::overwrite_if_exists); </span></li><li class="alt"><span>} </span></li><li><span class="keyword">else</span><span> </span></li><li class="alt"><span>{ </span></li><li><span>_ftprintf(stderr, <span class="string">"Error: unrecognized file - %s"</span><span>, newSrc.string().c_str()); </span></span></li><li class="alt"><span>} </span></li><li><span>} </span></li><li class="alt"><span>} </span></li></ol></div>是不是很简洁呢？该函数不仅可以拷贝目录树，还可以拷贝单个文件，而且输入参数可以是相对路径，您可以试试。<br />转自：<a href="http://blog.csdn.net/ganxinjiang/article/details/6088323">http://blog.csdn.net/ganxinjiang/article/details/6088323</a><img src ="http://www.cppblog.com/flyinghare/aggbug/159441.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghare/" target="_blank">会飞的兔子</a> 2011-11-01 11:01 <a href="http://www.cppblog.com/flyinghare/archive/2011/11/01/159441.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>STL运用的C++技术（6）——函数对象</title><link>http://www.cppblog.com/flyinghare/archive/2011/09/06/155195.html</link><dc:creator>会飞的兔子</dc:creator><author>会飞的兔子</author><pubDate>Tue, 06 Sep 2011 02:42:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghare/archive/2011/09/06/155195.html</guid><wfw:comment>http://www.cppblog.com/flyinghare/comments/155195.html</wfw:comment><comments>http://www.cppblog.com/flyinghare/archive/2011/09/06/155195.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghare/comments/commentRss/155195.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghare/services/trackbacks/155195.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp; &nbsp; &nbsp; STL是C++标准库的重要组成部分之一，它不仅是一个可复用的组件库，更是一个包含算法与数据结构的软件框架，同时也是C++泛型编程的很好例子。STL中运用了许多C++的高级技术。本文介绍函数对象，其实是接上一篇的话题，因为函数对象本质上还是重载操作符。主要参考了《C++ Primer》和《STL源码剖析》。&nbsp;&nbsp; &nbsp; &nbsp;...&nbsp;&nbsp;<a href='http://www.cppblog.com/flyinghare/archive/2011/09/06/155195.html'>阅读全文</a><img src ="http://www.cppblog.com/flyinghare/aggbug/155195.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghare/" target="_blank">会飞的兔子</a> 2011-09-06 10:42 <a href="http://www.cppblog.com/flyinghare/archive/2011/09/06/155195.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>boost的typeof 试探</title><link>http://www.cppblog.com/flyinghare/archive/2011/08/29/154587.html</link><dc:creator>会飞的兔子</dc:creator><author>会飞的兔子</author><pubDate>Mon, 29 Aug 2011 01:22:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghare/archive/2011/08/29/154587.html</guid><wfw:comment>http://www.cppblog.com/flyinghare/comments/154587.html</wfw:comment><comments>http://www.cppblog.com/flyinghare/archive/2011/08/29/154587.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghare/comments/commentRss/154587.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghare/services/trackbacks/154587.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: boost的typeof 试探皮贝贝&nbsp;posted @ 2009年11月27日 05:26 in&nbsp;boost&nbsp;with tags&nbsp;boost&nbsp;typeof&nbsp;, 541 阅读前段时间在 csdn 上发了帖子讨论过这个问题，当时讨论了有些地方还是不懂。今天又看了下源码，写下来备忘：(研究 MSVC 的部分)先看&nbsp; BOOST_TYP...&nbsp;&nbsp;<a href='http://www.cppblog.com/flyinghare/archive/2011/08/29/154587.html'>阅读全文</a><img src ="http://www.cppblog.com/flyinghare/aggbug/154587.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghare/" target="_blank">会飞的兔子</a> 2011-08-29 09:22 <a href="http://www.cppblog.com/flyinghare/archive/2011/08/29/154587.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>W2A堆栈溢出</title><link>http://www.cppblog.com/flyinghare/archive/2011/04/19/144522.html</link><dc:creator>会飞的兔子</dc:creator><author>会飞的兔子</author><pubDate>Tue, 19 Apr 2011 02:48:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghare/archive/2011/04/19/144522.html</guid><wfw:comment>http://www.cppblog.com/flyinghare/comments/144522.html</wfw:comment><comments>http://www.cppblog.com/flyinghare/archive/2011/04/19/144522.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghare/comments/commentRss/144522.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghare/services/trackbacks/144522.html</trackback:ping><description><![CDATA[<span style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; FONT: medium Simsun; WHITE-SPACE: normal; ORPHANS: 2; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span><span style="TEXT-ALIGN: center; LINE-HEIGHT: 18px; FONT-FAMILY: Arial; FONT-SIZE: 12px" class=Apple-style-span>
<div style="TEXT-ALIGN: left; FILTER: none; BORDER-LEFT: rgb(101,75,34) 5px solid; LINE-HEIGHT: 20px !important; OVERFLOW-X: hidden; OVERFLOW-Y: hidden; TEXT-INDENT: 10px; ZOOM: 1 !important; FONT-FAMILY: Tahoma; WORD-WRAP: break-word; VISIBILITY: visible !important; COLOR: rgb(70,65,45); FONT-SIZE: 13px; WORD-BREAK: break-all; FONT-WEIGHT: bold" class=tit>数据统计工具制作小结－－W2A堆栈溢出</div>
<div style="TEXT-ALIGN: left; FILTER: none; BORDER-LEFT: rgb(0,0,0) 5px solid; LINE-HEIGHT: 20px !important; MARGIN: -3px 0px 8px; PADDING-LEFT: 10px; ZOOM: 1 !important; FONT-FAMILY: Tahoma; WORD-WRAP: break-word; VISIBILITY: visible !important; COLOR: rgb(166,168,167); FONT-SIZE: 11px; WORD-BREAK: break-all" class=date>2010-12-22 17:32</div>
<table style="LINE-HEIGHT: 20px !important; WIDTH: 760px; TABLE-LAYOUT: fixed">
    <tbody style="LINE-HEIGHT: 20px !important">
        <tr style="LINE-HEIGHT: 20px !important">
            <td style="FILTER: none; LINE-HEIGHT: 20px !important; ZOOM: 1 !important; FONT-FAMILY: Arial; WORD-WRAP: break-word; VISIBILITY: visible !important; FONT-SIZE: 12px; WORD-BREAK: break-all">
            <div style="POSITION: static; FILTER: none; LINE-HEIGHT: 20px; OVERFLOW-X: hidden; OVERFLOW-Y: hidden; ZOOM: 1 !important; FONT-FAMILY: Tahoma; WORD-WRAP: break-word; VISIBILITY: visible !important; COLOR: rgb(70,65,45); FONT-SIZE: 12px; WORD-BREAK: normal" id=blog_text class=cnt>
            <p style="LINE-HEIGHT: normal">在测试大数据量的时候，因为我的程序最后要生成一个excel报表，可是每次打开的时候，explorer.exe就报错，我在想，我又没惹你，你怎么不给打开呢，难道是我用的ODBC数据操作有误？想想不对，数据不大的时候怎么没事呢？没办法，拿个大数据文件debug吧！结果好不容易遇到一个CString错误，说程序溢出，当时忙着改错，没有记录下来错误描述。记得那个长长的错误提示中包含有W2A字样，好！因为我用到了W2A的宏！立马回忆起来曾经用它时遇到的问题，查了一下MSDN，《TN059: Using MFC MBCS/Unicode Conversion Macros&nbsp; 》，Link:<a style="LINE-HEIGHT: 20px; FONT-FAMILY: Tahoma; COLOR: rgb(70,65,45); FONT-SIZE: 12px; TEXT-DECORATION: none" href="http://msdn.microsoft.com/en-us/library/805c56f8%28VS.80%29.aspx">http://msdn.microsoft.com/en-us/library/805c56f8%28VS.80%29.aspx</a></p>
            <p style="LINE-HEIGHT: normal">讲得非常详细，就是W2A是在栈上取得一段内存，在程序结束时栈才会释放取得的栈空间，所以，不能在一个大的循环中使用它，而应该在程序外面专门写一个字符串处理小函数，达到快速、安全转换的目的。</p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
</span></span><br><br>转自：<a href="http://hi.baidu.com/lyzneuq/blog/item/1a5907df4f81744594ee374f.html"><u><font color=#0066cc>http://hi.baidu.com/lyzneuq/blog/item/1a5907df4f81744594ee374f.html</font></u></a>
<img src ="http://www.cppblog.com/flyinghare/aggbug/144522.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghare/" target="_blank">会飞的兔子</a> 2011-04-19 10:48 <a href="http://www.cppblog.com/flyinghare/archive/2011/04/19/144522.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GDI+ for VC6 MFC </title><link>http://www.cppblog.com/flyinghare/archive/2011/03/16/141979.html</link><dc:creator>会飞的兔子</dc:creator><author>会飞的兔子</author><pubDate>Wed, 16 Mar 2011 07:21:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghare/archive/2011/03/16/141979.html</guid><wfw:comment>http://www.cppblog.com/flyinghare/comments/141979.html</wfw:comment><comments>http://www.cppblog.com/flyinghare/archive/2011/03/16/141979.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghare/comments/commentRss/141979.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghare/services/trackbacks/141979.html</trackback:ping><description><![CDATA[<p>五年前，笔者曾在C#中使用GDI+开发程序，对其颇有好感。这一段时间，在使用VC6作图时，深切感会到使用GDI的种种不便，不比GDI+好用。沉迷于VC6的高效与轻便，不想只为了一个GDI+而被迫安装沉甸甸的.Net，便产生了一个疑问，难道GDI+只能用于.Net中吗？</p>
<p>访问微软的MSDN网站后，随即解开了此谜。于是便有了此文 &#8211; 如何在VC6 MFC中使用GDI+。</p>
<p>GDI+可应用于二维向量图象，栅格图象及排版，是为C/C++程序员而设计的表现为C++类而存在的接口，能用于一切基于Windows的应用中。作为GDI的后继者，GDI+在GDI中增加了新功能，如文本的反锯齿，渐变笔刷，Alpha溶合；也优化了GDI许多已有的功能。此外，GDI+改变了编程模式，使其更灵活及易用。</p>
<p>GDI+并不限于在.Net中存在，实际上它由Windows XP或Windows Server 2003操作系统提供。它被打包在一个名为GdiPlus.dll的文件中。此文件位于C:\Windows\WinSxS下的相应文件夹下。以笔者的XP系统为例，共有2个版本，其相应的文件夹分别是：</p>
<p>x86_Microsoft.Windows.GdiPlus_6595b64144ccf1df_1.0.0.0_x-ww_8d353f13<br>x86_Microsoft.Windows.GdiPlus_6595b64144ccf1df_1.0.2600.2180_x-ww_522f9f82</p>
<p>在应用程序中，我们不需指定版本号，系统自动选择最新的版本。先假设我们已经在VC6中编好一个GDI+应用，在degbug版本中单击菜单Build-&gt;Start Debug-&gt;Go启动调试，再终止应用，在VC6的Output区域中可以看到以下信息：<br>Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.Windows.GdiPlus_6595b64144ccf1df_1.0.2600.2180_x-ww_522f9f82\GdiPlus.dll'<br>说明系统自动选择了最新的版本。</p>
<p>如同Windows是用C语言编写，GdiPlus.dll是以C函数实现的，并没有封装为C++类，从而给非C程序员带来不便。又如同MFC所为，微软再次将这些C函数打包为C++类的形式，向C++程序员提供了以GdiPlus.h领头的30个头文件及一个GdiPlus.lib。因此，如果您是C程序员，则只需GdiPlus.dll就行了；C++程序员则还需要找到GdiPlus.h等头文件及GdiPlus.lib文件。</p>
<p>Windows XP或Windows Server 2003应使用系统自带的GdiPlus.dll，以免与系统服务冲突。而对于版本低于Windows XP的Windows，如Windows NT 4.0 SP6, Windows 2000, Windows98及Windows Me，则需要此文件。可到微软的官方地址去下载分发包gdiplus_dnld.exe文件，地址为：<br><a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=6a63ab9c-df12-4d41-933c-be590feaa05a&amp;DisplayLang=en">http://www.microsoft.com/downloads/details.aspx?FamilyID=6a63ab9c-df12-4d41-933c-be590feaa05a&amp;DisplayLang=en</a></p>
<p>该文件是一个自解压的文件，应将其解压到应用程序的目录下，但不要安装在系统目录中。</p>
<p>C++程序员还应去找GdiPlus.h及GdiPlus.lib。以下地址所提供的名为gdiplus.zip的文件就包括了这些文件：<br><a href="http://www.crazy-bit.com/download/gdiplus.zip">http://www.crazy-bit.com/download/gdiplus.zip</a></p>
<p>而以下的地址则提供了一站式的所有资源，即包含了GdiPlus.h等头文件, GdiPlus.lib及GdiPlus.dll：<br><a href="http://www.codersource.net/samples/mfcgdiplus.zip">http://www.codersource.net/samples/mfcgdiplus.zip</a></p>
<p>根据解压的不同方式，有不同的引用方法。</p>
<p>第一种方法是直接引用，需要将gdiplus.h, gdiplus.lib分别拷贝至VC相应的include及lib目录下。这两个目录可通过VC6的Toos-&gt;Options-&gt;Directories标签页中，在Show directories for下拉列表框中分别选择Include files及Library files查询到。如Include，一般包括3个路径：VC98\INCLUDE, VC98\MFC\INCLUDE及VC98\ATL\INCLUDE，分别对应非MFC应用，MFC应用及ATL应用所用的不同路径。</p>
<p>然后在StdAfx.h中加入如下的语句：</p>
<p>#define ULONG_PTR ULONG <br>#include &lt;gdiplus.h&gt;<br>using namespace Gdiplus;<br>#pragma comment(lib, "gdiplus.lib")</p>
<p>GdiPlusInit.h中使用了ULONG_PTR的数据类型，但此类型在VC6中没有定义。因此必须在#include语句之前先进行定义。#pragma comment(lib, "gdiplus.lib")指示在连接时在应用所在目录或系统LIB目录下查找gdiplus.lib。</p>
<p>第二种方法是将其解压到任意一个文件夹，然后在StdAfx.h中明确指明具体路径。</p>
<p>#define ULONG_PTR ULONG <br>#include "C:/gdiplus/Include/gdiplus.h"<br>using namespace Gdiplus;<br>#pragma comment(lib, "C:/gdiplus/lib/gdiplus.lib")</p>
<p>除了用以上的方法连接gdiplus.lib之外，还可以在Project-&gt;Settings-&gt;Link-&gt;Object/library modules中输入gdiplus.lib（若有多个库，可用空格隔开，但GDI+只有一个库）。这种方法，可不用在StdAfx.h中输入#pragma comment。</p>
<p>在使用GDI+之前，您必须通过GdiplusStartup()启动GDI+，而在使用完毕后，调用GdiplusShutdown()来清理现场。 根据MFC的特点，应相应地放在XXXApp类的InitInstance()及ExitInstance()中。</p>
<p>先为XXXApp类添加两私有成员变量：<br>private:<br>&nbsp;GdiplusStartupInput gdiplusStartupInput;<br>&nbsp;ULONG_PTR gdiplusToken;</p>
<p>然后在InitInstance()中，在调用m_pMainWnd-&gt;ShowWindow()及m_pMainWnd-&gt;UpdateWindow()之前调用GdiplusStartup()：</p>
<p>&nbsp;GdiplusStartup(&amp;gdiplusToken, &amp;gdiplusStartupInput, NULL);</p>
<p>&nbsp;// The one and only window has been initialized, so show and update it.<br>&nbsp;m_pMainWnd-&gt;ShowWindow(SW_SHOW);<br>&nbsp;m_pMainWnd-&gt;UpdateWindow();<br>&nbsp;return TRUE;</p>
<p>注意，如果GdiplusStartup()放在ShowWindow()及UpdateWindow()之后，则当窗口第一次显示时，由于GDI+还未启动，GDI+所画的图形不会显示出来，直到第二个WM_PAINT的消息传到。</p>
<p>而在ExitInstance()中，如下编写代码：</p>
<p>&nbsp;GdiplusShutdown(gdiplusToken);<br>&nbsp;return CWinApp::ExitInstance();</p>
<p>现在，GDI+已经准备完毕，可以使用了。</p>
<p>在XXXView类的OnDraw()方法中：</p>
<p>&nbsp;Graphics graphics(pDC-&gt;m_hDC);<br>&nbsp;<br>&nbsp;Pen pen(Color(50, 255, 0, 255), 15);<br>&nbsp;pen.SetDashStyle(DashStyleDash);<br>&nbsp;pen.SetStartCap(LineCapRoundAnchor);<br>&nbsp;pen.SetEndCap(LineCapArrowAnchor);<br>&nbsp;<br>&nbsp;graphics.DrawLine(&amp;pen, 20, 20, 300, 100);<br>&nbsp;graphics.DrawLine(&amp;pen, 300, 100, 600, 100);</p>
<p>先使用OnDraw()方法的参数pDC的成员变量m_hDC在堆上构造一个Graphics的实例graphics，创建一个Pen并进行设置，然后通过graphics的DrawLine()方法画出直线来。</p>
<p>与GDI相比较，GDI+不必将Pen, Brush等对象选进DC再画图，而是通过使用DC的句柄来创建一个Graphics实例，之后，直接使用此实例来进行画图。这种风格，确实大大方便了编程人员。</p>
<p>至此，我们可以在VC6 MFC中使用GDI+描绘美好的未来了。:) </p>
<p>&nbsp;</p>
<p>转自：<a href="http://blog.csdn.net/tanghw/archive/2008/02/17/2100187.aspx">http://blog.csdn.net/tanghw/archive/2008/02/17/2100187.aspx</a></p>
<img src ="http://www.cppblog.com/flyinghare/aggbug/141979.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghare/" target="_blank">会飞的兔子</a> 2011-03-16 15:21 <a href="http://www.cppblog.com/flyinghare/archive/2011/03/16/141979.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>STL之容器：选择时机，删除元素，迭代器失效</title><link>http://www.cppblog.com/flyinghare/archive/2011/03/03/141037.html</link><dc:creator>会飞的兔子</dc:creator><author>会飞的兔子</author><pubDate>Thu, 03 Mar 2011 02:49:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghare/archive/2011/03/03/141037.html</guid><wfw:comment>http://www.cppblog.com/flyinghare/comments/141037.html</wfw:comment><comments>http://www.cppblog.com/flyinghare/archive/2011/03/03/141037.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghare/comments/commentRss/141037.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghare/services/trackbacks/141037.html</trackback:ping><description><![CDATA[<div id=cnblogs_post_body><font size=4>一. 种类：</font>
<ul type=disc>
    <li style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; LAYOUT-GRID-MODE: char; COLOR: #333333"><font size=3><strong><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">标准</span></strong><strong><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">STL</span></strong><strong><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">序列容器</span></strong><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">：</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">vector</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">、</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">string</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">、</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">deque</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">和</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">list</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">。</span></font>
    <li style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; LAYOUT-GRID-MODE: char; COLOR: #333333"><font size=3><strong><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">标准</span></strong><strong><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">STL</span></strong><strong><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">关联容器</span></strong><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">：</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">set</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">、</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">multiset</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">、</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">map</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">和</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">multimap</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">。</span></font>
    <li style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; LAYOUT-GRID-MODE: char; COLOR: #333333"><font size=3><strong><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">非标准序列容器</span></strong><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">slist</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">和</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">rope</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">。</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">slist</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">是一个单向链表，</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">rope</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">本质上是一个重型字符串</span></font>
    <li style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; LAYOUT-GRID-MODE: char; COLOR: #333333"><font size=3><strong><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">非标准关联容器</span></strong><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">hash_set</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">、</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">hash_multiset</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">、</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">hash_map</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">和</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">hash_multimap</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">。</span></font>
    <li style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; LAYOUT-GRID-MODE: char; COLOR: #333333"><font size=3><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">几种</span><strong><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">标准非</span></strong><strong><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">STL</span></strong><strong><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">容器</span></strong><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">，包括数组、</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">bitset</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">、</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">valarray</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">、</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">stack</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">、</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">queue</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">和</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 9pt">priority_queue</span></font> </li>
</ul>
<p style="TEXT-ALIGN: left; LINE-HEIGHT: 150%; LAYOUT-GRID-MODE: char; COLOR: #333333">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font style="BACKGROUND-COLOR: #ff0000"><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">值得注意的是，数组可以和</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">STL</span></font><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt"><font style="BACKGROUND-COLOR: #ff0000">算法配合，因为指针可以当作数组的迭代器使用</font>。<br><br><font size=4>&nbsp;二.</font><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 12pt">删除元素</span> <br></span></p>
<div style="LINE-HEIGHT: 150%; LAYOUT-GRID-MODE: char; MARGIN-LEFT: 18pt" align=left><font color=#ff0000><font style="BACKGROUND-COLOR: #ffffff"><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt"><font size=4>&nbsp;</font><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">如果想删除东西，记住</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">remove</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">算法后，要加上</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">erase</span></div>
<div style="LINE-HEIGHT: 150%; LAYOUT-GRID-MODE: char; MARGIN-LEFT: 18pt" align=left><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">所谓删除算法，最终还是要调用成员函数去删除某个元素，但是因为</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">remove</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">并不知道它现在作用于哪个容器，所以</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">remove</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">算法不可能真的删除一个元素</span></div>
<div style="LINE-HEIGHT: 150%; LAYOUT-GRID-MODE: char; MARGIN-LEFT: 18pt" align=left><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">1.Vector</span></div>
<div style="LINE-HEIGHT: 150%; LAYOUT-GRID-MODE: char; MARGIN-LEFT: 18pt" align=left>&nbsp;</div>
<div style="LINE-HEIGHT: 150%; LAYOUT-GRID-MODE: char; MARGIN-LEFT: 18pt" align=left><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">
<div class=cnblogs_code><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="COLOR: #000000">vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;v;&nbsp;&nbsp;&nbsp;<br>v.reserve(</span><span style="COLOR: #800080">10</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800080">1</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800080">10</span><span style="COLOR: #000000">;&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i)&nbsp;{<br>&nbsp;v.push_back(i);<br>}<br>cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;v.size();&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;10</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">v[</span><span style="COLOR: #800080">3</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;v[</span><span style="COLOR: #800080">5</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;v[</span><span style="COLOR: #800080">9</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800080">99</span><span style="COLOR: #000000">;&nbsp;<br>remove(v.begin(),&nbsp;v.end(),&nbsp;</span><span style="COLOR: #800080">99</span><span style="COLOR: #000000">);&nbsp;<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">v.erase(remove(v.begin(),v.end(),99),v.end());</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;v.size();&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;10！</span><span style="COLOR: #008000"><br></span></div>
2. list</span></div>
<div style="LINE-HEIGHT: 150%; LAYOUT-GRID-MODE: char; MARGIN-LEFT: 18pt" align=left><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt"><br>list&lt;int&gt; listTest;</span></div>
<div style="LINE-HEIGHT: 150%; LAYOUT-GRID-MODE: char; MARGIN-LEFT: 18pt" align=left><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">listTest.remove(99);//</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">这个成员函数将真的删除元素，并且要比</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">erase+remove</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">高效</span></div>
<div style="LINE-HEIGHT: 150%; LAYOUT-GRID-MODE: char; MARGIN-LEFT: 18pt" align=left><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">remove</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">和</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">remove_if</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">之间的十分相似。但</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">unique</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">行为也像</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">remove</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">。它用来从一个区间删除东西（邻近的重复值）而不用访问持有区间元素的容器。如果你真的要从容器中删除元素，你也必须成对调用</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">unique</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">和</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">erase</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">，</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">unique</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">在</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">list</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">中也类似于</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">remove</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">。正像</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">list::remove</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">真的删除东西（而且比</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">erase-remove</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">惯用法高效得多）。</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">list::unique</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">也真的删除邻近的重复值（也比</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">erase-unique</span><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">高效）。</span></div>
</span></font></font>
<div style="LINE-HEIGHT: 150%; LAYOUT-GRID-MODE: char; MARGIN-LEFT: 18pt" align=left><font color=#ff0000><font style="BACKGROUND-COLOR: #ff0000"></font></font>&nbsp;</div>
<div style="LINE-HEIGHT: 150%; LAYOUT-GRID-MODE: char; MARGIN-LEFT: 18pt" align=left><font size=4><span style="FONT-FAMILY: 宋体; COLOR: #333333; FONT-SIZE: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 宋体; COLOR: #333333; FONT-SIZE: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">三 迭代器失效：</span></span></font></div>
<div style="LINE-HEIGHT: 150%; LAYOUT-GRID-MODE: char; MARGIN-LEFT: 18pt" align=left><font size=4><span style="FONT-FAMILY: 宋体; COLOR: #333333; FONT-SIZE: 9pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><span style="FONT-FAMILY: 宋体; COLOR: #333333; FONT-SIZE: 12pt; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">
<div style="LINE-HEIGHT: 150%; LAYOUT-GRID-MODE: char" align=left><span style="LINE-HEIGHT: 150%; FONT-SIZE: 7pt">&nbsp;
<div style="LINE-HEIGHT: 150%; LAYOUT-GRID-MODE: char" align=left><span style="LINE-HEIGHT: 150%; COLOR: #333333; FONT-SIZE: 9pt">一个网友提的问题：</span></div>
</span></div>
<div style="LINE-HEIGHT: 150%; LAYOUT-GRID-MODE: char" align=left>
<div style="LINE-HEIGHT: 150%; LAYOUT-GRID-MODE: char" align=left><span style="LINE-HEIGHT: 150%; FONT-SIZE: 7pt"><font style="BACKGROUND-COLOR: #ff0000"></font></span></div>
<span style="LINE-HEIGHT: 150%; FONT-SIZE: 7pt">
<div class=cnblogs_code><img id=Code_Closed_Image_215349 onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_215349').style.display='none'; document.getElementById('Code_Open_Image_215349').style.display='inline'; document.getElementById('Code_Open_Text_215349').style.display='inline';" align=top src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width=11 height=16><img style="DISPLAY: none" id=Code_Open_Image_215349 onclick="this.style.display='none'; document.getElementById('Code_Open_Text_215349').style.display='none'; getElementById('Code_Closed_Image_215349').style.display='inline'; getElementById('Code_Closed_Text_215349').style.display='inline';" align=top src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width=11 height=16><span id=Code_Closed_Text_215349 class=cnblogs_code_Collapse>Code</span><span style="DISPLAY: none" id=Code_Open_Text_215349><br><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;main()&nbsp;<br>{&nbsp;<br>vector&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;vcs;&nbsp;<br>vcs.push_back(&nbsp;</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">this&nbsp;&nbsp;&nbsp;is&nbsp;&nbsp;&nbsp;A&nbsp;</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">);&nbsp;<br>vector&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;::iterator&nbsp;&nbsp;&nbsp;it</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">vcs.begin();&nbsp;<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #800080">9</span><span style="COLOR: #000000">;&nbsp;<br></span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(;it</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">vcs.end();</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">it)&nbsp;<br>{&nbsp;<br>cout&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">caplity&nbsp;&nbsp;&nbsp;of&nbsp;&nbsp;&nbsp;vector&nbsp;&nbsp;&nbsp;is&nbsp;&nbsp;&nbsp;:&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">vcs.size()&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">endl;&nbsp;<br><br>cout&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">---&gt;&nbsp;</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;*</span><span style="COLOR: #000000">it&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">endl;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">去掉此句会有一个超过vector&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">大小的循环，高手能解释一下为什么?&nbsp;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">==</span><span style="COLOR: #800080">9</span><span style="COLOR: #000000">)&nbsp;<br>{&nbsp;<br>vcs.push_back(&nbsp;</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">this&nbsp;&nbsp;&nbsp;is&nbsp;&nbsp;&nbsp;BBBBB&nbsp;</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">);&nbsp;<br>cout&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #800000">"</span><span style="COLOR: #800000">vcs.push!&nbsp;</span><span style="COLOR: #800000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">endl;&nbsp;<br>}&nbsp;<br>i</span><span style="COLOR: #000000">=</span><span style="COLOR: #800080">8</span><span style="COLOR: #000000">;&nbsp;<br>}&nbsp;<br>}<br>典型的迭代器失效<img alt="" src="http://www.cnblogs.com/Images/dot.gif">.</span></span></div>
&nbsp; </div>
<div style="LINE-HEIGHT: 150%; LAYOUT-GRID-MODE: char" align=left>
<div style="LINE-HEIGHT: 150%; LAYOUT-GRID-MODE: char" align=left><font size=3><font style="BACKGROUND-COLOR: #ff0000">vector</font>：<br>1.当插入（push_back）一个元素后，end操作返回的迭代器肯定失效。<br>2.当插入(push_back)一个元素后，capacity返回值与没有插入元素之前相比有改变，则需要重新加载整个容器，此时first和end操作返回的迭代器都会失效。<br>3.当进行删除操作（erase，pop_back）后，指向删除点的迭代器全部失效；指向删除点后面的元素的迭代器也将全部失效。</font></div>
<div style="LINE-HEIGHT: 150%; LAYOUT-GRID-MODE: char" align=left><font size=3></font></div>
<div><font size=3><font style="BACKGROUND-COLOR: #ff0000">deque</font>迭代器的失效情况：<br>1.在deque容器首部或者尾部插入元素不会使得任何迭代器失效。<br>2.在其首部或尾部删除元素则只会使指向被删除元素的迭代器失效。<br>3.在deque容器的任何其他位置的插入和删除操作将使指向该容器元素的所有迭代器失效。</font></div>
<div><font style="BACKGROUND-COLOR: #ff0000" size=4>List/set/map</font></div>
<div style="LINE-HEIGHT: 150%; LAYOUT-GRID-MODE: char" align=left><span style="LINE-HEIGHT: 150%; FONT-SIZE: 12pt">1.</span><span style="LINE-HEIGHT: 150%; FONT-SIZE: 12pt">删除时，指向该删除节点的迭代器失效</span></div>
<div style="LINE-HEIGHT: 150%; LAYOUT-GRID-MODE: char" align=left><span style="LINE-HEIGHT: 150%; FONT-SIZE: 12pt">
<div class=cnblogs_code><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="COLOR: #000000">list</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;intList;&nbsp;<br>list</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::iterator&nbsp;it&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;intList.begin();&nbsp;<br></span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(it&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;intList.end())&nbsp;<br>{&nbsp;<br>it&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;intList.erase(it);&nbsp;<br>&#8230;&#8230;&nbsp;<br>}<br></span></div>
</span></div>
<div style="LINE-HEIGHT: 150%; LAYOUT-GRID-MODE: char" align=left><span style="LINE-HEIGHT: 150%; FONT-SIZE: 12pt">四.选择时机&lt;转&gt;--总结各种容器特点</span></div>
<div style="LINE-HEIGHT: 150%; LAYOUT-GRID-MODE: char" align=left><span style="LINE-HEIGHT: 150%; FONT-SIZE: 12pt">(1) vector<br>内部数据结构：数组。<br>随机访问每个元素，所需要的时间为常量。<br>在末尾增加或删除元素所需时间与元素数目无关，在中间或开头增加或删除元素所需时间随元素数目呈线性变化。<br>可动态增加或减少元素，内存管理自动完成，但程序员可以使用reserve()成员函数来管理内存。<br>vector的迭代器在内存重新分配时将失效（它所指向的元素在该操作的前后不再相同）。当把超过capacity()-size()个元素插入vector中时，内存会重新分配，所有的迭代器都将失效；否则，指向当前元素以后的任何元素的迭代器都将失效。当删除元素时，指向被删除元素以后的任何元素的迭代器都将失效。<br><br>(2)deque<br>内部数据结构：数组。<br>随机访问每个元素，所需要的时间为常量。<br>在开头和末尾增加元素所需时间与元素数目无关，在中间增加或删除元素所需时间随元素数目呈线性变化。<br>可动态增加或减少元素，内存管理自动完成，不提供用于内存管理的成员函数。<br>增加任何元素都将使deque的迭代器失效。在deque的中间删除元素将使迭代器失效。在deque的头或尾删除元素时，只有指向该元素的迭代器失效。<br><br>(3)list<br>内部数据结构：双向环状链表。<br>不能随机访问一个元素。<br>可双向遍历。<br>在开头、末尾和中间任何地方增加或删除元素所需时间都为常量。<br>可动态增加或减少元素，内存管理自动完成。<br>增加任何元素都不会使迭代器失效。删除元素时，除了指向当前被删除元素的迭代器外，其它迭代器都不会失效。<br><br>(4)slist<br>内部数据结构：单向链表。<br>不可双向遍历，只能从前到后地遍历。<br>其它的特性同list相似。<br><br>(5)stack<br>适配器，它可以将任意类型的序列容器转换为一个堆栈，一般使用deque作为支持的序列容器。<br>元素只能后进先出（LIFO）。<br>不能遍历整个stack。<br><br>(6)queue<br>适配器，它可以将任意类型的序列容器转换为一个队列，一般使用deque作为支持的序列容器。<br>元素只能先进先出（FIFO）。<br>不能遍历整个queue。<br><br>(7)priority_queue<br>适配器，它可以将任意类型的序列容器转换为一个优先级队列，一般使用vector作为底层存储方式。<br>只能访问第一个元素，不能遍历整个priority_queue。<br>第一个元素始终是优先级最高的一个元素。<br><br>(8)set<br>键和值相等。<br>键唯一。<br>元素默认按升序排列。<br>如果迭代器所指向的元素被删除，则该迭代器失效。其它任何增加、删除元素的操作都不会使迭代器失效。<br><br>(9)multiset<br>键可以不唯一。<br>其它特点与set相同。<br><br>(10)hash_set<br>与set相比较，它里面的元素不一定是经过排序的，而是按照所用的hash函数分派的，它能提供更快的搜索速度（当然跟hash函数有关）。<br>其它特点与set相同。<br><br>(11)hash_multiset<br>键可以不唯一。<br>其它特点与hash_set相同。<br><br>(12)map<br>键唯一。<br>元素默认按键的升序排列。<br>如果迭代器所指向的元素被删除，则该迭代器失效。其它任何增加、删除元素的操作都不会使迭代器失效。<br><br>(13)multimap<br>键可以不唯一。<br>其它特点与map相同。<br><br>(14)hash_map<br>与map相比较，它里面的元素不一定是按键值排序的，而是按照所用的hash函数分派的，它能提供更快的搜索速度（当然也跟hash函数有关）。<br>其它特点与map相同。<br><br>(15)hash_multimap<br>键可以不唯一。<br>其它特点与hash_map相同。<br></span></div>
<div style="LINE-HEIGHT: 150%; LAYOUT-GRID-MODE: char" align=left></div>
</span></div>
</span></span></font></div>
<br>转自：<a href="http://www.cnblogs.com/lichkingct/archive/2009/05/04/1449101.html">http://www.cnblogs.com/lichkingct/archive/2009/05/04/1449101.html</a></div>
<img src ="http://www.cppblog.com/flyinghare/aggbug/141037.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghare/" target="_blank">会飞的兔子</a> 2011-03-03 10:49 <a href="http://www.cppblog.com/flyinghare/archive/2011/03/03/141037.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习STL MAP, STL SET之数据结构基础</title><link>http://www.cppblog.com/flyinghare/archive/2011/03/03/141024.html</link><dc:creator>会飞的兔子</dc:creator><author>会飞的兔子</author><pubDate>Thu, 03 Mar 2011 00:49:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghare/archive/2011/03/03/141024.html</guid><wfw:comment>http://www.cppblog.com/flyinghare/comments/141024.html</wfw:comment><comments>http://www.cppblog.com/flyinghare/archive/2011/03/03/141024.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghare/comments/commentRss/141024.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghare/services/trackbacks/141024.html</trackback:ping><description><![CDATA[<span style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Simsun; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span><span style="TEXT-ALIGN: left; LINE-HEIGHT: 21px; FONT-FAMILY: verdana, sans-serif; FONT-SIZE: 14px" class=Apple-style-span>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">作者：<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" href="http://www.winterxy.com/blog/000029.html" target=_blank>&nbsp;winter</a></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">摘要：本文列出几个基本的STL map和STL set的问题，通过解答这些问题讲解了STL关联容器内部的数据结构，最后提出了关于UNIX/LINUX自带平衡二叉树库函数和map, set选择问题，并分析了map, set的优势之处。对于希望深入学习STL和希望了解STL map等关联容器底层数据结构的朋友来说，有一定的参考价值。</p>
<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name=more></a>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px" lang=zh-cn>STL map和set的使用虽不复杂，但也有一些不易理解的地方，如：<br></span></p>
<li style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">为何map和set的插入删除效率比用其他序列容器高？</li>
<li style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">为何每次insert之后，以前保存的iterator不会失效？</li>
<li style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">为何map和set不能像vector一样有个reserve函数来预分配数据？</li>
<li style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px">当数据元素增多时（10000到20000个比较），map和set的插入和搜索速度变化如何？
<p style="PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px" lang=zh-cn>或许有得人能回答出来大概原因，但要彻底明白，还需要了解STL的底层数据结构。</span></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px" lang=zh-cn>C++ STL 之所以得到广泛的赞誉，也被很多人使用，不只是提供了像vector, string, list等方便的容器，更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构操作。vector封装数组，list封装了链表，map和set封装了二叉树等，在封装这些数据结构的时候，STL按照程序员的使用习惯，以成员函数方式提供的常用操作，如：插入、排序、删除、查找等。让用户在STL使用过程中，并不会感到陌生。</span></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px" lang=zh-cn>C++ STL中标准关联容器set, multiset, map, multimap内部采用的就是一种非常高效的平衡检索二叉树：红黑树，也成为RB树(Red-Black Tree)。RB树</span>的统计性能要好于<span style="LINE-HEIGHT: 21px" lang=zh-cn>一般的</span><a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" href="http://www.nist.gov/dads/HTML/avltree.html" target=_blank>平衡二叉树</a>(有些书籍根据作者姓名，Adelson-Velskii和Landis，将其称为AVL-树)<span style="LINE-HEIGHT: 21px" lang=zh-cn>，所以被STL选择作为了关联容器的内部结构。本文并不会介绍详细AVL树和RB树的实现以及他们的优劣，关于RB树的详细实现参看</span><a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" href="http://www.frontfree.net/view/article_606.html" target=_blank>红黑树: 理论与实现(理论篇)</a><span style="LINE-HEIGHT: 21px" lang=zh-cn>。本文针对开始提出的几个问题的回答，来向大家简单介绍map和set的底层数据结构。</span></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px" lang=zh-cn>为何map和set的插入删除效率比用其他序列容器高？</span></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px" lang=zh-cn>大部分人说，很简单，因为对于关联容器来说，不需要做内存拷贝和内存移动。说对了，确实如此。map和set容器内所有元素都是以节点的方式来存储，其节点结构和链表差不多，指向父节点和子节点。结构图可能如下：</span></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px" lang=zh-cn>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; / \<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B&nbsp;&nbsp; C<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; / \ / \<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D&nbsp; E F&nbsp; G</span></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px" lang=zh-cn>因此插入的时候只需要稍做变换，把节点的指针指向新的节点就可以了。删除的时候类似，稍做变换后把指向删除节点的指针指向其他节点就OK了。这里的一切操作就是指针换来换去，和内存移动没有关系。</span></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px" lang=zh-cn>为何每次insert之后，以前保存的iterator不会失效？</span></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px" lang=zh-cn>看见了上面答案的解释，你应该已经可以很容易解释这个问题。iterator这里就相当于指向节点的指针，内存没有变，指向内存的指针怎么会失效呢(当然被删除的那个元素本身已经失效了)。相对于vector来说，每一次删除和插入，指针都有可能失效，调用push_back在尾部插入也是如此。因为为了保证内部数据的连续存放，iterator指向的那块内存在删除和插入过程中可能已经被其他内存覆盖或者内存已经被释放了。即使时push_back的时候，容器内部空间可能不够，需要一块新的更大的内存，只有把以前的内存释放，申请新的更大的内存，复制已有的数据元素到新的内存，最后把需要插入的元素放到最后，那么以前的内存指针自然就不可用了。特别时在和find等算法在一起使用的时候，牢记这个原则：不要使用过期的iterator。</span></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px" lang=zh-cn>为何map和set不能像vector一样有个reserve函数来预分配数据？</span></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px" lang=zh-cn>我以前也这么问，究其原理来说时，引起它的原因在于在map和set内部存储的已经不是元素本身了，而是包含元素的节点。也就是说</span>map<span style="LINE-HEIGHT: 21px" lang=zh-cn>内部使用的Alloc并不是map</span>&lt;Key, Data, Compare, Alloc&gt;<span style="LINE-HEIGHT: 21px" lang=zh-cn>声明的时候从参数中传入的Alloc。例如：</span></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: Fixedsys; COLOR: rgb(0,0,255)">map</span><span style="LINE-HEIGHT: 21px; FONT-FAMILY: Fixedsys"><span style="LINE-HEIGHT: 21px" lang=zh-cn>&lt;</span></span><span style="LINE-HEIGHT: 21px; FONT-FAMILY: Fixedsys; COLOR: rgb(0,0,255)">int</span><span style="LINE-HEIGHT: 21px; FONT-FAMILY: Fixedsys"><span style="LINE-HEIGHT: 21px" lang=zh-cn>,&nbsp;</span></span><span style="LINE-HEIGHT: 21px; FONT-FAMILY: Fixedsys; COLOR: rgb(0,0,255)">int</span><span style="LINE-HEIGHT: 21px; FONT-FAMILY: Fixedsys"><span style="LINE-HEIGHT: 21px" lang=zh-cn>,&nbsp;</span></span><span style="LINE-HEIGHT: 21px; FONT-FAMILY: Fixedsys; COLOR: rgb(0,0,255)">less</span><span style="LINE-HEIGHT: 21px; FONT-FAMILY: Fixedsys"><span style="LINE-HEIGHT: 21px" lang=zh-cn>&lt;</span></span><span style="LINE-HEIGHT: 21px; FONT-FAMILY: Fixedsys; COLOR: rgb(0,0,255)">int</span><span style="LINE-HEIGHT: 21px; FONT-FAMILY: Fixedsys"><span style="LINE-HEIGHT: 21px" lang=zh-cn>&gt;, Alloc&lt;</span></span><span style="LINE-HEIGHT: 21px; FONT-FAMILY: Fixedsys; COLOR: rgb(0,0,255)">int</span><span style="LINE-HEIGHT: 21px; FONT-FAMILY: Fixedsys"><span style="LINE-HEIGHT: 21px" lang=zh-cn>&gt; &gt; intmap;</span></span></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px" lang=zh-cn>这时候在intmap中使用的allocator并不是Alloc&lt;int&gt;, 而是通过了转换的Alloc，具体转换的方法时在内部通过Alloc&lt;int&gt;::rebind重新定义了新的节点分配器，详细的实现参看<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" href="http://stl.winterxy.com/html/000022.html" target=_blank>彻底学习STL中的Allocator</a>。其实你就记住一点，在map和set内面的分配器已经发生了变化，reserve方法你就不要奢望了。</span></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px" lang=zh-cn>当数据元素增多时（10000和20000个比较），map和set的插入和搜索速度变化如何？</span></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px" lang=zh-cn>如果你知道log2的关系你应该就彻底了解这个答案。在map和set中查找是使用二分查找，也就是说，如果有16个元素，最多需要比较4次就能找到结果，有32个元素，最多比较5次。那么有10000个呢？最多比较的次数为log10000，最多为14次，如果是20000个元素呢？最多不过15次。看见了吧，当数据量增大一倍的时候，搜索次数只不过多了1次，多了1/14的搜索时间而已。你明白这个道理后，就可以安心往里面放入元素了。</span></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px" lang=zh-cn>最后，对于map和set Winter还要提的就是它们和一个c语言包装库的效率比较。在许多unix和linux平台下，都有一个库叫isc，里面就提供类似于以下声明的函数:</span></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px; FONT-FAMILY: Fixedsys"><span style="LINE-HEIGHT: 21px" lang=zh-cn><span style="LINE-HEIGHT: 21px; COLOR: rgb(0,0,255)">void</span>&nbsp;tree_init(</span><span style="LINE-HEIGHT: 21px; COLOR: rgb(0,0,255)">void</span><span style="LINE-HEIGHT: 21px" lang=zh-cn>&nbsp;**tree);<br></span><span style="LINE-HEIGHT: 21px; COLOR: rgb(0,0,255)">void</span><span style="LINE-HEIGHT: 21px" lang=zh-cn>&nbsp;*tree_srch(</span><span style="LINE-HEIGHT: 21px; COLOR: rgb(0,0,255)">void</span><span style="LINE-HEIGHT: 21px" lang=zh-cn>&nbsp;**tree,&nbsp;</span><span style="LINE-HEIGHT: 21px; COLOR: rgb(0,0,255)">int</span><span style="LINE-HEIGHT: 21px" lang=zh-cn>&nbsp;(*compare)(),&nbsp;</span><span style="LINE-HEIGHT: 21px; COLOR: rgb(0,0,255)">void</span><span style="LINE-HEIGHT: 21px" lang=zh-cn>&nbsp;*data);<br></span><span style="LINE-HEIGHT: 21px; COLOR: rgb(0,0,255)">void</span><span style="LINE-HEIGHT: 21px" lang=zh-cn>&nbsp;tree_add(</span><span style="LINE-HEIGHT: 21px; COLOR: rgb(0,0,255)">void</span><span style="LINE-HEIGHT: 21px" lang=zh-cn>&nbsp;**tree,&nbsp;</span><span style="LINE-HEIGHT: 21px; COLOR: rgb(0,0,255)">int</span><span style="LINE-HEIGHT: 21px" lang=zh-cn>&nbsp;(*compare)(),&nbsp;</span><span style="LINE-HEIGHT: 21px; COLOR: rgb(0,0,255)">void</span><span style="LINE-HEIGHT: 21px" lang=zh-cn>&nbsp;*data,&nbsp;</span><span style="LINE-HEIGHT: 21px; COLOR: rgb(0,0,255)">void</span><span style="LINE-HEIGHT: 21px" lang=zh-cn>&nbsp;(*del_uar)());<br></span><span style="LINE-HEIGHT: 21px; COLOR: rgb(0,0,255)">int</span><span style="LINE-HEIGHT: 21px" lang=zh-cn>&nbsp;tree_delete(</span><span style="LINE-HEIGHT: 21px; COLOR: rgb(0,0,255)">void</span><span style="LINE-HEIGHT: 21px" lang=zh-cn>&nbsp;**tree,&nbsp;</span><span style="LINE-HEIGHT: 21px; COLOR: rgb(0,0,255)">int</span><span style="LINE-HEIGHT: 21px" lang=zh-cn>&nbsp;(*compare)(),&nbsp;</span><span style="LINE-HEIGHT: 21px; COLOR: rgb(0,0,255)">void</span><span style="LINE-HEIGHT: 21px" lang=zh-cn>&nbsp;*data,</span><span style="LINE-HEIGHT: 21px; COLOR: rgb(0,0,255)">void</span><span style="LINE-HEIGHT: 21px" lang=zh-cn>&nbsp;(*del_uar)());<br></span><span style="LINE-HEIGHT: 21px; COLOR: rgb(0,0,255)">int</span><span style="LINE-HEIGHT: 21px" lang=zh-cn>&nbsp;tree_trav(</span><span style="LINE-HEIGHT: 21px; COLOR: rgb(0,0,255)">void</span><span style="LINE-HEIGHT: 21px" lang=zh-cn>&nbsp;**tree,&nbsp;</span><span style="LINE-HEIGHT: 21px; COLOR: rgb(0,0,255)">int</span><span style="LINE-HEIGHT: 21px" lang=zh-cn>&nbsp;(*trav_uar)());<br></span><span style="LINE-HEIGHT: 21px; COLOR: rgb(0,0,255)">void</span><span style="LINE-HEIGHT: 21px" lang=zh-cn>&nbsp;tree_mung(</span><span style="LINE-HEIGHT: 21px; COLOR: rgb(0,0,255)">void</span><span style="LINE-HEIGHT: 21px" lang=zh-cn>&nbsp;**tree,&nbsp;</span><span style="LINE-HEIGHT: 21px; COLOR: rgb(0,0,255)">void</span><span style="LINE-HEIGHT: 21px" lang=zh-cn>&nbsp;(*del_uar</span>)());</span></p>
<p style="PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px"><span style="LINE-HEIGHT: 21px" lang=zh-cn>许多人认为直接使用这些函数会比STL map速度快，因为STL map中使用了许多模板什么的。其实不然，它们的区别并不在于算法，而在于内存碎片。如果直接使用这些函数，你需要自己去new一些节点，当节点特别多，而且进行频繁的删除和插入的时候，内存碎片就会存在，而STL采用自己的Allocator分配内存，以内存池的方式来管理这些内存，会大大减少内存碎片，从而会提升系统的整体性能。Winter在自己的系统中做过测试，把以前所有直接用isc函数的代码替换成map，程序速度基本一致。当时间运行很长时间后（例如后台服务程序），map的优势就会体现出来。从另外一个方面讲，使用map会大大降低你的编码难度，同时增加程序的可读性。何乐而不为？</span></p>
</li>
</span></span><br>转自：<a href="http://www.cppblog.com/flyinghare/admin/EditPosts.aspx"><u><font color=#800080>http://www.cppblog.com/flyinghare/admin/EditPosts.aspx</font></u></a>
<img src ="http://www.cppblog.com/flyinghare/aggbug/141024.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghare/" target="_blank">会飞的兔子</a> 2011-03-03 08:49 <a href="http://www.cppblog.com/flyinghare/archive/2011/03/03/141024.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Boost filesystem 学习指南</title><link>http://www.cppblog.com/flyinghare/archive/2010/12/29/137660.html</link><dc:creator>会飞的兔子</dc:creator><author>会飞的兔子</author><pubDate>Wed, 29 Dec 2010 05:42:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghare/archive/2010/12/29/137660.html</guid><wfw:comment>http://www.cppblog.com/flyinghare/comments/137660.html</wfw:comment><comments>http://www.cppblog.com/flyinghare/archive/2010/12/29/137660.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghare/comments/commentRss/137660.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghare/services/trackbacks/137660.html</trackback:ping><description><![CDATA[<p style="line-height: normal; color: rgb(85, 91, 110); font-family: Arial; font-size: 12px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">Boost--filesystem</p><p style="line-height: normal; color: rgb(85, 91, 110); font-family: Arial; font-size: 12px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">头文件<br style="line-height: normal; ">#include &lt;boost/filesystem.hpp&gt;<br style="line-height: normal; ">所有Boost.Filesystem库的内容都处于名空间boost::filesystem之内。</p><p style="line-height: normal; color: rgb(85, 91, 110); font-family: Arial; font-size: 12px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">认识basic_path类<br style="line-height: normal; ">在Boost.Filesystem库里basic_path是最重要的类，它以系统无关的方式保存路径、文件名。象std::basic_string 一样，针对char和wchar_t，分别特化了path和wpath。</p><p style="line-height: normal; color: rgb(85, 91, 110); font-family: Arial; font-size: 12px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">basic_path的构造函数:</p><p style="line-height: normal; color: rgb(85, 91, 110); font-family: Arial; font-size: 12px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">basic_path( const string_type &amp; s ); basic_path( const value_type * s ); template &lt;class InputIterator&gt; basic_path(InputIterator s, InputIterator last);输入参数是一个字符串（或字符迭代器），表示路径名，可以输入系统原生路径名或可移植路径名<br style="line-height: normal; ">原生路径名没啥好说的，比如C:\Windows; D:\abc\ttt.txt等<br style="line-height: normal; ">可移植路径名的定义和Unix的路径定义相同，以&#8220;/&#8221;作为路径分隔符。</p><p style="line-height: normal; color: rgb(85, 91, 110); font-family: Arial; font-size: 12px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">basic_path成员函数:<br style="line-height: normal; ">成员函数 作用&nbsp;<br style="line-height: normal; ">template &lt;class InputIterator&gt;basic_path&amp; append(InputIterator first, InputIterator last); 将字符串 s 或字符序列 [first,last) 中的路径元素追加到保存的路径中。&nbsp;<br style="line-height: normal; ">basic_path&amp; remove_filename(); 去除路径中的文件名&nbsp;<br style="line-height: normal; ">basic_path&amp; replace_extension( const string_type &amp; new_extension = "" ); 替换扩展名&nbsp;<br style="line-height: normal; ">string_type string() 得到可移植路径名&nbsp;<br style="line-height: normal; ">string_type file_string() 得到系统原生文件名&nbsp;<br style="line-height: normal; ">string_type directory_string() 得到系统原生路径名&nbsp;<br style="line-height: normal; ">string_type root_name() const; 得到根名&nbsp;<br style="line-height: normal; ">string_type root_directory() const; 得到根目录&nbsp;<br style="line-height: normal; ">basic_path root_path() const; 得到根路径：根名+根目录&nbsp;<br style="line-height: normal; ">basic_path relative_path() const; 得到相对路径&nbsp;<br style="line-height: normal; ">string_type filename() const; 得到文件名&nbsp;<br style="line-height: normal; ">basic_path parent_path() const; 得到父路径：根路径+相对路径&nbsp;<br style="line-height: normal; ">string_type stem(const Path &amp; p) const; 得到不带扩展名的文件名&nbsp;<br style="line-height: normal; ">string_type extension(const Path &amp; p) const; 得到扩展名&nbsp;<br style="line-height: normal; ">bool empty() const; path未赋值&nbsp;<br style="line-height: normal; ">bool is_complete() const; 是否是完整路径&nbsp;<br style="line-height: normal; ">bool has_root_path() const;<br style="line-height: normal; ">bool has_root_name() const;<br style="line-height: normal; ">bool has_root_directory() const;<br style="line-height: normal; ">bool has_relative_path() const;<br style="line-height: normal; ">bool has_filename() const;<br style="line-height: normal; ">bool has_branch_path() const; 路经中是否包含指定的项</p><p style="line-height: normal; color: rgb(85, 91, 110); font-family: Arial; font-size: 12px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><br style="line-height: normal; ">测试代码:<br style="line-height: normal; ">#include "boost/filesystem.hpp"&nbsp;&nbsp; // 包含所有需要的 Boost.Filesystem 声明&nbsp;<br style="line-height: normal; ">#include &lt;iostream&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 使用 std::cout&nbsp;<br style="line-height: normal; ">namespace fs = boost::filesystem;&nbsp;<br style="line-height: normal; ">// 宏FSTEST：测试f的成员函数，输出成员函数名和结果&nbsp;<br style="line-height: normal; ">#define FSTEST(x) std::cout &lt;&lt; #x##": " &lt;&lt; f.x &lt;&lt; std::endl&nbsp;<br style="line-height: normal; ">int main()&nbsp;<br style="line-height: normal; ">{&nbsp;<br style="line-height: normal; ">fs::path f("<a href="file://folder2//folder3//filename.ext" style="color: rgb(0, 79, 97); font-size: 12px; font-family: Verdana, Arial, Helvetica, sans-serif; font-weight: normal; text-decoration: none; line-height: normal; ">\\folder1\\folder2\\folder3\\filename.ext</a>");&nbsp;<br style="line-height: normal; "><br style="line-height: normal; ">FSTEST(string());&nbsp;<br style="line-height: normal; ">FSTEST(file_string());&nbsp;<br style="line-height: normal; ">FSTEST(directory_string());&nbsp;<br style="line-height: normal; ">FSTEST(root_name());&nbsp;<br style="line-height: normal; ">FSTEST(root_directory());&nbsp;<br style="line-height: normal; ">FSTEST(root_path());&nbsp;<br style="line-height: normal; ">FSTEST(relative_path());&nbsp;<br style="line-height: normal; ">FSTEST(filename());&nbsp;<br style="line-height: normal; ">FSTEST(parent_path());&nbsp;<br style="line-height: normal; ">FSTEST(stem());&nbsp;<br style="line-height: normal; ">FSTEST(extension());&nbsp;<br style="line-height: normal; "><br style="line-height: normal; ">FSTEST(replace_extension("new"));&nbsp;<br style="line-height: normal; ">char buf[]="hello";&nbsp;<br style="line-height: normal; ">FSTEST(append(buf, buf+sizeof(buf)));&nbsp;<br style="line-height: normal; ">FSTEST(remove_filename());&nbsp;<br style="line-height: normal; "><br style="line-height: normal; ">return 0;&nbsp;<br style="line-height: normal; ">}</p><p style="line-height: normal; color: rgb(85, 91, 110); font-family: Arial; font-size: 12px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><br style="line-height: normal; ">输出：<br style="line-height: normal; ">string(): /folder1/folder2/folder3/filename.ext file_string(): \folder1\folder2\folder3\filename.ext directory_string(): \folder1\folder2\folder3\filename.ext root_name(): root_directory(): / root_path(): / relative_path(): folder1/folder2/folder3/filename.ext filename(): filename.ext parent_path(): /folder1/folder2/folder3 stem(): filename extension(): .ext replace_extension("new"): /folder1/folder2/folder3/filename.new append(buf, buf+sizeof(buf)): /folder1/folder2/folder3/filename.new/hello remove_filename(): /folder1/folder2/folder3/filename.new/</p><p style="line-height: normal; color: rgb(85, 91, 110); font-family: Arial; font-size: 12px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">常用函数<br style="line-height: normal; ">函数名 作用&nbsp;<br style="line-height: normal; ">system_complete(path); 返回完整路径(相对路径+当前路径)&nbsp;<br style="line-height: normal; ">exists(path); 文件是否存在&nbsp;<br style="line-height: normal; ">is_directory(path);<br style="line-height: normal; ">is_directory(file_status); 是否是路径&nbsp;<br style="line-height: normal; ">is_regular_file(path);<br style="line-height: normal; ">is_regular_file(file_status); 是否是普通文件&nbsp;<br style="line-height: normal; ">is_symlink(path);<br style="line-height: normal; ">is_symlink(file_status); 是否是一个链接文件&nbsp;<br style="line-height: normal; ">file_status status(path); 返回路径名对应的状态&nbsp;<br style="line-height: normal; ">template &lt;class Path&gt; const Path&amp; initial_path(); 得到程序运行时的系统当前路径&nbsp;<br style="line-height: normal; ">template &lt;class Path&gt; Path current_path(); 得到系统当前路径&nbsp;<br style="line-height: normal; ">template &lt;class Path&gt; void current_path(const Path&amp; p); 改变当前路径&nbsp;<br style="line-height: normal; ">template &lt;class Path&gt; space_info space(const Path&amp; p); 得到指定路径下的空间信息，space_info 有capacity, free 和 available三个成员变量，分别表示容量，剩余空间和可用空间。&nbsp;<br style="line-height: normal; ">template &lt;class Path&gt; std::time_t last_write_time(const Path&amp; p); 最后修改时间&nbsp;<br style="line-height: normal; ">template &lt;class Path&gt; void last_write_time(const Path&amp; p, const std::time_t new_time); 修改最后修改时间&nbsp;<br style="line-height: normal; ">template &lt;class Path&gt; bool create_directory(const Path&amp; dp); 建立路径&nbsp;<br style="line-height: normal; ">template &lt;class Path1, class Path2&gt; void create_hard_link(const Path1&amp; to_p, const Path2&amp; from_p);<br style="line-height: normal; ">template &lt;class Path1, class Path2&gt; error_code create_hard_link(const Path1&amp; to_p,&nbsp;<br style="line-height: normal; ">const Path2&amp; from_p, error_code&amp; ec); 建立硬链接&nbsp;<br style="line-height: normal; ">template &lt;class Path1, class Path2&gt; void create_symlink(const Path1&amp; to_p, const Path2&amp; from_p);<br style="line-height: normal; ">template &lt;class Path1, class Path2&gt; error_code create_symlink(const Path1&amp; to_p, const Path2&amp; from_p, error_code&amp; ec); 建立软链接&nbsp;<br style="line-height: normal; ">template &lt;class Path&gt; void remove(const Path&amp; p, system::error_code &amp; ec = singular ); 删除文件&nbsp;<br style="line-height: normal; ">template &lt;class Path&gt; unsigned long remove_all(const Path&amp; p); 递归删除p中所有内容，返回删除文件的数量&nbsp;<br style="line-height: normal; ">template &lt;class Path1, class Path2&gt; void rename(const Path1&amp; from_p, const Path2&amp; to_p); 重命名&nbsp;<br style="line-height: normal; ">template &lt;class Path1, class Path2&gt; void copy_file(const Path1&amp; from_fp, const Path2&amp; to_fp); 拷贝文件&nbsp;<br style="line-height: normal; ">template &lt;class Path&gt; Path complete(const Path&amp; p, const Path&amp; base=initial_path&lt;Path&gt;()); 以base以基，p作为相对路径，返回其完整路径&nbsp;<br style="line-height: normal; ">template &lt;class Path&gt; bool create_directories(const Path &amp; p); 建立路径</p><p style="line-height: normal; color: rgb(85, 91, 110); font-family: Arial; font-size: 12px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><br style="line-height: normal; ">路径迭代器<br style="line-height: normal; ">basic_directory_iterator<br style="line-height: normal; ">构造函数：</p><p style="line-height: normal; color: rgb(85, 91, 110); font-family: Arial; font-size: 12px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">explicit basic_directory_iterator(const Path&amp; dp); basic_directory_iterator();basic_directory_iterator 从构造参数得到目录，每一次调用 operator++，它就查找并得到下一个文件名直到目录元素的末尾。不带参数的构造函数 basic_directory_iterator() 总是构造一个 end 迭代器对象，它是唯一一个用于结束条件的合法迭代器。</p><p style="line-height: normal; color: rgb(85, 91, 110); font-family: Arial; font-size: 12px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">示例代码，得到指定目录下的所有文件名：<br style="line-height: normal; ">void find_file( const fs::path &amp; dir_path )&nbsp;<br style="line-height: normal; ">{&nbsp;<br style="line-height: normal; ">if ( !fs::exists( dir_path ) ) return;&nbsp;<br style="line-height: normal; ">fs::directory_iterator end_itr; // 缺省构造生成一个结束迭代器&nbsp;<br style="line-height: normal; ">for ( fs::directory_iterator itr( dir_path );&nbsp;<br style="line-height: normal; ">itr != end_itr;&nbsp;<br style="line-height: normal; ">++itr )&nbsp;<br style="line-height: normal; ">{&nbsp;<br style="line-height: normal; ">if ( fs::is_directory(itr-&gt;status()) )&nbsp;<br style="line-height: normal; ">{&nbsp;<br style="line-height: normal; ">find_file( itr-&gt;path() ); //递归查找&nbsp;<br style="line-height: normal; ">}&nbsp;<br style="line-height: normal; ">else&nbsp;<br style="line-height: normal; ">{&nbsp;<br style="line-height: normal; ">std::cout &lt;&lt; *itr &lt;&lt; std::endl;&nbsp;<br style="line-height: normal; ">}&nbsp;<br style="line-height: normal; ">}&nbsp;<br style="line-height: normal; ">}</p><p style="line-height: normal; color: rgb(85, 91, 110); font-family: Arial; font-size: 12px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><br style="line-height: normal; ">basic_recursive_directory_iterator<br style="line-height: normal; ">递归遍历目录的迭代器，它的构造参数与basic_directory_iterator相同，当调用 operator++时，如果当前值是一个目录，则进入下一级目录。<br style="line-height: normal; ">它有三个成员函数： 函数名 作用&nbsp;<br style="line-height: normal; ">int level() const; 得到当前搜索深度&nbsp;<br style="line-height: normal; ">void pop(); 调用pop()后，下一次递增就会直接返回上一级目录&nbsp;<br style="line-height: normal; ">void no_push(); 调用no_push()后，即便下一个元素是目录类型也不进入</p><p style="line-height: normal; color: rgb(85, 91, 110); font-family: Arial; font-size: 12px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">示例代码，得到指定目录下的所有文件名（和上例作用相同）：<br style="line-height: normal; ">void find_file2( const fs::path &amp; dir_path )&nbsp;<br style="line-height: normal; ">{&nbsp;<br style="line-height: normal; ">fs::recursive_directory_iterator end_itr; // 缺省构造生成一个结束迭代器&nbsp;<br style="line-height: normal; ">for ( fs::recursive_directory_iterator itr( dir_path );&nbsp;<br style="line-height: normal; ">itr != end_itr;&nbsp;<br style="line-height: normal; ">++itr )&nbsp;<br style="line-height: normal; ">{&nbsp;<br style="line-height: normal; ">std::cout &lt;&lt; itr.level() &lt;&lt; *itr &lt;&lt; std::endl;&nbsp;<br style="line-height: normal; ">}</p><p style="line-height: normal; color: rgb(85, 91, 110); font-family: Arial; font-size: 12px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><br></p><p style="line-height: normal; color: rgb(85, 91, 110); font-family: Arial; font-size: 12px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">转自：<span  style="color: rgb(0, 0, 0); font-family: Simsun; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; font-size: medium; "><a href="http://hi.baidu.com/dulamhoo/blog/item/c501e83a48c2bcf4838b1380.html">http://hi.baidu.com/dulamhoo/blog/item/c501e83a48c2bcf4838b1380.html</a></span></p>
<img src ="http://www.cppblog.com/flyinghare/aggbug/137660.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghare/" target="_blank">会飞的兔子</a> 2010-12-29 13:42 <a href="http://www.cppblog.com/flyinghare/archive/2010/12/29/137660.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Python怎么读写ini文件</title><link>http://www.cppblog.com/flyinghare/archive/2010/12/09/135978.html</link><dc:creator>会飞的兔子</dc:creator><author>会飞的兔子</author><pubDate>Thu, 09 Dec 2010 08:10:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghare/archive/2010/12/09/135978.html</guid><wfw:comment>http://www.cppblog.com/flyinghare/comments/135978.html</wfw:comment><comments>http://www.cppblog.com/flyinghare/archive/2010/12/09/135978.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghare/comments/commentRss/135978.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghare/services/trackbacks/135978.html</trackback:ping><description><![CDATA[<span  style="color: rgb(61, 32, 14); font-family: Arial; font-size: 13px; line-height: 20px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><font size="4" style="line-height: normal; ">比如有一个文件Userinfo.ini，里面有这些内容：<br style="line-height: normal; "><br style="line-height: normal; ">[userinfo]<br style="line-height: normal; ">EngineVersion=0<br style="line-height: normal; ">DATVersion=5127<br style="line-height: normal; ">FileName=dat-5127.zip<br style="line-height: normal; ">FilePath=/pub/antivirus/datfiles/4.x/<br style="line-height: normal; ">FileSize=13481555<br style="line-height: normal; ">Checksum=6037,021E<br style="line-height: normal; ">MD5=aaeb519d3f276b810d46642d782d8921<br style="line-height: normal; ">那就可以通过下面这些代码得到MD5的值，简单吧<br style="line-height: normal; "></font></span><div style="font-family: Arial; word-wrap: break-word; word-break: break-all; visibility: visible !important; zoom: 1 !important; filter: none; font-size: 13px; line-height: normal; color: rgb(61, 32, 14); border-left-color: windowtext; padding-top: 4px; padding-right: 5.4pt; padding-bottom: 4px; padding-left: 5.4pt; background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(230, 230, 230); width: 501px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; background-position: 0% 50%; background-repeat: repeat repeat; "><div style="font-family: Arial; word-wrap: break-word; word-break: break-all; visibility: visible !important; zoom: 1 !important; filter: none; font-size: 13px; line-height: normal; color: rgb(61, 32, 14); "><font size="4" style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; "><span style="line-height: normal; color: rgb(0, 128, 0); ">#</span><span style="line-height: normal; color: rgb(0, 128, 0); ">!/usr/bin/env python</span><span style="line-height: normal; color: rgb(0, 128, 0); "><br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; ">#</span><span style="line-height: normal; color: rgb(0, 128, 0); ">&nbsp;-*- coding: utf-8 -*-</span><span style="line-height: normal; color: rgb(0, 128, 0); "><br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; "></span><span style="line-height: normal; color: rgb(0, 0, 0); "><br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; "></span><span style="line-height: normal; color: rgb(0, 0, 255); ">import</span><span style="line-height: normal; color: rgb(0, 0, 0); ">&nbsp;ConfigParser<br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; "><br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; ">config&nbsp;</span><span style="line-height: normal; color: rgb(0, 0, 0); ">=</span><span style="line-height: normal; color: rgb(0, 0, 0); ">&nbsp;ConfigParser.ConfigParser()<br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; ">config.readfp(open(</span><span style="line-height: normal; color: rgb(128, 0, 0); ">'</span><span style="line-height: normal; color: rgb(128, 0, 0); ">update.ini</span><span style="line-height: normal; color: rgb(128, 0, 0); ">'</span><span style="line-height: normal; color: rgb(0, 0, 0); ">))<br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; "><br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; ">a&nbsp;</span><span style="line-height: normal; color: rgb(0, 0, 0); ">=</span><span style="line-height: normal; color: rgb(0, 0, 0); ">&nbsp;config.get(</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(128, 0, 0); ">ZIP</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(0, 0, 0); ">,</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(128, 0, 0); ">MD5</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(0, 0, 0); ">)<br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; "></span><span style="line-height: normal; color: rgb(0, 0, 255); ">print</span><span style="line-height: normal; color: rgb(0, 0, 0); ">&nbsp;a</span></font></div></div><span  style="color: rgb(61, 32, 14); font-family: Arial; font-size: 13px; line-height: 20px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><font size="4" style="line-height: normal; "><br style="line-height: normal; ">&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;<br style="line-height: normal; "></font></span><span  style="color: rgb(61, 32, 14); font-family: Arial; font-size: 13px; line-height: 20px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><font size="4" style="line-height: normal; ">写也很简单：<br style="line-height: normal; "><div style="font-family: Arial; word-wrap: break-word; word-break: break-all; visibility: visible !important; zoom: 1 !important; filter: none; font-size: 13px; line-height: normal; color: rgb(61, 32, 14); border-left-color: windowtext; padding-top: 4px; padding-right: 5.4pt; padding-bottom: 4px; padding-left: 5.4pt; background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(230, 230, 230); width: 501px; background-position: 0% 50%; background-repeat: repeat repeat; "><div style="font-family: Arial; word-wrap: break-word; word-break: break-all; visibility: visible !important; zoom: 1 !important; filter: none; font-size: 13px; line-height: normal; color: rgb(61, 32, 14); "><font style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; "><span style="line-height: normal; color: rgb(0, 0, 255); ">import</span><span style="line-height: normal; color: rgb(0, 0, 0); ">&nbsp;ConfigParser<br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; "><br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; ">config&nbsp;</span><span style="line-height: normal; color: rgb(0, 0, 0); ">=</span><span style="line-height: normal; color: rgb(0, 0, 0); ">&nbsp;ConfigParser.ConfigParser()<br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; "><br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; "></span><span style="line-height: normal; color: rgb(0, 128, 0); ">#</span><span style="line-height: normal; color: rgb(0, 128, 0); ">&nbsp;set a number of parameters</span><span style="line-height: normal; color: rgb(0, 128, 0); "><br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; "></span><span style="line-height: normal; color: rgb(0, 0, 0); ">config.add_section(</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(128, 0, 0); ">book</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(0, 0, 0); ">)<br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; ">config.set(</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(128, 0, 0); ">book</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(0, 0, 0); ">,&nbsp;</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(128, 0, 0); ">title</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(0, 0, 0); ">,&nbsp;</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(128, 0, 0); ">the python standard library</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(0, 0, 0); ">)<br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; ">config.set(</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(128, 0, 0); ">book</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(0, 0, 0); ">,&nbsp;</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(128, 0, 0); ">author</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(0, 0, 0); ">,&nbsp;</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(128, 0, 0); ">fredrik lundh</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(0, 0, 0); ">)<br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; "><br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; ">config.add_section(</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(128, 0, 0); ">ematter</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(0, 0, 0); ">)<br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; ">config.set(</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(128, 0, 0); ">ematter</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(0, 0, 0); ">,&nbsp;</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(128, 0, 0); ">pages</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(0, 0, 0); ">,&nbsp;</span><span style="line-height: normal; color: rgb(0, 0, 0); ">250</span><span style="line-height: normal; color: rgb(0, 0, 0); ">)<br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; "><br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; "></span><span style="line-height: normal; color: rgb(0, 128, 0); ">#</span><span style="line-height: normal; color: rgb(0, 128, 0); ">&nbsp;write to file</span><span style="line-height: normal; color: rgb(0, 128, 0); "><br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; "></span><span style="line-height: normal; color: rgb(0, 0, 0); ">config.write(open(</span><span style="line-height: normal; color: rgb(128, 0, 0); ">'</span><span style="line-height: normal; color: rgb(128, 0, 0); ">1.ini</span><span style="line-height: normal; color: rgb(128, 0, 0); ">'</span><span style="line-height: normal; color: rgb(0, 0, 0); ">,&nbsp;</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(128, 0, 0); ">w</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(0, 0, 0); ">))<br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; "></span></font></div></div><br style="line-height: normal; ">&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;<br style="line-height: normal; ">修改也不难（添加内容）：<br style="line-height: normal; "></font></span><div style="font-family: Arial; word-wrap: break-word; word-break: break-all; visibility: visible !important; zoom: 1 !important; filter: none; font-size: 13px; line-height: normal; color: rgb(61, 32, 14); border-left-color: windowtext; padding-top: 4px; padding-right: 5.4pt; padding-bottom: 4px; padding-left: 5.4pt; background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(230, 230, 230); width: 501px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; background-position: 0% 50%; background-repeat: repeat repeat; "><div style="font-family: Arial; word-wrap: break-word; word-break: break-all; visibility: visible !important; zoom: 1 !important; filter: none; font-size: 13px; line-height: normal; color: rgb(61, 32, 14); "><font size="4" style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; "><span style="line-height: normal; color: rgb(0, 128, 0); ">#</span><span style="line-height: normal; color: rgb(0, 128, 0); ">!/usr/bin/env python</span><span style="line-height: normal; color: rgb(0, 128, 0); "><br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; ">#</span><span style="line-height: normal; color: rgb(0, 128, 0); ">&nbsp;-*- coding: utf-8 -*-</span><span style="line-height: normal; color: rgb(0, 128, 0); "><br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; "></span><span style="line-height: normal; color: rgb(0, 0, 0); "><br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; "></span><span style="line-height: normal; color: rgb(0, 0, 255); ">import</span><span style="line-height: normal; color: rgb(0, 0, 0); ">&nbsp;ConfigParser<br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; "><br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; ">config&nbsp;</span><span style="line-height: normal; color: rgb(0, 0, 0); ">=</span><span style="line-height: normal; color: rgb(0, 0, 0); ">&nbsp;ConfigParser.ConfigParser()<br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; "><br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; ">config.read(</span><span style="line-height: normal; color: rgb(128, 0, 0); ">'</span><span style="line-height: normal; color: rgb(128, 0, 0); ">1.ini</span><span style="line-height: normal; color: rgb(128, 0, 0); ">'</span><span style="line-height: normal; color: rgb(0, 0, 0); ">)<br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; "><br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; ">a&nbsp;</span><span style="line-height: normal; color: rgb(0, 0, 0); ">=</span><span style="line-height: normal; color: rgb(0, 0, 0); ">&nbsp;config.add_section(</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(128, 0, 0); ">md5</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(0, 0, 0); ">)<br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; "><br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; ">config.set(</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(128, 0, 0); ">md5</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(0, 0, 0); ">,&nbsp;</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(128, 0, 0); ">value</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(0, 0, 0); ">,&nbsp;</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(128, 0, 0); ">1234</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(0, 0, 0); ">)<br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; "><br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; ">config.write(open(</span><span style="line-height: normal; color: rgb(128, 0, 0); ">'</span><span style="line-height: normal; color: rgb(128, 0, 0); ">1.ini</span><span style="line-height: normal; color: rgb(128, 0, 0); ">'</span><span style="line-height: normal; color: rgb(0, 0, 0); ">,&nbsp;</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(128, 0, 0); ">r+</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(0, 0, 0); ">))&nbsp;&nbsp;&nbsp;&nbsp; #可以把r+改成其他方式，看看结果:)<br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; "></span></font></div></div><span  style="color: rgb(61, 32, 14); font-family: Arial; font-size: 13px; line-height: 20px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><font size="4" style="line-height: normal; "><br style="line-height: normal; ">修改内容：<br style="line-height: normal; "></font></span><div style="font-family: Arial; word-wrap: break-word; word-break: break-all; visibility: visible !important; zoom: 1 !important; filter: none; font-size: 13px; line-height: normal; color: rgb(61, 32, 14); border-left-color: windowtext; padding-top: 4px; padding-right: 5.4pt; padding-bottom: 4px; padding-left: 5.4pt; background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(230, 230, 230); width: 501px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; background-position: 0% 50%; background-repeat: repeat repeat; "><div style="font-family: Arial; word-wrap: break-word; word-break: break-all; visibility: visible !important; zoom: 1 !important; filter: none; font-size: 13px; line-height: normal; color: rgb(61, 32, 14); "><font size="4" style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; "><span style="line-height: normal; color: rgb(0, 128, 0); ">#</span><span style="line-height: normal; color: rgb(0, 128, 0); ">!/usr/bin/env python</span><span style="line-height: normal; color: rgb(0, 128, 0); "><br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; ">#</span><span style="line-height: normal; color: rgb(0, 128, 0); ">&nbsp;-*- coding: utf-8 -*-</span><span style="line-height: normal; color: rgb(0, 128, 0); "><br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; "></span><span style="line-height: normal; color: rgb(0, 0, 0); "><br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; "></span><span style="line-height: normal; color: rgb(0, 0, 255); ">import</span><span style="line-height: normal; color: rgb(0, 0, 0); ">&nbsp;ConfigParser<br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; "><br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; ">config&nbsp;</span><span style="line-height: normal; color: rgb(0, 0, 0); ">=</span><span style="line-height: normal; color: rgb(0, 0, 0); ">&nbsp;ConfigParser.ConfigParser()<br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; "><br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; ">config.read(</span><span style="line-height: normal; color: rgb(128, 0, 0); ">'</span><span style="line-height: normal; color: rgb(128, 0, 0); ">1.ini</span><span style="line-height: normal; color: rgb(128, 0, 0); ">'</span><span style="line-height: normal; color: rgb(0, 0, 0); ">)<br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; "><br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; ">config.set(</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(128, 0, 0); ">md5</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(0, 0, 0); ">,&nbsp;</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(128, 0, 0); ">value</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(0, 0, 0); ">,&nbsp;</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(128, 0, 0); ">kingsoft</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(0, 0, 0); ">)&nbsp;&nbsp;&nbsp; #这样md5就从1234变成kingsoft了<br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; "><br style="line-height: normal; "><img align="top" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="line-height: normal; ">config.write(open(</span><span style="line-height: normal; color: rgb(128, 0, 0); ">'</span><span style="line-height: normal; color: rgb(128, 0, 0); ">1.ini</span><span style="line-height: normal; color: rgb(128, 0, 0); ">'</span><span style="line-height: normal; color: rgb(0, 0, 0); ">,&nbsp;</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(128, 0, 0); ">r+</span><span style="line-height: normal; color: rgb(128, 0, 0); ">"</span><span style="line-height: normal; color: rgb(0, 0, 0); ">))</span></font></div></div><span  style="color: rgb(61, 32, 14); font-family: Arial; font-size: 13px; line-height: 20px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><font size="4" style="line-height: normal; "><br style="line-height: normal; ">删除部分（懒得写了，自己看文档）：<br style="line-height: normal; "></font></span><dl style="line-height: normal; color: rgb(61, 32, 14); font-family: Arial; font-size: 13px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><dt style="line-height: normal; "><table cellspacing="0" cellpadding="0" style="table-layout: auto; line-height: normal; "><tbody style="line-height: normal; "><tr valign="baseline" style="line-height: normal; "><td style="font-family: Arial; word-wrap: break-word; word-break: break-all; visibility: visible !important; zoom: 1 !important; filter: none; font-size: 12px; line-height: normal; "><nobr style="line-height: normal; "><font size="4" style="line-height: normal; "><strong style="line-height: normal; "><tt class="method" style="line-height: normal; ">remove_option</tt></strong>(</font></nobr></td><td style="font-family: Arial; word-wrap: break-word; word-break: break-all; visibility: visible !important; zoom: 1 !important; filter: none; font-size: 12px; line-height: normal; "><font size="4" style="line-height: normal; "><var style="line-height: normal; ">section, option</var>)</font></td></tr></tbody></table></dt><dd style="line-height: normal; "><font size="4" style="line-height: normal; ">Remove the specified&nbsp;<var style="line-height: normal; ">option</var>&nbsp;from the specified&nbsp;<var style="line-height: normal; ">section</var>. If the section does not exist, raise&nbsp;<tt class="exception" style="line-height: normal; ">NoSectionError</tt>. If the option existed to be removed, return&nbsp;<tt class="constant" style="line-height: normal; ">True</tt>; otherwise return&nbsp;<tt class="constant" style="line-height: normal; ">False</tt>.<span class="versionnote" style="line-height: normal; ">New in version 1.6.</span></font></dd></dl><p style="line-height: normal; color: rgb(61, 32, 14); font-family: Arial; font-size: 13px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "></p><dl style="line-height: normal; color: rgb(61, 32, 14); font-family: Arial; font-size: 13px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><dt style="line-height: normal; "><table cellspacing="0" cellpadding="0" style="table-layout: auto; line-height: normal; "><tbody style="line-height: normal; "><tr valign="baseline" style="line-height: normal; "><td style="font-family: Arial; word-wrap: break-word; word-break: break-all; visibility: visible !important; zoom: 1 !important; filter: none; font-size: 12px; line-height: normal; "><nobr style="line-height: normal; "><font size="4" style="line-height: normal; "><strong style="line-height: normal; "><tt class="method" style="line-height: normal; ">remove_section</tt></strong>(</font></nobr></td><td style="font-family: Arial; word-wrap: break-word; word-break: break-all; visibility: visible !important; zoom: 1 !important; filter: none; font-size: 12px; line-height: normal; "><font size="4" style="line-height: normal; "><var style="line-height: normal; ">section</var>)</font></td></tr></tbody></table></dt><dd style="line-height: normal; "><font size="4" style="line-height: normal; ">Remove the specified&nbsp;<var style="line-height: normal; ">section</var>&nbsp;from the configuration. If the section in fact existed, return&nbsp;<code style="line-height: normal; ">True</code>. Otherwise return&nbsp;<code style="line-height: normal; ">False</code>.</font></dd><div><font size="4" style="line-height: normal; ">转自：</font><a href="http://hi.baidu.com/saya_sj/blog/item/b68ea92ea82ced594fc22619.html">http://hi.baidu.com/saya_sj/blog/item/b68ea92ea82ced594fc22619.html</a></div></dl>
<img src ="http://www.cppblog.com/flyinghare/aggbug/135978.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghare/" target="_blank">会飞的兔子</a> 2010-12-09 16:10 <a href="http://www.cppblog.com/flyinghare/archive/2010/12/09/135978.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DirectX9的链接方式和编译尺寸 </title><link>http://www.cppblog.com/flyinghare/archive/2010/10/08/129005.html</link><dc:creator>会飞的兔子</dc:creator><author>会飞的兔子</author><pubDate>Fri, 08 Oct 2010 01:08:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghare/archive/2010/10/08/129005.html</guid><wfw:comment>http://www.cppblog.com/flyinghare/comments/129005.html</wfw:comment><comments>http://www.cppblog.com/flyinghare/archive/2010/10/08/129005.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghare/comments/commentRss/129005.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghare/services/trackbacks/129005.html</trackback:ping><description><![CDATA[首先，先回顾一下DX9 SDK的历史。从编译链接的角度来，DX9 SDK可以分为前后两个时期：早期需要链接静态D3DX9库文件，而从2005 February发布的DX9 SDK Update开始则正式改为链接动态库，也就是从这个版本开始，编译出来的程序开始依赖D3DX9_XX.dll了。<br>　　如果使用DX9SDK(如DX9.0A)时候使用：<br>　　#pragma comment(lib, &#8220;d3dx9&#8221;)<br>　　在这个版本中d3dx9.lib是一个静态库，其大小为4281KB，那么编译出来的的模块尺寸都非常大。然而这样做的好处是即使在干净系统的机器上，程序也可以正常运行，完全不需要再添加其他D3DX9_XX.dll或者要求用户安装DX9 Runtime Library。<br>　　而如果我们能采用 2005 February以后发行的DX9 SDK，那么模块就会变成链接d3dx9_xx.dll(此时的d3dx9.lib只是一个DLL的函数导出库)，其尺寸就会大大减少，但是会依赖 D3DX9_XX.dll了，其中XX数值由我们使用的SDK版本(发布时间)决定。例如，使用2007 August的SDK编译出来的模块就会依赖D3DX9_35.dll，其大小为3.55M。<br><br>下面，我列举出到目前为止微软的DX9 SDK对应的D3DX9_XX.dll以及该版本上与编译相关的更新：<br><br>
<table style="BORDER-COLLAPSE: collapse" border=0 cellSpacing=0 cellPadding=0>
    <tbody>
        <tr style="HEIGHT: 57.6pt">
            <td style="BORDER-BOTTOM: windowtext 1pt solid; BORDER-LEFT: windowtext 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 152.6pt; PADDING-RIGHT: 5.4pt; HEIGHT: 57.6pt; BORDER-TOP: windowtext 1pt solid; BORDER-RIGHT: windowtext 1pt solid; PADDING-TOP: 0cm" width=203>
            <p align=center><strong><span style="FONT-FAMILY: 宋体; FONT-SIZE: 14pt">D3DX SDK</span></strong></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 171pt; PADDING-RIGHT: 5.4pt; HEIGHT: 57.6pt; BORDER-TOP: 1pt solid; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=228>
            <p align=center><strong><span style="FONT-FAMILY: 宋体; FONT-SIZE: 14pt">安装的D3DX9 DLL</span></strong></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 72pt; PADDING-RIGHT: 5.4pt; HEIGHT: 57.6pt; BORDER-TOP: 1pt solid; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=96>
            <p align=center><strong><span style="FONT-FAMILY: 宋体; FONT-SIZE: 14pt">尺寸</span></strong></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 475.05pt; PADDING-RIGHT: 5.4pt; HEIGHT: 57.6pt; BORDER-TOP: 1pt solid; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=633>
            <p align=center><strong><span style="FONT-FAMILY: 宋体; FONT-SIZE: 14pt">备注</span></strong></p>
            </td>
        </tr>
        <tr style="HEIGHT: 14.4pt">
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 152.6pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=203>
            <p align=center><span style="FONT-FAMILY: 宋体">Before February 2005</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 171pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=228>
            <p align=center><span style="FONT-FAMILY: 宋体">无，静态库</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 72pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=96>
            <p align=center><span style="FONT-FAMILY: 宋体">--</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 475.05pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=633>
            <p align=center><span style="FONT-FAMILY: 宋体">在 2005 February之前DX SDK中使用静态库方式编译</span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 14.4pt">
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 152.6pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=203>
            <p align=center><span style="FONT-FAMILY: 宋体; COLOR: black">February 2005 Update</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 171pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=228>
            <p align=center><span style="FONT-FAMILY: 宋体">d3dx9_24.dll</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 72pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=96>
            <p align=center><span style="FONT-FAMILY: 宋体">2.11M</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 475.05pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=633>
            <p align=center><span style="FONT-FAMILY: 宋体">第一次使用D3DX9链接动态库方式,即d3dx9_XX.dll中的XX的最小数值为24</span></p>
            <p align=center><span style="FONT-FAMILY: 宋体">从这个版本开始不再支持Windows 2000平台上DirectX的开发</span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 14.4pt">
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 152.6pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=203>
            <p align=center><span style="FONT-FAMILY: 宋体; COLOR: black">April 2005 Update</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 171pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=228>
            <p align=center><span style="FONT-FAMILY: 宋体">d3dx9_25.dll</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 72pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=96>
            <p align=center><span style="FONT-FAMILY: 宋体">2.22M</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 475.05pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=633>
            <p align=center><span style="FONT-FAMILY: 宋体">独立出由于开发DX应用程序的UI框架(DXUT)</span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 14.4pt">
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 152.6pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=203>
            <p align=center><span style="FONT-FAMILY: 宋体; COLOR: black">June 2005 Update</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 171pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=228>
            <p align=center><span style="FONT-FAMILY: 宋体">d3dx9_26.dll</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 72pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=96>
            <p align=center><span style="FONT-FAMILY: 宋体">2.19M</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 475.05pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=633>
            <p align=center><span style="FONT-FAMILY: 宋体">首次提供了用于VS.NET 2005开发的Sample Project</span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 14.4pt">
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 152.6pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=203>
            <p align=center><span style="FONT-FAMILY: 宋体; COLOR: black">August 2005 Update</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 171pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=228>
            <p align=center><span style="FONT-FAMILY: 宋体">d3dx9_27.dll</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 72pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=96>
            <p align=center><span style="FONT-FAMILY: 宋体">2.21M</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 475.05pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=633>
            <p align=center><span style="FONT-FAMILY: 宋体">可以使用DX Viewer工具查看模型文件(*.x)</span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 14.4pt">
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 152.6pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=203>
            <p align=center><span style="FONT-FAMILY: 宋体; COLOR: black">October 2005 Update</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 171pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=228>
            <p align=center><span style="FONT-FAMILY: 宋体">没有与D3DX9 DLL相关的变化</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 72pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=96>
            <p align=center><span style="FONT-FAMILY: 宋体">--</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 475.05pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=633>
            <p align=center><span style="FONT-FAMILY: 宋体">提升了对VC 2005的支持</span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 14.4pt">
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 152.6pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=203>
            <p align=center><span style="FONT-FAMILY: 宋体; COLOR: black">December 2005 Update</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 171pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=228>
            <p align=center><span style="FONT-FAMILY: 宋体">d3dx9_28.dll</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 72pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=96>
            <p align=center><span style="FONT-FAMILY: 宋体">2.21M</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 475.05pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=633>
            <p align=center><span style="FONT-FAMILY: 宋体">DirectX 10</span><span style="FONT-FAMILY: 宋体">技术预览</span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 14.4pt">
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 152.6pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=203>
            <p align=center><span style="FONT-FAMILY: 宋体; COLOR: black">February 2006 Update</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 171pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=228>
            <p align=center><span style="FONT-FAMILY: 宋体">d3dx9_29.dll</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 72pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=96>
            <p align=center><span style="FONT-FAMILY: 宋体">2.22M</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 475.05pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=633>
            <p align=center><span style="FONT-FAMILY: 宋体">--</span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 14.4pt">
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 152.6pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=203>
            <p align=center><span style="FONT-FAMILY: 宋体; COLOR: black">April 2006 Update</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 171pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=228>
            <p align=center><span style="FONT-FAMILY: 宋体">d3dx9_30.dll</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 72pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=96>
            <p align=center><span style="FONT-FAMILY: 宋体">2.27M</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 475.05pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=633>
            <p align=center><span style="FONT-FAMILY: 宋体">添加了DirectX 10 Sample</span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 14.4pt">
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 152.6pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=203>
            <p align=center><span style="FONT-FAMILY: 宋体; COLOR: black">June 2006 Update</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 171pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=228>
            <p align=center><span style="FONT-FAMILY: 宋体">没有与D3DX9 DLL相关的变化</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 72pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=96>
            <p align=center><span style="FONT-FAMILY: 宋体">--</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 475.05pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=633>
            <p align=center><span style="FONT-FAMILY: 宋体">更新了DirectX 10技术预览</span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 14.4pt">
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 152.6pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=203>
            <p align=center><span style="FONT-FAMILY: 宋体; COLOR: black">August 2006 Update</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 171pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=228>
            <p align=center><span style="FONT-FAMILY: 宋体">没有与D3DX9 DLL相关的变化</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 72pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=96>
            <p align=center><span style="FONT-FAMILY: 宋体">--</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 475.05pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=633>
            <p align=center><span style="FONT-FAMILY: 宋体">--</span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 14.4pt">
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 152.6pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=203>
            <p align=center><span style="FONT-FAMILY: 宋体; COLOR: black">October 2006 Update</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 171pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=228>
            <p align=center><span style="FONT-FAMILY: 宋体">d3dx9_31.dll</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 72pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=96>
            <p align=center><span style="FONT-FAMILY: 宋体">2.30M</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 475.05pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=633>
            <p align=center><span style="FONT-FAMILY: 宋体">为Direct3D 9提供了新的HLSL Shader编译器</span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 14.4pt">
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 152.6pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=203>
            <p align=center><span style="FONT-FAMILY: 宋体; COLOR: black">December 2006 Update</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 171pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=228>
            <p align=center><span style="FONT-FAMILY: 宋体">d3dx9_32.dll</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 72pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=96>
            <p align=center><span style="FONT-FAMILY: 宋体">3.26M</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 475.05pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=633>
            <p align=center><span style="FONT-FAMILY: 宋体">提供了DirectX 10第一次官方发布版本</span></p>
            <p align=center><span style="FONT-FAMILY: 宋体">扩展了D3DX函数功能(Direct3D9Ex)</span></p>
            <p align=center><span style="FONT-FAMILY: 宋体">不再支持Windows 95/98/SE/ME</span></p>
            <p align=center><span style="FONT-FAMILY: 宋体">不再支持Shader Model 1</span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 14.4pt">
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 152.6pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=203>
            <p align=center><span style="FONT-FAMILY: 宋体; COLOR: black">February 2007 Update</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 171pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=228>
            <p align=center><span style="FONT-FAMILY: 宋体">没有与D3DX9 DLL相关的变化</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 72pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=96>
            <p align=center><span style="FONT-FAMILY: 宋体">--</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 475.05pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=633>
            <p align=center><span style="FONT-FAMILY: 宋体">为Direct3D9Ex提供了文档<span>(<span style="COLOR: black">Direct3D9Ex is a new version of Direct3D 9 for Vista and can actually be found in the Vista Platform SDK)</span></span></span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 14.4pt">
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 152.6pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=203>
            <p align=center><span style="FONT-FAMILY: 宋体; COLOR: black">April 2007 Update</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 171pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=228>
            <p align=center><span style="FONT-FAMILY: 宋体">d3dx9_33.dll</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 72pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=96>
            <p align=center><span style="FONT-FAMILY: 宋体">3.33M</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 475.05pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=633>
            <p align=center><span style="FONT-FAMILY: 宋体">更新了Shader编译器(不再支持<span>Shader 1.x)</span></span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 14.4pt">
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 152.6pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=203>
            <p align=center><span style="FONT-FAMILY: 宋体; COLOR: black">June 2007 Update</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 171pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=228>
            <p align=center><span style="FONT-FAMILY: 宋体">d3dx9_34.dll</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 72pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=96>
            <p align=center><span style="FONT-FAMILY: 宋体">3.33M</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 475.05pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=633>
            <p align=center><span style="FONT-FAMILY: 宋体">可用<span style="COLOR: black">Vista Direct3D9Ex APIs</span><span style="COLOR: black">了</span></span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 14.4pt">
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 152.6pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=203>
            <p align=center><span style="FONT-FAMILY: 宋体; COLOR: black">August 2007 Update</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 171pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=228>
            <p align=center><span style="FONT-FAMILY: 宋体">d3dx9_35.dll</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 72pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=96>
            <p align=center><span style="FONT-FAMILY: 宋体">3.55M</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 475.05pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=633>
            <p align=center><span style="FONT-FAMILY: 宋体">微软在此版本声称，以后发布DX SDK的速度将会是一年4次，而不是像以前一样，每两个月发布一次。</span></p>
            <p align=center><span style="FONT-FAMILY: 宋体">首次引入DirectX 10.1概念</span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 14.4pt">
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 152.6pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=203>
            <p align=center><span style="FONT-FAMILY: 宋体; COLOR: black">November 2007 Update</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 171pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=228>
            <p align=center><span style="FONT-FAMILY: 宋体">d3dx9_36.dll</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 72pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=96>
            <p align=center><span style="FONT-FAMILY: 宋体">3.56M</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 475.05pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=633>
            <p align=center><span style="FONT-FAMILY: 宋体">声称下一个版本的SDK(March 2008)中将会支持VS 2008，而不再支持VS 2003</span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 14.4pt">
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 152.6pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=203>
            <p align=center><span style="FONT-FAMILY: 宋体; COLOR: black">March 2008 Update</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 171pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=228>
            <p align=center><span style="FONT-FAMILY: 宋体">d3dx9_37.dll</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 72pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=96>
            <p align=center><span style="FONT-FAMILY: 宋体">3.61M</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 475.05pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=633>
            <p align=center><span style="FONT-FAMILY: 宋体">DirectX 10.1 RTM</span></p>
            <p align=center><span style="FONT-FAMILY: 宋体">正式放弃支持VS 2003</span></p>
            <p align=center><span style="FONT-FAMILY: 宋体">正式加入对VS 2008的支持</span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 14.4pt">
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 152.6pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=203>
            <p align=center><span style="FONT-FAMILY: 宋体; COLOR: black">June 2008 Update</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 171pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=228>
            <p align=center><span style="FONT-FAMILY: 宋体">d3dx9_38.dll</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 72pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=96>
            <p align=center><span style="FONT-FAMILY: 宋体">3.67M</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 475.05pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=633>
            <p align=center><span style="FONT-FAMILY: 宋体">HLSL</span><span style="FONT-FAMILY: 宋体">编译器被改变，可能会影响使用之前的SDK开发的代码</span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 14.4pt">
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 152.6pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=203>
            <p align=center><span style="FONT-FAMILY: 宋体; COLOR: black">August 2008 Update</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 171pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=228>
            <p align=center><span style="FONT-FAMILY: 宋体">d3dx9_39.dll</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 72pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=96>
            <p align=center><span style="FONT-FAMILY: 宋体">3.67M</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 475.05pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=633>
            <p align=center><span style="FONT-FAMILY: 宋体">--</span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 14.4pt">
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 152.6pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=203>
            <p align=center><span style="FONT-FAMILY: 宋体; COLOR: black">November 2008 Update</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 171pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=228>
            <p align=center><span style="FONT-FAMILY: 宋体">d3dx9_40.dll</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 72pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=96>
            <p align=center><span style="FONT-FAMILY: 宋体">4.17M</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 475.05pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=633>
            <p align=center><span style="FONT-FAMILY: 宋体">DirectX 11</span><span style="FONT-FAMILY: 宋体">技术预览</span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 14.4pt">
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: 1pt solid; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 152.6pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=203>
            <p align=center><span style="FONT-FAMILY: 宋体; COLOR: black">March 2009 Update</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 171pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=228>
            <p align=center><span style="FONT-FAMILY: 宋体">d3dx9_41.dll</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 72pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=96>
            <p align=center><span style="FONT-FAMILY: 宋体">未验证</span></p>
            </td>
            <td style="BORDER-BOTTOM: 1pt solid; BORDER-LEFT: medium none; PADDING-BOTTOM: 0cm; PADDING-LEFT: 5.4pt; WIDTH: 475.05pt; PADDING-RIGHT: 5.4pt; HEIGHT: 14.4pt; BORDER-TOP: medium none; BORDER-RIGHT: 1pt solid; PADDING-TOP: 0cm" width=633>
            <p align=center><span style="FONT-FAMILY: 宋体; COLOR: black">Direct2D</span><span style="FONT-FAMILY: 宋体; COLOR: black">技术预览</span></p>
            <p align=center><span style="COLOR: black">DirectWrite (text rendering) and DXGI (DirectX Graphics Infrastructure)</span><span style="FONT-FAMILY: 宋体; COLOR: black">预览</span></p>
            </td>
        </tr>
    </tbody>
</table>
注：截至此文章发布之时，MS公布了August 2009 Update，此表会持续更新中...
<div style="DISPLAY: none" id=c_jquery_test>转自：<a href="http://www.cnblogs.com/mixiyou/archive/2009/09/15/1567350.html">http://www.cnblogs.com/mixiyou/archive/2009/09/15/1567350.html</a><br><br><br><br>相关文章：<a href="http://cid-ba6a52af193f301f.spaces.live.com/blog/cns!BA6A52AF193F301F!210.entry">http://cid-ba6a52af193f301f.spaces.live.com/blog/cns!BA6A52AF193F301F!210.entry</a></div>
<script type=text/javascript>
if ($ != jQuery) {
$ = jQuery.noConflict();
}
</script>
<img src ="http://www.cppblog.com/flyinghare/aggbug/129005.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghare/" target="_blank">会飞的兔子</a> 2010-10-08 09:08 <a href="http://www.cppblog.com/flyinghare/archive/2010/10/08/129005.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VS2010下编译boost</title><link>http://www.cppblog.com/flyinghare/archive/2010/09/07/126078.html</link><dc:creator>会飞的兔子</dc:creator><author>会飞的兔子</author><pubDate>Tue, 07 Sep 2010 03:26:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghare/archive/2010/09/07/126078.html</guid><wfw:comment>http://www.cppblog.com/flyinghare/comments/126078.html</wfw:comment><comments>http://www.cppblog.com/flyinghare/archive/2010/09/07/126078.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghare/comments/commentRss/126078.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghare/services/trackbacks/126078.html</trackback:ping><description><![CDATA[<h4 id="subjcns!A1AF9E41EDCAEF99!584" class="beTitle">在vs2010下编译boost</h4>
<div id="msgcns!A1AF9E41EDCAEF99!584" class="bvMsg">
<p>（<span style="color: red;">注意红色大字体</span>）<br></p>
<p><br></p>
<p>boost最新版本1.44已经支持vs2010，然而直接下载编译会发现一堆bug；</p>
<blockquote>
<p>首先由bootstrap编译bjam的时候就会碰钉子，典型的错误就是：</p>
<p>Failed to build Boost.Jam build engine.<br>Please consult bjam.log for furter diagnostics.
</p>
<p>查看bjam.log后可以发现里面的错误信息：
</p>
<p>command.c : fatal error C1033: cannot open program database ''</p>
<div style="padding: 0px; margin: 0px; display: inline; float: none;">Technorati 标签<span style="color: #040000;">: </span><a style="color: #040000;" href="http://technorati.com/tags/boost" rel="tag">boost</a><span style="color: #040000;">,</span><a style="color: #040000;" href="http://technorati.com/tags/c%2b%2b" rel="tag">c++</a><span style="color: #040000;">,</span><a style="color: #040000;" href="http://technorati.com/tags/%e7%bc%96%e8%af%91" rel="tag">编译</a><span style="color: #040000;">,</span><a style="color: #040000;" href="http://technorati.com/tags/vs2010" rel="tag">vs2010</a></div>
</blockquote>
<p>这个问题在于一个vs编译环境。默认我们都直接进入cmd进行编译，在vs2010环境下这个是行不通的。</p>
<blockquote>
<p>其次的错误就是通过bjam编译boost库的时候，会发现编译过程中出现很多fatal，很多库编译不成功；</p>
<p>解决办法： 在开始菜单中，Microsoft Visual Studio 2010\Visual Studio Tools下运行<span style="font-family: 宋体; font-size: 14pt; color: #ff0000;">Visual Studio Command Prompt (2010)</span>，通过这个cmd进入boost的目录进行bjam的编译以及运行bjam编译boost；</p>
<ol style="color: #020000;"><span style="font-size: 10pt;">
    </span>
</ol>
<p>搞定bjam后，在Visual Studio Command Prompt (2010)下直接运行：</p>
<p>bjam --toolset=<span style="font-size: 14pt;"><span style="color: #ff0000;">msvc-10.0</span></span><span style="color: #ff0000;"></span> --with-date_time --with-program_options --with-system --with-thread --with-filesystem --with-test --with-regex --with-crypto --with-serialization</p>
<p>然后就可以去喝咖啡了</p>
<p>具体编译参数详见：<a title="http://sswflying.spaces.live.com/blog/cns!A1AF9E41EDCAEF99!515.entry" href="http://sswflying.spaces.live.com/blog/cns!A1AF9E41EDCAEF99!515.entry"><font color="#8d171c">http://sswflying.spaces.live.com/blog/cns!A1AF9E41EDCAEF99!515.entry</font></a></p>
</blockquote><span style="color: red;">boost库编译方法(zz)</span><br><br>
<p>Windows下:
</p>
<p>C++代码
</p>
<ol>
    <li>bjam.exe --build-type=minimal --with-date_time --with-filesystem --with-program_options --with-regex --with-serialization --with-system --with-thread toolset=msvc-9.0 variant=release link=static threading=multi stage&nbsp; </li>
</ol>
<pre>bjam.exe --build-type=minimal --with-date_time --with-filesystem --with-program_options --with-regex --with-serialization --with-system --with-thread toolset=msvc-9.0 variant=release link=static threading=multi stage
</pre>
<br>Linux下:
<p>C++代码
</p>
<ol>
    <li>./bjam --build-type=minimal --with-date_time --with-filesystem --with-program_options --with-regex --with-serialization --with-system --with-thread variant=release link=static threading=multi stage&nbsp; </li>
</ol>
<pre>    ./bjam --build-type=minimal --with-date_time --with-filesystem --with-program_options --with-regex --with-serialization --with-system --with-thread variant=release link=static threading=multi stage
</pre>
<p><br>:-) <br>//////////////////////////////////////////////// <br>许多新人对于编译BOOST感到无从下手，甚至因此而放弃使用BOOST，那真的太可惜了，下面我把一些常用的BOOST编译方法贴于此，同时也作为自己的笔记。 <br>首先下载bjam.exe，复制到 $BOOST$ 目录下。或者<span style="font-size: 14pt;"><span style="color: #ff0000;">自己生成bjam，打开Visual Studio 2008 命令提示窗口$BOOST$\tools\jam\src，执行 build.bat 会在$BOOST$\tools\jam\src\bin.ntx86 生成 bjam.exe 文件。复制文件 bjam.exe&nbsp; 文件到 $BOOST$\下</span></span><span style="color: #ff0000;"></span>。 <br>1.完全编译安装： <br>bjam --toolset=msvc install <br>完成后会生成一个bin.v2编译时的临时目录，手动删除。生成另一个目录C:\boost，里面为所有的头文件和库文件。头文件目录为boost_1_34_1\boost目录复制过去的。 <br>2.只编译相应的库文件 <br>bjam --toolset=msvc stage <br>完成后同样会生成bin.v2临时目录。另一个目录为stage文件，里面有对应的库文件。 <br>3.查看需要编译才能使用的库列表 <br>bjam --show-libraries <br>4.编译特定的库，如只编译regex <br>bjam --toolset=msvc --with-regex stage <br>生成的库文件在stage目录中。 <br>5.不编译某个库，如不编译regex <br>bjam --toolset=msvc --without-regex stage <br>生成的库文件在stage目录中。 <br>6.编译特定的库，如只编译regex，生成debug，多线程，共享连接版本，并保存在stage。 <br>bjam --toolset=msvc --with-regex stage debug threading=multi link=shared <br>7.生成 mt-sgd 的静态库(runtime-link-static) <br>bjam "-sTOOLS=vc-8_0" --with-thread install debug release runtime-link=static <br>8.编译regex库。 <br>bjam --toolset=msvc --with-regex stage debug release threading=multi threading=single link=shared link=static runtime-link=shared runtime-link=static <br>boost的安装方法： <br>对于DLL版本 <br>bjam --toolset=msvc link=shared runtime-link=shared threading=multi stage debug release install <br>对于lib版本 <br>bjam --toolset=msvc link=static runtime-link=shared threading=multi stage debug release install <br>另外，在$BOOST$\tools\build\v2\user-config.jam找到下面的地文 <br># ------------------- <br># MSVC configuration. <br># ------------------- <br># Configure msvc (default version, searched for in standard locations and PATH). <br># using msvc ; <br># Configure specific msvc version (searched for in standard locations and PATH). <br># using msvc : 8.0 ; <br>#在这里添加 vs2008 的配置 <br>using msvc : 9.0 : : /wd4819 /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE&nbsp; /D_SECURE_SCL=0 ; <br>#在这里添加 vs2005 的配置 <br>using msvc : 8.0 : : &lt;compileflags&gt;/wd4819 &lt;compileflags&gt;/D_CRT_SECURE_NO_DEPRECATE &lt;compileflags&gt;/D_SCL_SECURE_NO_DEPRECATE &lt;compileflags&gt;/D_SECURE_SCL=0 ;&nbsp;&nbsp;&nbsp; <br>然后进入 $BOOST$ 目录，执行bjam.exe 编译命令 <br>//下面的命令的各选项的说明： <br>//prefix&nbsp;&nbsp;&nbsp; 将boost安装到的路径（生成的头文件和库文件都会放到该路径中）。 <br>//重定义以下变量（利用-s设置）： <br>//VC80_ROOT　　 vc2005的安装路径，如果未将vc2005安装到默认位置，你必须指定该项。 <br>//TOOLS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用的编译工具，vc2005对应的是vc-8_0 <br>//PYTHON_ROOT&nbsp;&nbsp; ython的安装目录，如果未将BOOST安装到默认位置，你必须指定该项。 <br>//BUILD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编译结果选项，默认会生成尽可能多的版本，如调试版／发行版，静态库／动态库，单线程／多线程。 <br>bjam 命令说明 <br>Boost.Build V2 (Milestone 12) <br>Boost.Jam 03.1.16 <br>Project-specific help: <br>&nbsp; Project has jamfile at Jamroot <br>Usage: <br>&nbsp; bjam [options] [properties] [install|stage] <br>&nbsp; Builds and installs Boost. <br>Targets and Related Options: <br>&nbsp; install&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Install headers and compiled library files to the <br>&nbsp; =======&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; configured locations (below). <br>&nbsp; --prefix=&lt;PREFIX&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Install architecture independent files here. <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Default; C:\Boost on Win32 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Default; /usr/local on Unix. Linux, etc. <br>&nbsp; --exec-prefix=&lt;EPREFIX&gt; Install architecture dependent files here. <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Default; &lt;PREFIX&gt; <br>&nbsp; --libdir=&lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Install library files here. <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Default; &lt;EPREFIX&gt;/lib <br>&nbsp; --includedir=&lt;HDRDIR&gt;&nbsp;&nbsp; Install header files here. <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Default; &lt;PREFIX&gt;/include <br>&nbsp; stage&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Build and install only compiled library files <br>&nbsp; =====&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; to the stage directory. <br>&nbsp; --stagedir=&lt;STAGEDIR&gt;&nbsp;&nbsp; Install library files here <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Default; ./stage <br>Other Options: <br>&nbsp; --build-type=&lt;type&gt;&nbsp;&nbsp;&nbsp;&nbsp; Build the specified pre-defined set of variations <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; of the libraries. Note, that which variants get <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; built depends on what each library supports. <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; minimal (default) - Builds the single <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "release" version of the libraries. This <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; release corresponds to specifying: <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "release &lt;threading&gt;multi &lt;link&gt;shared <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;link&gt;static &lt;runtime-link&gt;shared" as the <br>Boost.Build variant to build. <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; complete - Attempts to build all possible <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; variations. <br>&nbsp; --build-dir=DIR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Build in this location instead of building <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; within the distribution tree. Recommended! <br>&nbsp; --show-libraries&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Displays the list of Boost libraries that require <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; build and installation steps, then exit. <br>&nbsp; --layout=&lt;layout&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Determines whether to choose library names <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and header locations such that multiple <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; versions of Boost or multiple compilers can <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; be used on the same system. <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; versioned (default) - Names of boost<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; binaries include the Boost version <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; number and the name and version of the <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; compiler.&nbsp; Boost headers are installed <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in a subdirectory of &lt;HDRDIR&gt; whose <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name contains the Boost version <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; number. <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; system - Binaries names do not include <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the Boost version number or the name <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and version number of the compiler. <br>Boost headers are installed directly <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; into &lt;HDRDIR&gt;.&nbsp; This option is <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; intended for system integrators who <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; are building distribution packages. <br>&nbsp; --buildid=ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Adds the specified ID to the name of built <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; libraries.&nbsp; The default is to not add anything. <br>&nbsp; --help&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; This message. <br>&nbsp; --with-&lt;library&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Build and install the specified &lt;library&gt; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If this option is used, only libraries <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; specified using this option will be built. <br>&nbsp; --without-&lt;library&gt;&nbsp;&nbsp;&nbsp;&nbsp; Do not build, stage, or install the specified <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;library&gt;. By default, all libraries are built. <br>Properties: <br>&nbsp; toolset=toolset&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Indicates the toolset to build with. <br>&nbsp; variant=debug|release&nbsp;&nbsp; Select the build variant <br>&nbsp; link=static|shared&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Whether to build static or shared libraries <br>&nbsp; threading=single|multi&nbsp; Whether to build single or multithreaded binaries <br>&nbsp; runtime-link=static|shared&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Whether to link to static or shared C and C++ runtime. <br>Configuration help: <br>&nbsp; Configuration file at $boost$\tools\build\v2 <br>&nbsp; user-config.jam <br>&nbsp; This file is used to configure your Boost.Build installation. You can modify <br>this file in place, or you can place it in a permanent location so that it <br>does not get overwritten should you get a new version of Boost.Build. See: <br>&nbsp; http://boost.org/boost-build2/doc/html/bbv2/reference.html#bbv2.reference.init <br>for documentation about possible permanent locations. <br>General command line usage: <br>&nbsp;&nbsp;&nbsp; bjam [options] [properties] [targets] <br>&nbsp; Options, properties and targets can be specified in any order. <br>Important Options: <br>&nbsp; * --clean Remove targets instead of building <br>&nbsp; * -a Rebuild everything <br>&nbsp; * -n Don't execute the commands, only print them <br>&nbsp; * -d+2 Show commands as they are executed <br>&nbsp; * -d0 Supress all informational messages <br>&nbsp; * -q Stop at first error <br>&nbsp; * --debug-configuration Diagnose configuration <br>&nbsp; * --debug-building Report which targets are built with what properties <br>&nbsp; * --debug-generator Diagnose generator search/execution <br>Further Help: <br>&nbsp; The following options can be used to obtain additional documentation. <br>&nbsp; * --help-options Print more obscure command line options. <br>&nbsp; * --help-internal Boost.Build implementation details. <br>&nbsp; * --help-doc-options Implementation details doc formatting. <br>编译所有版本: <br>bjam --toolset=msvc-8.0 --prefix=$lib-and-dll-out-dir$ --build-type=complete install <br>等待编译完成. <br>设置开发环境: <br>打开VS2005 选择 工具-&gt;选项-&gt;vc++目录 <br>设置包含文件目录$lib-and-dll-out-dir$\include\boost-1_37\boost<br>设置引用文件目录:$lib-and-dll-out-dir$\lib <br>完成.可以使用了.</p>
<p><a title="http://anders0913.javaeye.com/blog/375303#" href="http://anders0913.javaeye.com/blog/375303#"><font color="#8d171c">http://anders0913.javaeye.com/blog/375303#</font></a></p>
<br>转自： <a href="http://sswflying.spaces.live.com/blog/cns!A1AF9E41EDCAEF99!584.entry">http://sswflying.spaces.live.com/blog/cns!A1AF9E41EDCAEF99!584.entry</a><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://sswflying.spaces.live.com/blog/cns!A1AF9E41EDCAEF99!515.entry">http://sswflying.spaces.live.com/blog/cns!A1AF9E41EDCAEF99!515.entry</a><br></div><img src ="http://www.cppblog.com/flyinghare/aggbug/126078.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghare/" target="_blank">会飞的兔子</a> 2010-09-07 11:26 <a href="http://www.cppblog.com/flyinghare/archive/2010/09/07/126078.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>函數調用方式： Stdcall Cdecl Fastcall WINAPI CALLBACK PASCAL Thiscall Fortran Syscall Declspec(Naked)</title><link>http://www.cppblog.com/flyinghare/archive/2010/07/02/119163.html</link><dc:creator>会飞的兔子</dc:creator><author>会飞的兔子</author><pubDate>Fri, 02 Jul 2010 06:07:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghare/archive/2010/07/02/119163.html</guid><wfw:comment>http://www.cppblog.com/flyinghare/comments/119163.html</wfw:comment><comments>http://www.cppblog.com/flyinghare/archive/2010/07/02/119163.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghare/comments/commentRss/119163.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghare/services/trackbacks/119163.html</trackback:ping><description><![CDATA[
<span style="font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; ">&nbsp;&nbsp; &nbsp; &nbsp; 现代的编程语言的函数竟然有那麽多的调用方式。这些东西要完全理解还得通过汇编代码才好理解。他们各自有自己的特点</span><span style="font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; "><br></span><span style="font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; ">其实这些调用方式的差别在主要在一下几个方面</span><span style="font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; "><br></span><span style="font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; "><br></span><span style="font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; ">1.参数处理方式（传递顺序，存取(利用盏还是寄存器)）</span><span style="font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; "><br></span><span style="font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; ">2.函数的结尾处理方式（善后处理）</span><span style="font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; "><br></span><span style="font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; "><br></span><span style="font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; "><br></span><span style="font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; "><br></span><span style="font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; ">以下是理论：</span><span style="font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; "><br></span><span style="font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; "><pre>__cdecl    由调用者平栈，参数从右到左依次入栈 是C和C＋＋程序的缺省调用方式。<strong>每一个调用它的函数都包含清空堆栈的代码</strong>，<br>           所以产生的可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式。VC将函数编译后会在函数名前面加上<br>           下划线前缀。是MFC缺省调用约定<br>__stdcall ，WINAPI，CALLBACK ，PASCAL    由被调用者平栈，参数从右到左依次入栈 ._stdcall是Pascal程序的缺省调用方式，<br>           通常用于Win32&nbsp;&nbsp; Api中，函数采用从右到左的压栈方式，<strong>自己在退出时清空堆栈</strong>。VC将函数编译后会在函数名前面加上下划<br>           线前缀，在函数名后加上"@"和参数的字节数<br><br>__fastcall 由被调用者平栈，参数先赋值给寄存器，然后入栈  &#8220;人&#8221;如其名，它的主要特点就是快，因为它是通过寄存器来传送参数的<br>          （实际上，它<strong>用ECX和EDX传送前两个双字（DWORD）或更小的参数</strong>，剩下的参数仍旧自右向左压栈传送，被调用的函数在返回前<br>          清理传送参数的内存栈），在函数名修饰约定方面，它和前两者均不同.<br>          _fastcall方式的函数采用寄存器传递参数，VC将函数编译后会在函数名前面加上"@"前缀，在函数名后加上"@"和参数的字节数。&nbsp; <br><br>__thiscall 由被调用者平栈，参数入栈，this 指针赋给 ecx 寄存器 仅仅应用于&#8220;C++&#8221;成员函数。this指针存放于CX寄存器，参数从右<br>           到左压。thiscall不是关键词，因此不能被程序员指定。&nbsp;&nbsp; <br><br><br><span style="color: rgb(0, 0, 0); ">__declspec(naked) </span><span style="font-size: 12pt; font-family: 宋体; ">这是一个很少见的调用约定，一般程序设计者建议不要使用。<strong>编译器不会给这种函数增加初始化和清理代码</strong>，<br>          更特殊的是，你不能用<span lang="EN-US">return</span>返回返回值，只能用插入汇编返回结果。这一般用于实模式驱动程序设计.<br></span></pre></span><span style="font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; ">以下是实践：</span><span style="font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; "><br></span><span style="font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; "><br></span><span style="font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; "><font face="宋体" size="2"><font face="宋体" size="2"></font></font></span><span style="font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; ">&nbsp;</span><span style="font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; ">&nbsp;</span><span style="font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; "><br></span><div style="border-left-color: rgb(204, 204, 204); padding-top: 4px; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 1634px; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; "><span style="color: rgb(0, 0, 255); ">int</span><span style="color: rgb(0, 0, 0); ">&nbsp;__stdcall&nbsp;test_stdcall(</span><span style="color: rgb(0, 0, 255); ">char</span><span style="color: rgb(0, 0, 0); ">&nbsp;para1,&nbsp;</span><span style="color: rgb(0, 0, 255); ">char</span><span style="color: rgb(0, 0, 0); ">&nbsp;para2)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;para1&nbsp;</span><span style="color: rgb(0, 0, 0); ">=</span><span style="color: rgb(0, 0, 0); ">&nbsp;para2;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">return</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 0); ">0</span><span style="color: rgb(0, 0, 0); ">;<br>}<br></span><span style="color: rgb(0, 0, 255); ">int</span><span style="color: rgb(0, 0, 0); ">&nbsp;__cdecl&nbsp;test_cdecl(</span><span style="color: rgb(0, 0, 255); ">char</span><span style="color: rgb(0, 0, 0); ">&nbsp;para,&nbsp;<img src="http://www.cnitblog.com/Images/dot.gif">)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">char</span><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="color: rgb(0, 0, 0); ">=</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">\n</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">;<br>&nbsp;&nbsp;&nbsp;&nbsp;va_list&nbsp;marker;<br>&nbsp;&nbsp;&nbsp;&nbsp;va_start(&nbsp;marker,&nbsp;para&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">while</span><span style="color: rgb(0, 0, 0); ">(&nbsp;p&nbsp;</span><span style="color: rgb(0, 0, 0); ">!=</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">\0</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="color: rgb(0, 0, 0); ">=</span><span style="color: rgb(0, 0, 0); ">&nbsp;va_arg(&nbsp;marker,&nbsp;</span><span style="color: rgb(0, 0, 255); ">char</span><span style="color: rgb(0, 0, 0); ">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: rgb(0, 0, 0); ">"</span><span style="color: rgb(0, 0, 0); ">%c\n</span><span style="color: rgb(0, 0, 0); ">"</span><span style="color: rgb(0, 0, 0); ">,&nbsp;p);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;va_end(&nbsp;marker&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">return</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 0); ">0</span><span style="color: rgb(0, 0, 0); ">;<br>}<br><br></span><span style="color: rgb(0, 0, 255); ">int</span><span style="color: rgb(0, 0, 0); ">&nbsp;pascal&nbsp;test_pascal(</span><span style="color: rgb(0, 0, 255); ">char</span><span style="color: rgb(0, 0, 0); ">&nbsp;para1,&nbsp;</span><span style="color: rgb(0, 0, 255); ">char</span><span style="color: rgb(0, 0, 0); ">&nbsp;para2)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">return</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 0); ">0</span><span style="color: rgb(0, 0, 0); ">;<br>}<br><br></span><span style="color: rgb(0, 0, 255); ">int</span><span style="color: rgb(0, 0, 0); ">&nbsp;__fastcall&nbsp;test_fastcall(</span><span style="color: rgb(0, 0, 255); ">char</span><span style="color: rgb(0, 0, 0); ">&nbsp;para1,&nbsp;</span><span style="color: rgb(0, 0, 255); ">char</span><span style="color: rgb(0, 0, 0); ">&nbsp;para2,&nbsp;</span><span style="color: rgb(0, 0, 255); ">char</span><span style="color: rgb(0, 0, 0); ">&nbsp;para3,&nbsp;</span><span style="color: rgb(0, 0, 255); ">char</span><span style="color: rgb(0, 0, 0); ">&nbsp;para4)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;para1&nbsp;</span><span style="color: rgb(0, 0, 0); ">=</span><span style="color: rgb(0, 0, 0); ">&nbsp;(</span><span style="color: rgb(0, 0, 255); ">char</span><span style="color: rgb(0, 0, 0); ">)</span><span style="color: rgb(0, 0, 0); ">1</span><span style="color: rgb(0, 0, 0); ">;<br>&nbsp;&nbsp;&nbsp;&nbsp;para2&nbsp;</span><span style="color: rgb(0, 0, 0); ">=</span><span style="color: rgb(0, 0, 0); ">&nbsp;(</span><span style="color: rgb(0, 0, 255); ">char</span><span style="color: rgb(0, 0, 0); ">)</span><span style="color: rgb(0, 0, 0); ">2</span><span style="color: rgb(0, 0, 0); ">;<br>&nbsp;&nbsp;&nbsp;&nbsp;para3&nbsp;</span><span style="color: rgb(0, 0, 0); ">=</span><span style="color: rgb(0, 0, 0); ">&nbsp;(</span><span style="color: rgb(0, 0, 255); ">char</span><span style="color: rgb(0, 0, 0); ">)</span><span style="color: rgb(0, 0, 0); ">3</span><span style="color: rgb(0, 0, 0); ">;<br>&nbsp;&nbsp;&nbsp;&nbsp;para4&nbsp;</span><span style="color: rgb(0, 0, 0); ">=</span><span style="color: rgb(0, 0, 0); ">&nbsp;(</span><span style="color: rgb(0, 0, 255); ">char</span><span style="color: rgb(0, 0, 0); ">)</span><span style="color: rgb(0, 0, 0); ">4</span><span style="color: rgb(0, 0, 0); ">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">return</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 0); ">0</span><span style="color: rgb(0, 0, 0); ">;<br>}<br>__declspec(naked)&nbsp;</span><span style="color: rgb(0, 0, 255); ">void</span><span style="color: rgb(0, 0, 0); ">&nbsp;__stdcall&nbsp;test_naked(</span><span style="color: rgb(0, 0, 255); ">char</span><span style="color: rgb(0, 0, 0); ">&nbsp;para1,&nbsp;</span><span style="color: rgb(0, 0, 255); ">char</span><span style="color: rgb(0, 0, 0); ">&nbsp;para2)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;__asm<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;ebp<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ebp,&nbsp;esp<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;eax<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;al,</span><span style="color: rgb(0, 0, 255); ">byte</span><span style="color: rgb(0, 0, 0); ">&nbsp;ptr&nbsp;[ebp&nbsp;</span><span style="color: rgb(0, 0, 0); ">+</span><span style="color: rgb(0, 0, 0); ">&nbsp;0Ch]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xchg&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">byte</span><span style="color: rgb(0, 0, 0); ">&nbsp;ptr&nbsp;[ebp&nbsp;</span><span style="color: rgb(0, 0, 0); ">+</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 0); ">8</span><span style="color: rgb(0, 0, 0); ">],al&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ebp<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0); ">8</span><span style="color: rgb(0, 0, 0); "><br>&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: rgb(0, 128, 0); ">//</span><span style="color: rgb(0, 128, 0); ">&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;;</span><span style="color: rgb(0, 128, 0); "></span><span style="color: rgb(0, 0, 0); "><br>}<br><br><br></span><span style="color: rgb(0, 0, 255); ">int</span><span style="color: rgb(0, 0, 0); ">&nbsp;main(</span><span style="color: rgb(0, 0, 255); ">int</span><span style="color: rgb(0, 0, 0); ">&nbsp;argc,&nbsp;</span><span style="color: rgb(0, 0, 255); ">char</span><span style="color: rgb(0, 0, 0); ">*</span><span style="color: rgb(0, 0, 0); ">&nbsp;argv[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;test_stdcall(&nbsp;</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">a</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">,&nbsp;</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">b</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;test_cdecl(&nbsp;</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">c</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">,</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">d</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">,</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">e</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">,</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">f</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">,</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">g</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">&nbsp;,</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">h</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">&nbsp;,</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">\0</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">);<br>&nbsp;&nbsp;&nbsp;&nbsp;test_pascal(&nbsp;</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">e</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">,&nbsp;</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">f</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;test_fastcall(&nbsp;</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">g</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">,&nbsp;</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">h</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">,&nbsp;</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">i</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">,&nbsp;</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">j</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;test_naked(&nbsp;</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">k</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">,&nbsp;</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">l</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">return</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 0); ">0</span><span style="color: rgb(0, 0, 0); ">;<br>}</span></div><span style="font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; ">汇编代码如下</span><span style="font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; "><br></span><div style="border-left-color: rgb(204, 204, 204); padding-top: 4px; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 1634px; font-family: Tahoma, Verdana, Geneva, Arial, Helvetica, sans-serif; "><span style="color: rgb(0, 0, 255); ">int</span><span style="color: rgb(0, 0, 0); ">&nbsp;main(</span><span style="color: rgb(0, 0, 255); ">int</span><span style="color: rgb(0, 0, 0); ">&nbsp;argc,&nbsp;</span><span style="color: rgb(0, 0, 255); ">char</span><span style="color: rgb(0, 0, 0); ">*</span><span style="color: rgb(0, 0, 0); ">&nbsp;argv[])<br>{<br></span><span style="color: rgb(0, 0, 0); ">00411350</span><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ebp&nbsp;&nbsp;<br></span><span style="color: rgb(0, 0, 0); ">00411351</span><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ebp,esp&nbsp;<br></span><span style="color: rgb(0, 0, 0); ">00411353</span><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp;sub&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;esp,0C0h&nbsp;<br></span><span style="color: rgb(0, 0, 0); ">00411359</span><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ebx&nbsp;&nbsp;<br>0041135A&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;esi&nbsp;&nbsp;<br>0041135B&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edi&nbsp;&nbsp;<br>0041135C&nbsp;&nbsp;lea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edi,[ebp</span><span style="color: rgb(0, 0, 0); ">-</span><span style="color: rgb(0, 0, 0); ">0C0h]&nbsp;<br></span><span style="color: rgb(0, 0, 0); ">00411362</span><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ecx,30h&nbsp;<br></span><span style="color: rgb(0, 0, 0); ">00411367</span><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,0CCCCCCCCh&nbsp;<br>0041136C&nbsp;&nbsp;rep&nbsp;stos&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;es:[edi]&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;test_stdcall(&nbsp;</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">a</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">,&nbsp;</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">b</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">&nbsp;);<br><strong><font color="#000000">0041136E&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;62h&nbsp;&nbsp;<br></font></strong></span><strong><font color="#000000"><span style="color: rgb(0, 0, 0); ">00411370</span><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;61h&nbsp;&nbsp;<br></span><span style="color: rgb(0, 0, 0); ">00411372</span><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></font><font color="#000000"><span style="color: rgb(0, 0, 0); ">_test_stdcall@</span><span style="color: rgb(0, 0, 0); ">8</span></font><span style="color: rgb(0, 0, 0); "></span></strong><span style="color: rgb(0, 0, 0); "><strong><font color="#000000"></font></strong><br>&nbsp;&nbsp;&nbsp;&nbsp;test_cdecl(&nbsp;</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">c</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">,</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">d</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">,</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">e</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">,</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">f</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">,</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">g</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">&nbsp;,</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">h</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">&nbsp;,</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">\0</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">);<br></span><strong><span style="color: rgb(0, 0, 0); ">00411377</span><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0); ">0</span><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: rgb(0, 0, 0); ">00411379</span><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;68h&nbsp;&nbsp;<br>0041137B&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;67h&nbsp;&nbsp;<br>0041137D&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;66h&nbsp;&nbsp;<br>0041137F&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;65h&nbsp;&nbsp;<br></span><span style="color: rgb(0, 0, 0); ">00411381</span><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;64h&nbsp;&nbsp;<br></span><span style="color: rgb(0, 0, 0); ">00411383</span><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;63h&nbsp;&nbsp;<br></span><span style="color: rgb(0, 0, 0); ">00411385</span><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0); ">_test_cdecl</span></strong><span style="color: rgb(0, 0, 0); "><br><font color="#ff0000"><strong>0041138A&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;esp,1Ch&nbsp;</strong></font></span><font color="#ff0000"><strong><font color="#ff0000"><span style="color: rgb(0, 128, 0); ">;恢复</span></font><span style="color: rgb(0, 0, 0); "></span><span style="color: rgb(0, 0, 0); ">_te</span></strong><strong><span style="color: rgb(0, 0, 0); ">st_cdecl</span><span style="color: rgb(0, 0, 0); ">参数压入前的堆栈指令是:&nbsp;</span><span style="color: rgb(0, 0, 0); ">add esp,n*4&nbsp;</span>n=参数的数量</strong></font><br><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp;&nbsp; test_fastcall(&nbsp;</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">g</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">,&nbsp;</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">h</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">,&nbsp;</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">i</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">,&nbsp;</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">j</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">&nbsp;);<br><strong>0041138D&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6Ah&nbsp;&nbsp;<br>0041138F&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;69h&nbsp;&nbsp;<br></strong></span><strong><span style="color: rgb(0, 0, 0); ">00411391</span><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dl,68h&nbsp;<br></span><span style="color: rgb(0, 0, 0); ">00411393</span><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cl,67h&nbsp;<br></span><span style="color: rgb(0, 0, 0); ">00411395</span><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0); ">test_fastcall</span></strong><span style="color: rgb(0, 0, 0); "><br>&nbsp;&nbsp;&nbsp;&nbsp;test_naked(&nbsp;</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">k</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">,&nbsp;</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">l</span><span style="color: rgb(0, 0, 0); ">'</span><span style="color: rgb(0, 0, 0); ">);<br><strong>0041139A&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6Ch&nbsp;&nbsp;<br>0041139C&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6Bh&nbsp;&nbsp;<br>0041139E&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong></span><strong><span style="color: rgb(0, 0, 0); ">_test_naked</span></strong><span style="color: rgb(0, 0, 0); "><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">return</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 0); ">0</span><span style="color: rgb(0, 0, 0); ">;<br>004113A3&nbsp;&nbsp;xor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,eax&nbsp;<br>}<br><br>int __stdcall test_stdcall(char para1, char para2)<br>{<br>004111F0&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebp&nbsp;&nbsp;<br>004111F1&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebp,esp&nbsp;<br>004111F3&nbsp; sub&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esp,0C0h&nbsp;<br>004111F9&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebx&nbsp;&nbsp;<br>004111FA&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esi&nbsp;&nbsp;<br>004111FB&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; edi&nbsp;&nbsp;<br>004111FC&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; edi,[ebp-0C0h]&nbsp;<br>00411202&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ecx,30h&nbsp;<br>00411207&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax,0CCCCCCCCh&nbsp;<br>0041120C&nbsp; rep stos&nbsp;&nbsp;&nbsp; dword ptr es:[edi] ;初始edi<br>&nbsp;&nbsp;&nbsp; para1 = para2;<br><font color="#ff0000"><strong>0041120E&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; al,byte ptr [para2] ;mov al,byte ptr[ebp+c]<br>00411211&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [para1],al ;mov byte ptr[ebp+8],al</strong></font><br>&nbsp;&nbsp;&nbsp; return 0;<br>00411214&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax,eax<br>00411216&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; edi&nbsp;&nbsp;<br>00411217&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esi&nbsp;&nbsp;<br>00411218&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebx&nbsp;&nbsp;<br>00411219&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esp,ebp&nbsp;<br>0041121B&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebp&nbsp;&nbsp;<br><font color="#ff0000"><strong>0041121C ret&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8 ;恢复到压入函数参数前堆栈,由于有两个参数所以ret 8 相当于 pop eip 然后esp+8</strong></font><br>}<br>int __cdecl test_cdecl(char para,... )<br>{<br>00411230&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebp&nbsp;&nbsp;<br>00411231&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebp,esp&nbsp;<br>00411233&nbsp; sub&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esp,0D8h&nbsp;<br>0041123C&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; edi,[ebp-0D8h]&nbsp;<br>00411242&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ecx,36h&nbsp;<br>00411247&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax,0CCCCCCCCh&nbsp;<br>0041124C&nbsp; rep stos&nbsp;&nbsp;&nbsp; dword ptr es:[edi]&nbsp;<br>&nbsp;&nbsp;&nbsp; char&nbsp;&nbsp;&nbsp; p = '\n';<br>0041124E&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [p],0Ah&nbsp;<br>&nbsp;&nbsp;&nbsp; va_list marker;<br>&nbsp;&nbsp;&nbsp; va_start( marker, para );<br>00411252&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax,[ebp+0Ch]&nbsp;<br>00411255&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [marker],eax&nbsp;<br>&nbsp;&nbsp;&nbsp; while( p != '\0' )<br>00411258&nbsp; movsx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax,byte ptr [p]&nbsp;<br>0041125C&nbsp; test&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax,eax&nbsp;<br>0041125E&nbsp; je&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test_cdecl+60h (411290h)&nbsp;<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p = va_arg( marker, char);<br>00411260&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax,dword ptr [marker]&nbsp;<br>00411263&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax,4&nbsp;<br>00411266&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [marker],eax&nbsp;<br>00411269&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ecx,dword ptr [marker]&nbsp;<br>0041126C&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dl,byte ptr [ecx-4]&nbsp;<br>0041126F&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [p],dl&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%c\n", p);<br>00411272&nbsp; movsx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax,byte ptr [p]&nbsp;<br>00411276&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esi,esp&nbsp;<br>00411278&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax&nbsp;&nbsp;<br>00411279&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; offset string "%c\n" (41401Ch)&nbsp;<br>0041127E&nbsp; call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [__imp__printf (416180h)]&nbsp;<br>00411284&nbsp; add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esp,8&nbsp;<br>0041128E&nbsp; jmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test_cdecl+28h (411258h)&nbsp;<br></span><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp;&nbsp; }</span><br><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp;&nbsp; va_end( marker );<br>00411290&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dword ptr [marker],0&nbsp;<br>&nbsp;&nbsp;&nbsp; return 0;<br>00411297&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax,eax&nbsp;</span><span style="color: rgb(0, 0, 0); "><br>004112A9&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esp,ebp&nbsp;<br>004112AB&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebp&nbsp;&nbsp;<br>004112AC&nbsp; ret&nbsp;&nbsp;&nbsp;&nbsp;</span><br><span style="color: rgb(0, 0, 0); ">}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>int __fastcall test_fastcall(char para1, char para2, char para3, char para4)<br>{<br>004112D0&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebp&nbsp;&nbsp;<br>004112D1&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebp,esp&nbsp;<br>004112D3&nbsp; sub&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esp,0D8h&nbsp;&nbsp;<br>004112DD&nbsp; lea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; edi,[ebp-0D8h]&nbsp;<br>004112E3&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ecx,36h&nbsp;<br>004112E8&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax,0CCCCCCCCh&nbsp;<br>004112ED&nbsp; rep stos&nbsp;&nbsp;&nbsp; dword ptr es:[edi]&nbsp;<br>004112EF&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ecx&nbsp;&nbsp;<br>004112F0&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [ebp-14h],dl&nbsp;<br>004112F3&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [ebp-8],cl&nbsp;<br>&nbsp;&nbsp;&nbsp; para1 = (char)1;<br>004112F6&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [para1],1&nbsp;<br>&nbsp;&nbsp;&nbsp; para2 = (char)2;<br>004112FA&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [para2],2&nbsp;<br>&nbsp;&nbsp;&nbsp; para3 = (char)3;<br>004112FE&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [para3],3&nbsp;<br>&nbsp;&nbsp;&nbsp; para4 = (char)4;<br>00411302&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte ptr [para4],4&nbsp;<br>&nbsp;&nbsp;&nbsp; return 0;<br>00411306&nbsp; xor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax,eax&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0); "><br>0041130B&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; esp,ebp&nbsp;<br>0041130D&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebp&nbsp;&nbsp;<br>0041130E&nbsp; ret&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8&nbsp;&nbsp;</span><strong>;由于使用了ecx ,edx 传递参数 本来4个参数只使用两push 所以这里是 ret 4*2</strong><br><span style="color: rgb(0, 0, 0); ">}<br>&nbsp; &nbsp;&nbsp;&nbsp;<br><br>__declspec(naked) void __stdcall test_naked(char para1, char para2)<br>{<br>00411330&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;<strong>这里编译器没加入任何初始化和清栈的指令,你代码如何写它就复制过来</strong><br>00411331&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebp,esp&nbsp;<br>00411333&nbsp; push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax&nbsp;&nbsp;<br>00411334&nbsp; mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; al,byte ptr [para2] &nbsp;&nbsp;&nbsp;<br>00411337&nbsp; xchg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; al,byte ptr [para1]&nbsp;<br>0041133A&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eax&nbsp;&nbsp;<br>0041133B&nbsp; pop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ebp&nbsp;&nbsp;<br>0041133C&nbsp; ret&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8&nbsp;&nbsp;<br>}&nbsp;<br></span></div><div><span style="color: rgb(0, 0, 0); ">转自：</span><a href="http://www.cnitblog.com/textbox/archive/2010/03/10/64575.html">http://www.cnitblog.com/textbox/archive/2010/03/10/64575.html</a></div><img src ="http://www.cppblog.com/flyinghare/aggbug/119163.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghare/" target="_blank">会飞的兔子</a> 2010-07-02 14:07 <a href="http://www.cppblog.com/flyinghare/archive/2010/07/02/119163.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AFXDLL 和 _AFXEXT</title><link>http://www.cppblog.com/flyinghare/archive/2010/06/17/118074.html</link><dc:creator>会飞的兔子</dc:creator><author>会飞的兔子</author><pubDate>Thu, 17 Jun 2010 05:29:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghare/archive/2010/06/17/118074.html</guid><wfw:comment>http://www.cppblog.com/flyinghare/comments/118074.html</wfw:comment><comments>http://www.cppblog.com/flyinghare/archive/2010/06/17/118074.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghare/comments/commentRss/118074.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghare/services/trackbacks/118074.html</trackback:ping><description><![CDATA[
<span style="line-height: 23px; color: rgb(102, 102, 102); font-family: Verdana, Arial, Helvetica, 宋体, sans-serif; font-size: 13px; "><div style="line-height: 23px; margin-top: 0px; margin-right: auto; margin-bottom: 0px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; color: rgb(102, 102, 102); ">使用 AFX_EXT_CLASS 导出和导入&nbsp;</div><div style="line-height: 23px; margin-top: 0px; margin-right: auto; margin-bottom: 0px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; color: rgb(102, 102, 102); ">扩展 DLL 使用 AFX_EXT_CLASS 宏导出类；链接到扩展 DLL 的可执行文件使用该宏导入类。用于生成扩展 DLL 的相同头文件可通过 AFX_EXT_CLASS 宏与链接到 DLL 的可执行文件一起使用。</div><div style="line-height: 23px; margin-top: 0px; margin-right: auto; margin-bottom: 0px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; color: rgb(102, 102, 102); ">在 DLL 的头文件中，将 AFX_EXT_CLASS 关键字添加到类的声明中，如下所示：</div><div style="line-height: 23px; margin-top: 0px; margin-right: auto; margin-bottom: 0px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; color: rgb(102, 102, 102); ">class AFX_EXT_CLASS CMyClass : public CDocument<br style="line-height: 23px; ">{<br style="line-height: 23px; ">// &lt;body of class&gt;<br style="line-height: 23px; ">};</div><div style="line-height: 23px; margin-top: 0px; margin-right: auto; margin-bottom: 0px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; color: rgb(102, 102, 102); ">当定义了预处理器符号 _AFXDLL 和 _AFXEXT 时，该宏被 MFC 定义为 __declspec(dllexport)。但当定义了 _AFXDLL 而未定义 _AFXEXT 时，该宏被定义为 __declspec(dllimport)。定义后，预处理器符号 _AFXDLL 指示共享 MFC 版本正在由目标可执行文件（DLL 或应用程序）使用。当 _AFXDLL 和 _AFXEXT 都定义了时，这指示目标可执行文件是扩展 DLL。</div><div style="line-height: 23px; margin-top: 0px; margin-right: auto; margin-bottom: 0px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; color: rgb(102, 102, 102); ">由于从扩展 DLL 导出时，AFX_EXT_CLASS 被定义为 __declspec(dllexport)，因此可以导出整个类，而不必将该类的所有符号的修饰名放到 .def 文件中。此方法由 MFC 示例 DLLHUSK 使用。</div><div style="line-height: 23px; margin-top: 0px; margin-right: auto; margin-bottom: 0px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; color: rgb(102, 102, 102); ">虽然使用此方法可以避免创建 .def 文件和类的所有修饰名，但由于名称可以按序号导出，因此创建 .def 文件的效率更高。若要使用 .def 文件导出方法，请将下列代码放在头文件的开头和结尾处：</div><div style="line-height: 23px; margin-top: 0px; margin-right: auto; margin-bottom: 0px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; color: rgb(102, 102, 102); ">#undef AFX_DATA<br style="line-height: 23px; ">#define AFX_DATA AFX_EXT_DATA<br style="line-height: 23px; ">// &lt;body of your header file&gt;<br style="line-height: 23px; ">#undef AFX_DATA<br style="line-height: 23px; ">#define AFX_DATA</div><div style="line-height: 23px; margin-top: 0px; margin-right: auto; margin-bottom: 0px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; color: rgb(102, 102, 102); ">警告<br style="line-height: 23px; ">导出内联函数时要小心，因为它们有可能导致版本冲突。内联函数扩展到应用程序代码中；因此，如果以后重写内联函数，除非重新编译应用程序本身，否则内联函数不会被更新。通常，不用重新生成使用 DLL 函数的应用程序就可以更新 DLL 函数。<br style="line-height: 23px; ">&nbsp;</div><div style="line-height: 23px; margin-top: 0px; margin-right: auto; margin-bottom: 0px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; color: rgb(102, 102, 102); ">导出类中的个别成员<br style="line-height: 23px; ">有时，您可能希望导出类中的个别成员。例如，如果导出 CDialog 派生类，可能只需要导出构造函数和 DoModal 调用。可以对需要导出的个别成员使用 AFX_EXT_CLASS。</div><div style="line-height: 23px; margin-top: 0px; margin-right: auto; margin-bottom: 0px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; color: rgb(102, 102, 102); ">例如：</div><div style="line-height: 23px; margin-top: 0px; margin-right: auto; margin-bottom: 0px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; color: rgb(102, 102, 102); ">class CExampleDialog : public CDialog<br style="line-height: 23px; ">{<br style="line-height: 23px; ">public:<br style="line-height: 23px; ">&nbsp;&nbsp; AFX_EXT_CLASS CExampleDialog();<br style="line-height: 23px; ">&nbsp;&nbsp; AFX_EXT_CLASS int DoModal();<br style="line-height: 23px; ">&nbsp;&nbsp; ...<br style="line-height: 23px; ">&nbsp;&nbsp; // rest of class definition<br style="line-height: 23px; ">&nbsp;&nbsp; ...<br style="line-height: 23px; ">};</div><div style="line-height: 23px; margin-top: 0px; margin-right: auto; margin-bottom: 0px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; color: rgb(102, 102, 102); ">您不再导出类的所有成员，但由于 MFC 宏的工作方式，您可能会遇到其他问题。几个 MFC 的 Helper 宏实际声明或定义数据成员。因此，还必须从 DLL 导出这些数据成员。</div><div style="line-height: 23px; margin-top: 0px; margin-right: auto; margin-bottom: 0px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; color: rgb(102, 102, 102); ">例如，当生成扩展 DLL 时，DECLARE_DYNAMIC 宏的定义如下：</div><div style="line-height: 23px; margin-top: 0px; margin-right: auto; margin-bottom: 0px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; color: rgb(102, 102, 102); ">#define DECLARE_DYNAMIC(class_name) \<br style="line-height: 23px; ">protected: \<br style="line-height: 23px; ">&nbsp;&nbsp; static CRuntimeClass* PASCAL _GetBaseClass(); \<br style="line-height: 23px; ">public: \<br style="line-height: 23px; ">&nbsp;&nbsp; static AFX_DATA CRuntimeClass class##class_name; \<br style="line-height: 23px; ">&nbsp;&nbsp; virtual CRuntimeClass* GetRuntimeClass() const; \</div><div style="line-height: 23px; margin-top: 0px; margin-right: auto; margin-bottom: 0px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; color: rgb(102, 102, 102); ">以 static AFX_DATA 打头的行声明类的内部静态对象。若要正确导出该类并从客户端可执行文件访问运行时信息，必须导出此静态对象。由于静态对象是用 AFX_DATA 修饰符声明的，因此只需在生成 DLL 时将 AFX_DATA 定义为 __declspec(dllexport)，并在生成客户端可执行文件时将 AFX_DATA 定义为 __declspec(dllimport)。由于已经以此方式定义了 AFX_EXT_CLASS，因此只需参考类定义，将 AFX_DATA 重定义为与 AFX_EXT_CLASS 相同。</div><div style="line-height: 23px; margin-top: 0px; margin-right: auto; margin-bottom: 0px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; color: rgb(102, 102, 102); ">例如：</div><div style="line-height: 23px; margin-top: 0px; margin-right: auto; margin-bottom: 0px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; color: rgb(102, 102, 102); ">#undef&nbsp; AFX_DATA<br style="line-height: 23px; ">#define AFX_DATA AFX_EXT_CLASS</div><div style="line-height: 23px; margin-top: 0px; margin-right: auto; margin-bottom: 0px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; color: rgb(102, 102, 102); ">class CExampleView : public CView<br style="line-height: 23px; ">{<br style="line-height: 23px; ">&nbsp;&nbsp; DECLARE_DYNAMIC()<br style="line-height: 23px; ">&nbsp;&nbsp; // ... class definition ...<br style="line-height: 23px; ">};</div><div style="line-height: 23px; margin-top: 0px; margin-right: auto; margin-bottom: 0px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; color: rgb(102, 102, 102); ">#undef&nbsp; AFX_DATA<br style="line-height: 23px; ">#define AFX_DATA</div><div style="line-height: 23px; margin-top: 0px; margin-right: auto; margin-bottom: 0px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; color: rgb(102, 102, 102); ">MFC 总是在其宏的内部定义的数据项上使用 AFX_DATA 符号，因此此技术适用于所有这类情况。例如，它适用于 DECLARE_MESSAGE_MAP。</div><div style="line-height: 23px; margin-top: 0px; margin-right: auto; margin-bottom: 0px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; color: rgb(102, 102, 102); "><br></div><div style="line-height: 23px; margin-top: 0px; margin-right: auto; margin-bottom: 0px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; color: rgb(102, 102, 102); "><br></div><div style="line-height: 23px; margin-top: 0px; margin-right: auto; margin-bottom: 0px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; border-style: initial; border-color: initial; color: rgb(102, 102, 102); ">转自：<span style="color: rgb(0, 0, 0); font-family: 微软雅黑; line-height: normal; font-size: medium; "><a href="http://ruihanruizhi.blog.sohu.com/39648210.html">http://ruihanruizhi.blog.sohu.com/39648210.html</a></span></div></span><img src ="http://www.cppblog.com/flyinghare/aggbug/118074.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghare/" target="_blank">会飞的兔子</a> 2010-06-17 13:29 <a href="http://www.cppblog.com/flyinghare/archive/2010/06/17/118074.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BOOST xml 序列化用法</title><link>http://www.cppblog.com/flyinghare/archive/2010/06/05/117232.html</link><dc:creator>会飞的兔子</dc:creator><author>会飞的兔子</author><pubDate>Sat, 05 Jun 2010 09:52:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghare/archive/2010/06/05/117232.html</guid><wfw:comment>http://www.cppblog.com/flyinghare/comments/117232.html</wfw:comment><comments>http://www.cppblog.com/flyinghare/archive/2010/06/05/117232.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghare/comments/commentRss/117232.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghare/services/trackbacks/117232.html</trackback:ping><description><![CDATA[
<div style="color: rgb(70, 70, 70); font-family: simsun; font-size: 14px; line-height: 21px; "><strong style="font-weight: bold; "><span style="word-wrap: normal; word-break: normal; line-height: 25px; font-size: large; ">简单的开始</span></strong></div><div style="color: rgb(70, 70, 70); font-family: simsun; font-size: 14px; line-height: 21px; ">Serialization的中文解释是&#8220;串行化&#8221; 、&#8220;序列化&#8221;或者&#8220;持久化&#8221; ，就是将内存中的对象保存到磁盘中，等到程序再次运行的时候再读取磁盘中的文件恢复原来的对象。下面来看一个简单的例子：</div><div style="border-left-color: windowtext; padding-top: 1pt; padding-right: 4pt; padding-bottom: 1pt; padding-left: 4pt; background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); margin-left: 10.5pt; margin-right: 0cm; color: rgb(70, 70, 70); font-family: simsun; font-size: 14px; line-height: 21px; background-position: 0% 0%; background-repeat: repeat repeat; "><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">#include &lt;fstream&gt;</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">#include &lt;iostream&gt;</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><strong style="font-weight: bold; ">#include &lt;boost/archive/text_oarchive.hpp&gt;</strong></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><strong style="font-weight: bold; ">#include &lt;boost/archive/text_iarchive.hpp&gt;</strong></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">class A</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">{</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">private:</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;//</span>&nbsp;为了能让串行化类库能够访问私有成员，所以要声明一个友元类</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<strong style="font-weight: bold; ">friend class boost::serialization::access;</strong></span></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;//</span>&nbsp;对象的数据</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;int a;</span></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;double b;</span></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;//</span>&nbsp;串行化的函数，这一个函数完成对象的保存与恢复</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<strong style="font-weight: bold; ">template&lt;class Archive&gt;</strong></span></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><strong style="font-weight: bold; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;void serialize(Archive &amp; ar, const unsigned int version)</span></strong></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><strong style="font-weight: bold; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;{</span></strong></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><strong style="font-weight: bold; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;ar &amp; a;&nbsp;<wbr></span></strong>&nbsp;&nbsp;<wbr>//就是这么简单，也可以使用 ar&lt;&lt;a 这样的语法</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><strong style="font-weight: bold; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;ar &amp; b;</span></strong></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><strong style="font-weight: bold; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;}</span></strong></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">public:</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;A(int aa,double bb):a(aa),b(bb){}</span></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;A(){}</span></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;void print(){std::cout&lt;&lt;a&lt;&lt;' '&lt;&lt;b&lt;&lt;std::endl;}</span></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">};<span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr></span></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">int main()</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">{</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;std::ofstream fout("file.txt");//</span>&nbsp;把对象写到file.txt文件中</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<strong style="font-weight: bold; ">boost::archive::text_oarchive oa(fout);</strong>&nbsp;//</span>&nbsp;文本的输出归档类，使用一个ostream来构造</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;A obj(1,2.5);</span></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<strong style="font-weight: bold; ">oa&lt;&lt;obj;</strong>&nbsp;//</span>&nbsp;保存obj对象</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;fout.close();//</span>&nbsp;关闭文件</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr></span></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;std::ifstream fin("file.txt");</span></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<strong style="font-weight: bold; ">boost::archive::text_iarchive ia(fin);</strong>&nbsp;//</span>&nbsp;文本的输入归档类</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;A newobj;</span></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<strong style="font-weight: bold; ">ia&gt;&gt;newobj;</strong>&nbsp;//</span>&nbsp;恢复到newobj对象</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;newobj.print();</span></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;fin.close();</span></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;system("pause");</span></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;return 0;</span></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">}</div></div><div style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 10.5pt; color: rgb(70, 70, 70); font-family: simsun; font-size: 14px; line-height: 21px; ">&nbsp;<wbr></div><div style="color: rgb(70, 70, 70); font-family: simsun; font-size: 14px; line-height: 21px; ">从上面可以看出，boost是使用text_oarchive和text_iarchive 类，来完成一个对象的序列化的。使用这两个类的步骤是：</div><div style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 21pt; text-indent: -21pt; color: rgb(70, 70, 70); font-family: simsun; font-size: 14px; line-height: 21px; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">1.<span style="word-wrap: normal; word-break: normal; line-height: normal; font: normal normal normal 7pt/normal 'Times new roman'; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr></span></span>&nbsp;在源程序中包含boost/archive/text_oarchive.hpp 和 boost/archive/text_iarchive.hpp 这两个文件。</div><div style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 21pt; text-indent: -21pt; color: rgb(70, 70, 70); font-family: simsun; font-size: 14px; line-height: 21px; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">2.<span style="word-wrap: normal; word-break: normal; line-height: normal; font: normal normal normal 7pt/normal 'Times new roman'; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr></span></span>&nbsp;为需要序列化的类添加一个template&lt;class Archive&gt; void serialize(Archive &amp; ar, const unsigned int version)的模版成员函数。</div><div style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 21pt; text-indent: -21pt; color: rgb(70, 70, 70); font-family: simsun; font-size: 14px; line-height: 21px; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">3.<span style="word-wrap: normal; word-break: normal; line-height: normal; font: normal normal normal 7pt/normal 'Times new roman'; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr></span></span>&nbsp;如果需要对象中包含私有成员的话，需要把boost::serialization::access类声明为友元。</div><div style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 21pt; text-indent: -21pt; color: rgb(70, 70, 70); font-family: simsun; font-size: 14px; line-height: 21px; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">4.<span style="word-wrap: normal; word-break: normal; line-height: normal; font: normal normal normal 7pt/normal 'Times new roman'; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr></span></span>&nbsp;在主函数中，创建一个输出文件流对象， 使用这个对象构造一个text_oarchive对象，然后就可以使用&lt;&lt;操作符来输出对象了。</div><div style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 21pt; text-indent: -21pt; color: rgb(70, 70, 70); font-family: simsun; font-size: 14px; line-height: 21px; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">5.<span style="word-wrap: normal; word-break: normal; line-height: normal; font: normal normal normal 7pt/normal 'Times new roman'; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr></span></span>&nbsp;最后，同样的，使用text_iarchive来恢复对象。</div><div style="color: rgb(70, 70, 70); font-family: simsun; font-size: 14px; line-height: 21px; ">&nbsp;<wbr></div><div style="color: rgb(70, 70, 70); font-family: simsun; font-size: 14px; line-height: 21px; "><strong style="font-weight: bold; "><span style="word-wrap: normal; word-break: normal; line-height: 25px; font-size: large; ">继承</span></strong></div><div style="color: rgb(70, 70, 70); font-family: simsun; font-size: 14px; line-height: 21px; ">如果要序列化一个子类的话，方法是不同的。例：</div><div style="border-left-color: windowtext; padding-top: 1pt; padding-right: 4pt; padding-bottom: 1pt; padding-left: 4pt; background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); margin-left: 10.5pt; margin-right: 0cm; color: rgb(70, 70, 70); font-family: simsun; font-size: 14px; line-height: 21px; background-position: 0% 0%; background-repeat: repeat repeat; "><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><strong style="font-weight: bold; ">#include &lt;boost/serialization/base_object.hpp&gt;</strong>&nbsp;&nbsp;<wbr>//一定要包含此头文件</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><strong style="font-weight: bold; ">class B:A</strong></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">{</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;friend class boost::serialization::access;</span></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;char c;</span></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;template&lt;class Archive&gt;</span></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;void serialize(Archive &amp; ar, const unsigned int version)</span></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;{</span></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<strong style="font-weight: bold; ">ar &amp; boost::serialization::base_object&lt;A&gt;(*this);</strong>&nbsp;//</span>&nbsp;注意这里</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;ar &amp; c;</span></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;}</span></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">public:</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;...</span></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">};<span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr></span></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">&nbsp;<wbr></div></div><div style="color: rgb(70, 70, 70); font-family: simsun; font-size: 14px; line-height: 21px; ">对子类进行序列化的步骤是：</div><div style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 21pt; text-indent: -21pt; color: rgb(70, 70, 70); font-family: simsun; font-size: 14px; line-height: 21px; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">1.<span style="word-wrap: normal; word-break: normal; line-height: normal; font: normal normal normal 7pt/normal 'Times new roman'; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr></span></span>&nbsp;包含boost/serialization/base_object.hpp头文件</div><div style="margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 21pt; text-indent: -21pt; color: rgb(70, 70, 70); font-family: simsun; font-size: 14px; line-height: 21px; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">2.<span style="word-wrap: normal; word-break: normal; line-height: normal; font: normal normal normal 7pt/normal 'Times new roman'; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr></span></span>&nbsp;在serialize模版函数中，使用ar &amp; boost::serialization::base_object&lt;父类&gt;(*this)这样的语法来保存父类的数据，不能直接调用父类 的serialize函数</div><div style="color: rgb(70, 70, 70); font-family: simsun; font-size: 14px; line-height: 21px; ">&nbsp;<wbr></div><div style="color: rgb(70, 70, 70); font-family: simsun; font-size: 14px; line-height: 21px; "><strong style="font-weight: bold; "><span style="word-wrap: normal; word-break: normal; line-height: 25px; font-size: large; ">STL容器</span></strong></div><div style="color: rgb(70, 70, 70); font-family: simsun; font-size: 14px; line-height: 21px; ">如果要序列化一个STL容器，要使用boost自带的头文件，不能直接#include&lt;vector&gt;</div><div style="color: rgb(70, 70, 70); font-family: simsun; font-size: 14px; line-height: 21px; ">例如：</div><div style="border-left-color: windowtext; padding-top: 1pt; padding-right: 4pt; padding-bottom: 1pt; padding-left: 4pt; background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); margin-left: 10.5pt; margin-right: 0cm; color: rgb(70, 70, 70); font-family: simsun; font-size: 14px; line-height: 21px; background-position: 0% 0%; background-repeat: repeat repeat; "><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><strong style="font-weight: bold; ">#include &lt;boost/serialization/list.hpp&gt;</strong>&nbsp;// Serialization中特定的头文件,在list.hpp中已经包含了stl的list头文件</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">Class A</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">{</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">&nbsp;<wbr>...</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">&nbsp;<wbr><strong style="font-weight: bold; ">list&lt;int&gt; list;</strong></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); text-indent: 10.5pt; background-position: 0% 0%; background-repeat: repeat repeat; ">template&lt;class Archive&gt;</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); text-indent: 10.5pt; background-position: 0% 0%; background-repeat: repeat repeat; ">void serialize(Archive &amp; ar, const unsigned int version)</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">&nbsp;<wbr>{</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<strong style="font-weight: bold; ">&nbsp;<wbr>ar &amp; list;</strong></span></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">&nbsp;<wbr>}</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); text-indent: 10.5pt; background-position: 0% 0%; background-repeat: repeat repeat; ">...</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">}</div></div><div style="color: rgb(70, 70, 70); font-family: simsun; font-size: 14px; line-height: 21px; ">在Serialization中，类似的头文件还有vector.hpp string.hpp set.hpp map.hpp slist.hpp等等。</div><div style="color: rgb(70, 70, 70); font-family: simsun; font-size: 14px; line-height: 21px; ">&nbsp;<wbr></div><div style="color: rgb(70, 70, 70); font-family: simsun; font-size: 14px; line-height: 21px; "><strong style="font-weight: bold; "><span style="word-wrap: normal; word-break: normal; line-height: 25px; font-size: large; ">数组和指针</span></strong></div><div style="color: rgb(70, 70, 70); font-family: simsun; font-size: 14px; line-height: 21px; ">对于数组和指针可以直接序列化，例：</div><div style="border-left-color: windowtext; padding-top: 1pt; padding-right: 4pt; padding-bottom: 1pt; padding-left: 4pt; background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); margin-left: 10.5pt; margin-right: 0cm; color: rgb(70, 70, 70); font-family: simsun; font-size: 14px; line-height: 21px; background-position: 0% 0%; background-repeat: repeat repeat; "><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">Class A</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">{</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">&nbsp;<wbr>...</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">&nbsp;<wbr><strong style="font-weight: bold; ">int a[10];</strong></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><strong style="font-weight: bold; ">&nbsp;<wbr>int *b</strong></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); text-indent: 10.5pt; background-position: 0% 0%; background-repeat: repeat repeat; ">template&lt;class Archive&gt;</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); text-indent: 10.5pt; background-position: 0% 0%; background-repeat: repeat repeat; ">void serialize(Archive &amp; ar, const unsigned int version)</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">&nbsp;<wbr>{</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<strong style="font-weight: bold; ">ar &amp; a;</strong></span></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; "><strong style="font-weight: bold; "><span style="word-wrap: normal; word-break: normal; line-height: 21px; ">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;ar &amp; b;</span></strong></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">&nbsp;<wbr>}</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); text-indent: 10.5pt; background-position: 0% 0%; background-repeat: repeat repeat; ">...</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">}</div></div><div style="color: rgb(70, 70, 70); font-family: simsun; font-size: 14px; line-height: 21px; ">&nbsp;<wbr></div><div style="color: rgb(70, 70, 70); font-family: simsun; font-size: 14px; line-height: 21px; "><strong style="font-weight: bold; "><span style="word-wrap: normal; word-break: normal; line-height: 25px; font-size: large; ">其他的archive类</span></strong></div><div style="color: rgb(70, 70, 70); font-family: simsun; font-size: 14px; line-height: 21px; ">除了text_iarchive和text_oarchive之外，还有其他的archive类，可以把对象保存成不同格式的文件。</div><div style="border-left-color: windowtext; padding-top: 1pt; padding-right: 4pt; padding-bottom: 1pt; padding-left: 4pt; background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); margin-left: 10.5pt; margin-right: 0cm; color: rgb(70, 70, 70); font-family: simsun; font-size: 14px; line-height: 21px; background-position: 0% 0%; background-repeat: repeat repeat; "><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">// a portable text archive</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">boost::archive::text_oarchive(ostream &amp;s) // saving</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">boost::archive::text_iarchive(istream &amp;s) // loading</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">&nbsp;<wbr></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">// a portable text archive using a wide character stream</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">boost::archive::text_woarchive(wostream &amp;s) // saving</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">boost::archive::text_wiarchive(wistream &amp;s) // loading</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">&nbsp;<wbr></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">// a non-portable native binary archive</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">boost::archive::binary_oarchive(ostream &amp;s) // saving</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">boost::archive::binary_iarchive(istream &amp;s) // loading</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">&nbsp;<wbr></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">// a portable XML archive</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">boost::archive::xml_oarchive(ostream &amp;s) // saving</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">boost::archive::xml_iarchive(istream &amp;s) // loading</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">&nbsp;<wbr></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">// a portable XML archive which uses wide characters - use for utf-8 output</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">boost::archive::xml_woarchive(wostream &amp;s) // saving</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">boost::archive::xml_wiarchive(wistream &amp;s) // loading</div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">&nbsp;<wbr></div><div style="background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(243, 243, 243); background-position: 0% 0%; background-repeat: repeat repeat; ">&nbsp;<wbr></div><div>转自：<a href="http://blog.sina.com.cn/s/blog_498c7cd50100iltv.html">http://blog.sina.com.cn/s/blog_498c7cd50100iltv.html</a></div></div><img src ="http://www.cppblog.com/flyinghare/aggbug/117232.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghare/" target="_blank">会飞的兔子</a> 2010-06-05 17:52 <a href="http://www.cppblog.com/flyinghare/archive/2010/06/05/117232.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>boost库之Assign 赋值库</title><link>http://www.cppblog.com/flyinghare/archive/2010/06/05/117231.html</link><dc:creator>会飞的兔子</dc:creator><author>会飞的兔子</author><pubDate>Sat, 05 Jun 2010 09:32:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghare/archive/2010/06/05/117231.html</guid><wfw:comment>http://www.cppblog.com/flyinghare/comments/117231.html</wfw:comment><comments>http://www.cppblog.com/flyinghare/archive/2010/06/05/117231.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghare/comments/commentRss/117231.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghare/services/trackbacks/117231.html</trackback:ping><description><![CDATA[<p style="line-height: normal; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><font size="4" style="line-height: normal; "><strong style="line-height: normal; ">Assign 赋值库</strong></font></p><p style="line-height: normal; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">以从所未有如此容易的方法将常数或生成的数据填入容器。<br style="line-height: normal; "><font size="3" style="line-height: normal; "><strong style="line-height: normal; ">简介</strong></font></p><p style="line-height: normal; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">本库的目的是通过重载operator,() 和 operator()()使 得将数据填入容器中可以更容易。这两个操作符让我们可以构造一列数据然后把它们拷贝进容器中：<br style="line-height: normal; "><strong style="line-height: normal; ">用逗号分隔的列表：<br style="line-height: normal; "></strong>vector&lt;int&gt; v;&nbsp;<br style="line-height: normal; ">v += 1,2,3,4,5,6,7,8,9;<br style="line-height: normal; "><strong style="line-height: normal; ">用括号分隔的列表：</strong><br style="line-height: normal; ">map&lt;string,int&gt; m;&nbsp;<br style="line-height: normal; ">insert( m )( "Bar", 1 )( "Foo", 2 );<br style="line-height: normal; ">除了insert外，push_back，push_front也能用于相应数据结构的对象中（比如deque）。<br style="line-height: normal; "><br style="line-height: normal; "><strong style="line-height: normal; "><font size="3" style="line-height: normal; ">list_of函数</font></strong><br style="line-height: normal; ">用于初始化一个容器<br style="line-height: normal; ">list&lt;int&gt; primes = list_of(1)(2)(3)(5)(7)(11);<br style="line-height: normal; ">map_list_of函数<br style="line-height: normal; ">也是初始化容器，为方便map而特别定义的。以前map的添加多用make_pair。<br style="line-height: normal; ">map&lt;int,int&gt; next = map_list_of(1,2)(2,3)(3,4);<br style="line-height: normal; "><br style="line-height: normal; "><strong style="line-height: normal; "><font size="3" style="line-height: normal; ">truple_list_of函数</font></strong><br style="line-height: normal; ">同map一样，为truple定制的。<br style="line-height: normal; ">vector&lt;tuple&gt; v = tuple_list_of( 1, "foo", 2 )( 3, "bar", 4 );<br style="line-height: normal; "><br style="line-height: normal; "><font size="3" style="line-height: normal; "><strong style="line-height: normal; ">函数 repeat(), repeat_fun() 和 range()<br style="line-height: normal; "></strong></font>多次重复相同的值有时是很烦人的。这时使用 repeat() 会很方便：<br style="line-height: normal; ">vector&lt;int&gt; v;<br style="line-height: normal; ">v += 1,2,3,repeat(10,4),5,6,7,8,9;<br style="line-height: normal; ">// v = [1,2,3,4,4,4,4,4,4,4,4,4,4,5,6,7,8,9]<br style="line-height: normal; ">v = list_of(1).repeat(5,2)(3);<br style="line-height: normal; ">// v = [1,2,2,2,2,2,3]<br style="line-height: normal; ">push_back( v )(1).repeat(1,2)(3);<br style="line-height: normal; ">// v = old v + [1,2,3]<br style="line-height: normal; ">正如我们所见，repeat()的第一个参数是重复第二个参数的次数。</p><p style="line-height: normal; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">template&lt; class T &gt;<br style="line-height: normal; ">struct next {<br style="line-height: normal; ">T seed;<br style="line-height: normal; ">next( T seed ) : seed(seed) { }<br style="line-height: normal; "><br style="line-height: normal; ">T operator()() {<br style="line-height: normal; ">return seed++;<br style="line-height: normal; ">}<br style="line-height: normal; ">};</p><p style="line-height: normal; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">vector&lt;int&gt; v;<br style="line-height: normal; ">v += 1,2,repeat_fun(4,&amp;rand),4;<br style="line-height: normal; ">// v = [1,2,?,?,?,?,4]&nbsp;<br style="line-height: normal; ">push_back( v ).repeat_fun(4,next&lt;int&gt;(0))(4).repeat_fun(4,next&lt;int&gt;(5));<br style="line-height: normal; ">// v = old v + [0,1,2,3,4,5,6,7,8]&nbsp;<br style="line-height: normal; "><br style="line-height: normal; ">对 repeat_fun() 的第二个参数的唯一要求是，它必须是一个无参函数。<br style="line-height: normal; ">vector&lt;int&gt; v, v2;<br style="line-height: normal; ">v = list_of(1)(2)(3);<br style="line-height: normal; ">v2 = list_of(0).range(v).range(v.begin(),v.end())(4);<br style="line-height: normal; ">// v2 = [0,1,2,3,1,2,3,4]<br style="line-height: normal; ">区域插入也实现了。<br style="line-height: normal; "><br style="line-height: normal; "><strong style="line-height: normal; "><font size="3" style="line-height: normal; ">ref_list_of和cref_list_of函数</font></strong><br style="line-height: normal; ">有时需要一个匿名容器，比如用作参数等。ref_list_of也是建立一个容器，只是容器中的值是引用。<br style="line-height: normal; "><br style="line-height: normal; "><strong style="line-height: normal; "><font size="3" style="line-height: normal; ">头文件</font></strong><br style="line-height: normal; ">这个库的头文件非常多，原因是它对STL作了扩充，又因为STL各个库的使用也要调用不同的头文件，这里也保持这个约定。<br style="line-height: normal; ">Header头文件 Includes包含<br style="line-height: normal; ">&lt;boost/assign.hpp&gt; 除了对指针容器的支持以外的所有东西<br style="line-height: normal; ">&lt;boost/assign/list_of.hpp&gt; list_of(), map_list_of(), tuple_list_of(), ref_list_of() 和 cref_list_of()<br style="line-height: normal; ">&lt;boost/assign/std.hpp&gt; 各个标准容器的 operator+=() (见后)<br style="line-height: normal; ">&lt;boost/assign/std/deque.hpp&gt; std::deque的operator+=(), &lt;deque&gt;<br style="line-height: normal; ">&lt;boost/assign/std/list.hpp&gt; std::list的operator+=(), &lt;list&gt;<br style="line-height: normal; ">&lt;boost/assign/std/map.hpp&gt; std::map 和 std::multimap 的 operator+=(), &lt;map&gt;<br style="line-height: normal; ">&lt;boost/assign/std/queue.hpp&gt; std::queue 和 std::priority_queue 的 operator+=(), &lt;queue&gt;<br style="line-height: normal; ">&lt;boost/assign/std/set.hpp&gt; std::set 和 std::multiset 的 operator+=(), &lt;set&gt;<br style="line-height: normal; ">&lt;boost/assign/std/slist.hpp&gt; std::slist 的 operator+=(), &lt;slist&gt; (如果有slist)<br style="line-height: normal; ">&lt;boost/assign/std/stack.hpp&gt; std::stack 的 operator+=(), &lt;stack&gt;<br style="line-height: normal; ">&lt;boost/assign/std/vector.hpp&gt; std::vector 的 operator+=(), &lt;vector&gt;<br style="line-height: normal; ">&lt;boost/assign/assignment_exception.hpp&gt; 类 assignment_exception， 可能会由 list_of() 返回的代理所抛出<br style="line-height: normal; ">&lt;boost/assign/list_inserter.hpp&gt; make_list_inserter(), push_back(), push_front(),insert(), push() 和类 list_inserter， 是整个库的骨干<br style="line-height: normal; ">&lt;boost/assign/ptr_list_inserter.hpp&gt; 函数 ptr_push_back(), ptr_push_front() 和 ptr_insert()<br style="line-height: normal; ">&lt;boost/assign/ptr_map_inserter.hpp&gt; 函数 ptr_map_insert()<br style="line-height: normal; ">&lt;boost/assign/ptr_list_of.hpp&gt; 函数 ptr_list_of()</p><p style="line-height: normal; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><strong style="line-height: normal; "><font size="4" style="line-height: normal; ">小结</font></strong><br style="line-height: normal; ">如题，从未有过如此简单的赋值方式。</p><p style="line-height: normal; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; ">转自：<span  style="color: rgb(0, 0, 0); font-family: 微软雅黑; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; font-size: medium; "><a href="http://hi.baidu.com/ani_di/blog/item/30eaca1ebc38b069f624e48d.html">http://hi.baidu.com/ani_di/blog/item/30eaca1ebc38b069f624e48d.html</a></span></p>
<img src ="http://www.cppblog.com/flyinghare/aggbug/117231.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghare/" target="_blank">会飞的兔子</a> 2010-06-05 17:32 <a href="http://www.cppblog.com/flyinghare/archive/2010/06/05/117231.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++ I/O 重定向</title><link>http://www.cppblog.com/flyinghare/archive/2010/06/05/117229.html</link><dc:creator>会飞的兔子</dc:creator><author>会飞的兔子</author><pubDate>Sat, 05 Jun 2010 09:26:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghare/archive/2010/06/05/117229.html</guid><wfw:comment>http://www.cppblog.com/flyinghare/comments/117229.html</wfw:comment><comments>http://www.cppblog.com/flyinghare/archive/2010/06/05/117229.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghare/comments/commentRss/117229.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghare/services/trackbacks/117229.html</trackback:ping><description><![CDATA[<table style="table-layout: fixed; font-family: Arial; font-size: 12px; line-height: 18px; width: 960px; "><tbody><tr><td style="color: rgb(109, 69, 33); font-family: Arial; word-wrap: break-word; word-break: break-all; visibility: visible !important; zoom: 1 !important; filter: none; font-size: 12px; line-height: 18px; "><div id="blog_text" class="cnt" style="font-family: Arial; word-wrap: break-word; word-break: normal; visibility: visible !important; zoom: 1 !important; filter: none; font-size: 14px; line-height: 20px; color: rgb(109, 69, 33); overflow-x: hidden; overflow-y: hidden; position: static; "><p style="line-height: normal; ">最近的项目需要把cerr的输出写到文件中去，于是开始找这方面的资料。其实I/O重定向是非常简单的。</p><p style="line-height: normal; ">base_io有个rdbuf方法，它的定义如下：</p><p style="line-height: normal; ">&nbsp;&nbsp;&nbsp; basic_streambuf&lt;Elem, Traits&gt; rdbuf() const;<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; basic_streambuf&lt;Elem, Traits&gt;* rdbuf(basic_streambuf&lt;Elem, Trais&gt; *_Sb);</p><p style="line-height: normal; ">事实上，每个C++ 的I/O都有一块独立的缓冲区，只有当调用flush时才把其中的内容写入到文件或输出到屏幕，我们只需要把这块缓冲区的指针替换成别的指针就能实现重定向。MSDN给出了一个非常简洁的例子：</p><p style="line-height: normal; ">main() {<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; ofstream file("data.txt");<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; streambuf* x = cout.rdbuf(file.rdbuf());<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; cout&lt;&lt;"Hello"&lt;&lt;endl;&nbsp;&nbsp;&nbsp;&nbsp; // 这一句将会输出到文件<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; cout.rdbuf(x);<br style="line-height: normal; ">&nbsp;&nbsp;&nbsp; cout&lt;&lt;"World"&lt;&lt;endl;&nbsp;&nbsp;&nbsp; // 这一句将会输出到屏幕<br style="line-height: normal; ">}</p><p style="line-height: normal; ">这段代码虽然简单，但要注意，如果I/O的缓冲区不可用，比如上面，在没重新设置cout.rdbuf前就关闭了文件，那么程序Crash掉了。</p><p style="line-height: normal; "></p><p style="line-height: normal; "></p><p style="line-height: normal; "></p></div></td></tr></tbody></table>转自：<a href="http://hi.baidu.com/ani_di/blog/item/129427310cfc7695a8018ef7.html">http://hi.baidu.com/ani_di/blog/item/129427310cfc7695a8018ef7.html</a><img src ="http://www.cppblog.com/flyinghare/aggbug/117229.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghare/" target="_blank">会飞的兔子</a> 2010-06-05 17:26 <a href="http://www.cppblog.com/flyinghare/archive/2010/06/05/117229.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>boost库之Hash</title><link>http://www.cppblog.com/flyinghare/archive/2010/06/05/117228.html</link><dc:creator>会飞的兔子</dc:creator><author>会飞的兔子</author><pubDate>Sat, 05 Jun 2010 09:23:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghare/archive/2010/06/05/117228.html</guid><wfw:comment>http://www.cppblog.com/flyinghare/comments/117228.html</wfw:comment><comments>http://www.cppblog.com/flyinghare/archive/2010/06/05/117228.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghare/comments/commentRss/117228.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghare/services/trackbacks/117228.html</trackback:ping><description><![CDATA[<p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" size="4" style="line-height: normal; "><strong style="line-height: normal; ">Hash</strong></font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "></font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; ">我曾在很多</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">C</font></span><span style="line-height: normal; ">＋＋书籍中看到作者们抱怨标准库中没有实现</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">hash_set</font></span><span style="line-height: normal; ">或</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">hase_map</font></span><span style="line-height: normal; ">，并非常自信地声称在下一个标准库中一定会增加这两个。我搜索的帮助文档后，很遗憾地没有发现相关库。难道</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">C</font></span><span style="line-height: normal; ">＋＋的狂热爱好者把这么重要的库给忘记了吗？</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">Boost.Functional/hash</font></span><span style="line-height: normal; ">库引进了我的注意，遵循它的指引，我一步一步发发现的散列表的踪迹。</span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "><strong style="line-height: normal; "></strong></font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "><strong style="line-height: normal; ">hash<span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>&lt;boost/functional/hash.hpp&gt;</strong></font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "></font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; ">观察头文件的写法，就知道</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">hash</font></span><span style="line-height: normal; ">是</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">functional</font></span><span style="line-height: normal; ">库中的一员，更进一步，如果你用过</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">STL</font></span><span style="line-height: normal; ">中的</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">&lt;functional&gt;</font></span><span style="line-height: normal; ">，那么多半你也猜到，</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">hash</font></span><span style="line-height: normal; ">是一个函数。不太完全正确，实事上它是一个函数对象。</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">boost</font></span><span style="line-height: normal; ">中实现的散列表，使用的散列函数就是它（至于</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">boost</font></span><span style="line-height: normal; ">中有那些散列函数，以后再列举）。</span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "></font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; ">如果直接使用</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">hash</font></span><span style="line-height: normal; ">，先创建一个实例并像函数一样调用它：</span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "><span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>hash&lt;string&gt; string_hash;</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "><span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>size_t h = string_hash(&#8220;Love&#8221;);</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; ">它支持的类型有</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "></font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">integers</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">floats</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">pointers</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">strings</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; ">扩展类型有</span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">arrays</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">std::pair</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; ">标准容器</span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; ">定制的类型扩展</span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "></font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><strong style="line-height: normal; ">如何定制类型</strong></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "></font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><em style="line-height: normal; "><span style="line-height: normal; ">要编写一个</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">hash</font></span></em><em style="line-height: normal; "><span style="line-height: normal; ">可用的类型，两个必须实现的功能是</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">operator==&nbsp;</font></span></em><em style="line-height: normal; "><span style="line-height: normal; ">和</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">&nbsp;hash_value</font></span></em><span style="line-height: normal; ">，参考下面的实现：</span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">namespace library {</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "><span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>struct book {</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "><span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>int id;</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "><span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>std::string titile;</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "><span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>};</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "><span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>std::size_t hash_value(const book&amp; b) {</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "><span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>boost::hash&lt;int&gt; hasher;</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "><span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>return hasher(b.id);<span style="line-height: normal; ">&nbsp;</span>//&nbsp;</font></span><span style="line-height: normal; ">可以自己写哈希函数</span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "><span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>}</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "><span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>bool operator== (const book&amp; a, const book&amp; b) const {</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "><span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>return a.id == b.id;</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "><span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>}</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">}; // namespace library</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "></font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><strong style="line-height: normal; ">结合散列值</strong></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "></font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; ">纵观上面的</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">hash</font></span><span style="line-height: normal; ">使用方法，只能对一个参数可</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">hash</font></span><span style="line-height: normal; ">值。库也提供了多个参数，示例：</span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">class point {</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "><span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>int x, y;</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">public:</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "><span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>&#8230; &#8230;</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "><span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>bool operator==(const point&amp; other) const {<span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "><span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>return x == other.x &amp;&amp; y == other.y;</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "><span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>}</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "><span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>friend std::size_t hash_value(const point&amp; p) {</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "><span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>std::size_t seed = 0;</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "><span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>boost::hash_combin(seed, p.x);<span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>// combin&nbsp;</font></span><span style="line-height: normal; ">的顺序不同，得出的结果也不同</span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "><span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>boost::hash_combin(seed, p.y);</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "><span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>return seed;</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">};</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "></font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "><strong style="line-height: normal; ">Unordered<span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>&lt;boost/unordered_set.hpp&gt; ,&lt;boost/unordered_map.hpp&gt;</strong></font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "></font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; ">这个库实现了无序关联容器。从某种意义上说，它就是我们需要的散列表。</span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; ">与有序关联容器不同的是，它不需要比较，而是需要</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">hash</font></span><span style="line-height: normal; ">值。我下面列出它的声明，以求不要理解错了。</span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">namespace boost {</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "><span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>template &lt;</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "><span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>class Key,</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "><span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>class Hash = boost::hash&lt;Key&gt;,</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "><span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>class Pred = std::equal_to&lt;Key&gt;,</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "><span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>class Alloc = std::alloctor&lt;Key&gt; &gt;</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "><span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>class unordered_set;</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">}</font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; ">如果</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">class</font></span><span style="line-height: normal; ">不是标准库里的类型，那么</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">hash</font></span><span style="line-height: normal; ">和</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">equal_to</font></span><span style="line-height: normal; ">的非常关键了。</span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "></font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; ">使用</span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "></font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">unordered_set</font></span><span style="line-height: normal; ">、</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">unordered_map</font></span><span style="line-height: normal; ">与</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">set</font></span><span style="line-height: normal; ">、</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">map</font></span><span style="line-height: normal; ">在使用上基本一致。请参考它们的写法。</span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "></font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><strong style="line-height: normal; ">更深层次的探索</strong></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; "></font></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; ">散列表一个不可避免的问题即是&#8220;冲突&#8221;，解决冲突的方法有很多，有分离链表法、线性探测等。据我所知道，分离链表法是在各种库最常用的方法。</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">unordered</font></span><span style="line-height: normal; ">的实现用到了桶（</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">bucket</font></span><span style="line-height: normal; ">），这属于分离链表的变体。每桶对应的是索引，桶里可以有很多元素，它们都是&#8220;冲突&#8221;的。</span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; ">线性探测中，一个非常重要的数据就是：装填因子&#955;，它是散列表中的元素个数与散列表大小的比值。对于探测散列表，&#955;≈</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">0.5</font></span><span style="line-height: normal; ">；对于分离链表，&#955;≈</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">1</font></span><span style="line-height: normal; ">。在手册中，</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">unordered</font></span><span style="line-height: normal; ">中负载因子（</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">load factor</font></span><span style="line-height: normal; ">）的解释是&#8220;</span><span style="line-height: normal; color: black; ">the average number of elements per bucket</span><span style="line-height: normal; color: black; ">&#8221;，平均每个桶中元素的个数，在数学上，此处的</span><span style="line-height: normal; ">负载因子与前面的装填因子&#955;等价。</span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; ">以下几个函数用于控制桶的大小</span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">X( size_type n)<span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></font></span><span style="line-height: normal; ">构造一个新容器，带有</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">n</font></span><span style="line-height: normal; ">个桶</span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">X( InputIterator i, InputIterator j, size_type n)<span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></font></span><span style="line-height: normal; ">构造有</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">n</font></span><span style="line-height: normal; ">个的容器，插入区间</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">[i, j)</font></span><span style="line-height: normal; ">。</span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">float load_factor( ) const<span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></font></span><span style="line-height: normal; ">每个桶中的平均数量</span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">float max_load_factor( ) const<span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></font></span><span style="line-height: normal; ">当前最大的负载因子</span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">float max_load_factor( float z)<span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></font></span><span style="line-height: normal; ">修改最大负载因子，</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">z</font></span><span style="line-height: normal; ">做为参数</span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">void rehash( size_type n)<span style="line-height: normal; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></font></span><span style="line-height: normal; ">修改桶使至少为</span><span style="line-height: normal; "><font face="Times New Roman" style="line-height: normal; ">n</font></span><span style="line-height: normal; ">个，且负载因子小于最大负载因子</span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; color: black; "></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; color: black; ">除了</span><span style="line-height: normal; color: black; ">&nbsp;</span><span class="identifier" style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: black; "><font face="Times New Roman" style="line-height: normal; ">rehash</font></span></span><span style="line-height: normal; color: black; ">&nbsp;</span><span style="line-height: normal; color: black; ">以外，其它成员函数如何影响桶的数量并没有规定，</span><span class="identifier" style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: black; "><font face="Times New Roman" style="line-height: normal; ">insert</font></span></span><span style="line-height: normal; color: black; ">&nbsp;</span><span style="line-height: normal; color: black; ">操作仅当插入导致负载因子大于或等于最大负载因子时允许使得迭代器失效。对于多数实现来说，这意味着只有当此事发生时，插入操作才会改变桶的数量。因此，迭代器只会在调用</span><span style="line-height: normal; color: black; ">&nbsp;</span><span class="identifier" style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: black; "><font face="Times New Roman" style="line-height: normal; ">insert</font></span></span><span style="line-height: normal; color: black; ">&nbsp;</span><span style="line-height: normal; color: black; ">和</span><span style="line-height: normal; color: black; ">&nbsp;</span><span class="identifier" style="line-height: normal; "><span style="line-height: normal; font-size: 12pt; color: black; "><font face="Times New Roman" style="line-height: normal; ">rehash</font></span></span><span style="line-height: normal; color: black; ">&nbsp;</span><span style="line-height: normal; color: black; ">时才可能失效，而指向容器中的元素的指针和引用则永不失效。</span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; color: black; "><br></span></p><p class="MsoNormal" style="line-height: normal; margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; color: rgb(109, 69, 33); font-family: Arial; font-size: 14px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><span style="line-height: normal; color: black; ">转自：</span><span  style="color: rgb(0, 0, 0); font-family: 微软雅黑; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; font-size: medium; "><a href="http://hi.baidu.com/ani_di/blog/item/41406ce6df3c1f24b83820c1.html">http://hi.baidu.com/ani_di/blog/item/41406ce6df3c1f24b83820c1.html</a></span></p>
<img src ="http://www.cppblog.com/flyinghare/aggbug/117228.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghare/" target="_blank">会飞的兔子</a> 2010-06-05 17:23 <a href="http://www.cppblog.com/flyinghare/archive/2010/06/05/117228.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>boost::pool与内存池技术</title><link>http://www.cppblog.com/flyinghare/archive/2010/06/03/117071.html</link><dc:creator>会飞的兔子</dc:creator><author>会飞的兔子</author><pubDate>Thu, 03 Jun 2010 02:08:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghare/archive/2010/06/03/117071.html</guid><wfw:comment>http://www.cppblog.com/flyinghare/comments/117071.html</wfw:comment><comments>http://www.cppblog.com/flyinghare/archive/2010/06/03/117071.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghare/comments/commentRss/117071.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghare/services/trackbacks/117071.html</trackback:ping><description><![CDATA[<span  style="font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; "><span style="font-weight: bold; "><div><span  style="font-weight: normal; "><span style="font-weight: bold; ">建议看这个链接的内容：</span><a href="http://cpp.winxgui.com/cn:mempool-example-boost-pool" style="text-decoration: none; color: rgb(51, 102, 153); font-weight: bold; ">http://cpp.winxgui.com/cn:mempool-example-boost-pool</a></span></div></span><p class="postText" style="padding-top: 0.9em; padding-right: 0px; padding-bottom: 0.9em; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><br></p><p class="postText" style="padding-top: 0.9em; padding-right: 0px; padding-bottom: 0.9em; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;&nbsp;&nbsp; Pool分配是一种分配内存方法，用于快速分配同样大小的内存块，<br>&nbsp;&nbsp;&nbsp; 尤其是反复分配/释放同样大小的内存块的情况。</p><h1 class="postText" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0.5em; padding-left: 1.5em; font-size: 15px; font-family: 'Microsoft yahei', heiti, verdana, sans-serif; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(125, 201, 215); ">1. pool</h1><div class="postText"><br>&nbsp;&nbsp;&nbsp; 快速分配小块内存，如果pool无法提供小块内存给用户，返回0。<br><br>&nbsp;&nbsp;&nbsp; Example:<br><br></div><div class="postText"><div style="border-left-color: windowtext; padding-top: 4px; padding-right: 5.4pt; padding-bottom: 4px; padding-left: 5.4pt; background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(230, 230, 230); width: 1330px; background-position: 0% 50%; background-repeat: repeat repeat; "><div><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">void</span><span style="color: rgb(0, 0, 0); ">&nbsp;func()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boost::pool</span><span style="color: rgb(0, 0, 0); ">&lt;&gt;</span><span style="color: rgb(0, 0, 0); ">&nbsp;p(</span><span style="color: rgb(0, 0, 255); ">sizeof</span><span style="color: rgb(0, 0, 0); ">(</span><span style="color: rgb(0, 0, 255); ">int</span><span style="color: rgb(0, 0, 0); ">));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0); ">^^^^^^^^^^^</span><span style="color: rgb(0, 0, 0); "><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;指定每次分配的块的大小<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">for</span><span style="color: rgb(0, 0, 0); ">&nbsp;(</span><span style="color: rgb(0, 0, 255); ">int</span><span style="color: rgb(0, 0, 0); ">&nbsp;i&nbsp;</span><span style="color: rgb(0, 0, 0); ">=</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 0); ">0</span><span style="color: rgb(0, 0, 0); ">;&nbsp;i&nbsp;</span><span style="color: rgb(0, 0, 0); ">&lt;</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 0); ">10000</span><span style="color: rgb(0, 0, 0); ">;&nbsp;</span><span style="color: rgb(0, 0, 0); ">++</span><span style="color: rgb(0, 0, 0); ">i)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">int</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 0); ">*</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 255); ">const</span><span style="color: rgb(0, 0, 0); ">&nbsp;t&nbsp;</span><span style="color: rgb(0, 0, 0); ">=</span><span style="color: rgb(0, 0, 0); ">&nbsp;p.malloc();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool分配指定大小的内存块；需要的时候，pool会向系统<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;申请大块内存。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;</span><span style="color: rgb(0, 128, 0); ">//</span><span style="color: rgb(0, 128, 0); ">&nbsp;Do&nbsp;something&nbsp;with&nbsp;t;&nbsp;don't&nbsp;take&nbsp;the&nbsp;time&nbsp;to&nbsp;free()&nbsp;it</span><span style="color: rgb(0, 128, 0); "><br></span><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.free(&nbsp;t&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0); ">//</span><span style="color: rgb(0, 128, 0); ">&nbsp;释放内存块，交还给pool，不是返回给系统。</span><span style="color: rgb(0, 128, 0); "><br></span><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div></div></div><div class="postText"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pool的析构函数会释放所有从系统申请到的内存。</div><div class="postText"><br>&nbsp;</div><h1 class="postText" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0.5em; padding-left: 1.5em; font-size: 15px; font-family: 'Microsoft yahei', heiti, verdana, sans-serif; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(125, 201, 215); ">2. object_pool&nbsp;&nbsp;&nbsp;</h1><div class="postText">&nbsp;</div><div class="postText">&nbsp;&nbsp; &nbsp;与pool的区别在于：pool需要指定每次分配的块的大小，object_pool需要指定<br>&nbsp;&nbsp;&nbsp; 每次分配的对象的类型。</div><div class="postText"><br>&nbsp;&nbsp;&nbsp; Example:</div><div class="postText"><div style="border-left-color: windowtext; padding-top: 4px; padding-right: 5.4pt; padding-bottom: 4px; padding-left: 5.4pt; background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(230, 230, 230); width: 1330px; background-position: 0% 50%; background-repeat: repeat repeat; "><div><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">struct</span><span style="color: rgb(0, 0, 0); ">&nbsp;X&nbsp;{&nbsp;...&nbsp;};&nbsp;</span><span style="color: rgb(0, 128, 0); ">//</span><span style="color: rgb(0, 128, 0); ">&nbsp;has&nbsp;destructor&nbsp;with&nbsp;side-effects</span><span style="color: rgb(0, 128, 0); "><br></span><span style="color: rgb(0, 0, 0); "><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">void</span><span style="color: rgb(0, 0, 0); ">&nbsp;func()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boost::object_pool</span><span style="color: rgb(0, 0, 0); ">&lt;</span><span style="color: rgb(0, 0, 0); ">X</span><span style="color: rgb(0, 0, 0); ">&gt;</span><span style="color: rgb(0, 0, 0); ">&nbsp;p;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 0); ">^</span><span style="color: rgb(0, 0, 0); "><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">for</span><span style="color: rgb(0, 0, 0); ">&nbsp;(</span><span style="color: rgb(0, 0, 255); ">int</span><span style="color: rgb(0, 0, 0); ">&nbsp;i&nbsp;</span><span style="color: rgb(0, 0, 0); ">=</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 0); ">0</span><span style="color: rgb(0, 0, 0); ">;&nbsp;i&nbsp;</span><span style="color: rgb(0, 0, 0); ">&lt;</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 0); ">10000</span><span style="color: rgb(0, 0, 0); ">;&nbsp;</span><span style="color: rgb(0, 0, 0); ">++</span><span style="color: rgb(0, 0, 0); ">i)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;X&nbsp;</span><span style="color: rgb(0, 0, 0); ">*</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 255); ">const</span><span style="color: rgb(0, 0, 0); ">&nbsp;t&nbsp;</span><span style="color: rgb(0, 0, 0); ">=</span><span style="color: rgb(0, 0, 0); ">&nbsp;p.malloc();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;注意；X的构造函数不会被调用，仅仅是分配大小为sizeof(X)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;的内存块。如果需要调用构造函数（像new一样），应该调用<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;construct。比如：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;X&nbsp;</span><span style="color: rgb(0, 0, 0); ">*</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 255); ">const</span><span style="color: rgb(0, 0, 0); ">&nbsp;t&nbsp;</span><span style="color: rgb(0, 0, 0); ">=</span><span style="color: rgb(0, 0, 0); ">&nbsp;p.construct();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}</span></div></div></div><div class="postText"><br>&nbsp;</div><h1 class="postText" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0.5em; padding-left: 1.5em; font-size: 15px; font-family: 'Microsoft yahei', heiti, verdana, sans-serif; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(125, 201, 215); ">3. singleton_pool</h1><div class="postText"><br>&nbsp;&nbsp;&nbsp; 与pool用法一样。不同的是：可以定义多个pool类型的object，都是分配同样<br>&nbsp;&nbsp;&nbsp; 大小的内存块；singleton_pool提供静态成员方法分配内存，不用定义object。<br><br>&nbsp;&nbsp;&nbsp; Example:<br><br></div><div class="postText"><div style="border-left-color: windowtext; padding-top: 4px; padding-right: 5.4pt; padding-bottom: 4px; padding-left: 5.4pt; background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(230, 230, 230); width: 1330px; background-position: 0% 50%; background-repeat: repeat repeat; "><div><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">struct</span><span style="color: rgb(0, 0, 0); ">&nbsp;MyPoolTag&nbsp;{&nbsp;};<br><br>&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;boost::singleton_pool</span><span style="color: rgb(0, 0, 0); ">&lt;</span><span style="color: rgb(0, 0, 0); ">MyPoolTag,&nbsp;</span><span style="color: rgb(0, 0, 255); ">sizeof</span><span style="color: rgb(0, 0, 0); ">(</span><span style="color: rgb(0, 0, 255); ">int</span><span style="color: rgb(0, 0, 0); ">)</span><span style="color: rgb(0, 0, 0); ">&gt;</span><span style="color: rgb(0, 0, 0); ">&nbsp;my_pool;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">void</span><span style="color: rgb(0, 0, 0); ">&nbsp;func()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">for</span><span style="color: rgb(0, 0, 0); ">&nbsp;(</span><span style="color: rgb(0, 0, 255); ">int</span><span style="color: rgb(0, 0, 0); ">&nbsp;i&nbsp;</span><span style="color: rgb(0, 0, 0); ">=</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 0); ">0</span><span style="color: rgb(0, 0, 0); ">;&nbsp;i&nbsp;</span><span style="color: rgb(0, 0, 0); ">&lt;</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 0); ">10000</span><span style="color: rgb(0, 0, 0); ">;&nbsp;</span><span style="color: rgb(0, 0, 0); ">++</span><span style="color: rgb(0, 0, 0); ">i)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">int</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 0); ">*</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 255); ">const</span><span style="color: rgb(0, 0, 0); ">&nbsp;t&nbsp;</span><span style="color: rgb(0, 0, 0); ">=</span><span style="color: rgb(0, 0, 0); ">&nbsp;my_pool::malloc();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0); ">//</span><span style="color: rgb(0, 128, 0); ">&nbsp;^^^^^^^^^<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0); ">//</span><span style="color: rgb(0, 128, 0); ">&nbsp;和pool不一样。</span><span style="color: rgb(0, 128, 0); "><br></span><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my_pool::purge_memory();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0); ">//</span><span style="color: rgb(0, 128, 0); ">&nbsp;释放my_pool申请的内存。</span><span style="color: rgb(0, 128, 0); "><br></span><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp;&nbsp;&nbsp;}</span></div></div></div><div class="postText"><br>&nbsp;</div><h1 class="postText" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0.5em; padding-left: 1.5em; font-size: 15px; font-family: 'Microsoft yahei', heiti, verdana, sans-serif; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(125, 201, 215); ">4. pool_alloc</h1><p class="postText" style="padding-top: 0.9em; padding-right: 0px; padding-bottom: 0.9em; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><br>&nbsp;&nbsp;&nbsp; 基于singleton_pool实现，提供allocator（用于STL等）。<br><br>&nbsp;&nbsp;&nbsp; Example:<br></p><div style="border-left-color: windowtext; padding-top: 4px; padding-right: 5.4pt; padding-bottom: 4px; padding-left: 5.4pt; background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(230, 230, 230); width: 1330px; background-position: 0% 50%; background-repeat: repeat repeat; "><div><span style="color: rgb(0, 0, 0); ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">void</span><span style="color: rgb(0, 0, 0); ">&nbsp;func()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::vector</span><span style="color: rgb(0, 0, 0); ">&lt;</span><span style="color: rgb(0, 0, 255); ">int</span><span style="color: rgb(0, 0, 0); ">,&nbsp;boost::pool_allocator</span><span style="color: rgb(0, 0, 0); ">&lt;</span><span style="color: rgb(0, 0, 255); ">int</span><span style="color: rgb(0, 0, 0); ">&gt;</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 0); ">&gt;</span><span style="color: rgb(0, 0, 0); ">&nbsp;v;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">for</span><span style="color: rgb(0, 0, 0); ">&nbsp;(</span><span style="color: rgb(0, 0, 255); ">int</span><span style="color: rgb(0, 0, 0); ">&nbsp;i&nbsp;</span><span style="color: rgb(0, 0, 0); ">=</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 0); ">0</span><span style="color: rgb(0, 0, 0); ">;&nbsp;i&nbsp;</span><span style="color: rgb(0, 0, 0); ">&lt;</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 0); ">10000</span><span style="color: rgb(0, 0, 0); ">;&nbsp;</span><span style="color: rgb(0, 0, 0); ">++</span><span style="color: rgb(0, 0, 0); ">i)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;v.push_back(</span><span style="color: rgb(0, 0, 0); ">13</span><span style="color: rgb(0, 0, 0); ">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}</span></div></div><p class="postText" style="padding-top: 0.9em; padding-right: 0px; padding-bottom: 0.9em; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;&nbsp;&nbsp; 需要的话，必须自己显式地调用<br>&nbsp;&nbsp;&nbsp; boost::singleton_pool&lt;boost::pool_allocator_tag, sizeof(int)&gt;::release_memory()<br>&nbsp;&nbsp;&nbsp; 把allocator分配的内存返回系统。</p><h1 class="postText" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0.5em; padding-left: 1.5em; font-size: 15px; font-family: 'Microsoft yahei', heiti, verdana, sans-serif; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(125, 201, 215); "><br>实现原理</h1><p class="postText" style="padding-top: 0.9em; padding-right: 0px; padding-bottom: 0.9em; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><br>&nbsp;&nbsp;&nbsp; pool每次向系统申请一大块内存，然后分成同样大小的多个小块，<br>&nbsp;&nbsp;&nbsp; 形成链表连接起来。每次分配的时候，从链表中取出头上一块，提<br>&nbsp;&nbsp;&nbsp; 供给用户。链表为空的时候，pool继续向系统申请大块内存。<br>&nbsp;&nbsp;&nbsp; 一个小问题：在pool的实现中，在申请到大块内存后，马上把它分<br>&nbsp;&nbsp;&nbsp; 成小块形成链表。这个过程开销比较大。即你需要分配一小块内存<br>&nbsp;&nbsp;&nbsp; 时，却需要生成一个大的链表。用如下代码测试:</p><div style="border-left-color: windowtext; padding-top: 4px; padding-right: 5.4pt; padding-bottom: 4px; padding-left: 5.4pt; background-image: none; background-attachment: scroll; background-origin: initial; background-clip: initial; background-color: rgb(230, 230, 230); width: 1330px; background-position: 0% 50%; background-repeat: repeat repeat; "><div><span style="color: rgb(0, 0, 0); ">boost::pool</span><span style="color: rgb(0, 0, 0); ">&lt;&gt;</span><span style="color: rgb(0, 0, 0); ">&nbsp;mem_pool(</span><span style="color: rgb(0, 0, 0); ">16</span><span style="color: rgb(0, 0, 0); ">);<br><br></span><span style="color: rgb(0, 0, 255); ">for</span><span style="color: rgb(0, 0, 0); ">(i&nbsp;</span><span style="color: rgb(0, 0, 0); ">=</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 0); ">0</span><span style="color: rgb(0, 0, 0); ">;&nbsp;i&nbsp;</span><span style="color: rgb(0, 0, 0); ">&lt;</span><span style="color: rgb(0, 0, 0); ">&nbsp;NPASS;&nbsp;i</span><span style="color: rgb(0, 0, 0); ">++</span><span style="color: rgb(0, 0, 0); ">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;period&nbsp;</span><span style="color: rgb(0, 0, 0); ">=</span><span style="color: rgb(0, 0, 0); ">&nbsp;clock();<br>&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">for</span><span style="color: rgb(0, 0, 0); ">(n&nbsp;</span><span style="color: rgb(0, 0, 0); ">=</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 0); ">0</span><span style="color: rgb(0, 0, 0); ">;&nbsp;n&nbsp;</span><span style="color: rgb(0, 0, 0); ">&lt;</span><span style="color: rgb(0, 0, 0); ">&nbsp;NITEM;&nbsp;n</span><span style="color: rgb(0, 0, 0); ">++</span><span style="color: rgb(0, 0, 0); ">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;array_ptr[n]&nbsp;</span><span style="color: rgb(0, 0, 0); ">=</span><span style="color: rgb(0, 0, 0); ">&nbsp;(</span><span style="color: rgb(0, 0, 255); ">int</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 0); ">*</span><span style="color: rgb(0, 0, 0); ">)mem_pool.malloc();<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255); ">for</span><span style="color: rgb(0, 0, 0); ">(n&nbsp;</span><span style="color: rgb(0, 0, 0); ">=</span><span style="color: rgb(0, 0, 0); ">&nbsp;</span><span style="color: rgb(0, 0, 0); ">0</span><span style="color: rgb(0, 0, 0); ">;&nbsp;n&nbsp;</span><span style="color: rgb(0, 0, 0); ">&lt;</span><span style="color: rgb(0, 0, 0); ">&nbsp;NITEM;&nbsp;n</span><span style="color: rgb(0, 0, 0); ">++</span><span style="color: rgb(0, 0, 0); ">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;mem_pool.free(array_ptr[n]);<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;period&nbsp;</span><span style="color: rgb(0, 0, 0); ">=</span><span style="color: rgb(0, 0, 0); ">&nbsp;clock()&nbsp;</span><span style="color: rgb(0, 0, 0); ">-</span><span style="color: rgb(0, 0, 0); ">&nbsp;period;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: rgb(0, 0, 0); ">"</span><span style="color: rgb(0, 0, 0); ">pool&lt;&gt;&nbsp;&nbsp;:&nbsp;period&nbsp;=&nbsp;%5d&nbsp;ms&nbsp;</span><span style="color: rgb(0, 0, 0); ">"</span><span style="color: rgb(0, 0, 0); ">,&nbsp;period);<br>}</span></div></div><p class="postText" style="padding-top: 0.9em; padding-right: 0px; padding-bottom: 0.9em; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">&nbsp;&nbsp;&nbsp; 可以发现，第一遍花的时间明显多于后面的。<br><br>&nbsp;&nbsp;&nbsp; 而且在pool的使用过程中如果不是恰好把链表中所有的小块都用上<br>&nbsp;&nbsp;&nbsp; 的话，在链表中最后的一些小块会始终用不上。把这些小块加入链<br>&nbsp;&nbsp;&nbsp; 表是多余的。虽然这个开销可能很小:)<br>&nbsp;</p><p class="postText" style="padding-top: 0.9em; padding-right: 0px; padding-bottom: 0.9em; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">转自：<a href="http://blog.csdn.net/xushiweizh/archive/2006/11/21/1400426.aspx">http://blog.csdn.net/xushiweizh/archive/2006/11/21/1400426.aspx</a></p></span>
<img src ="http://www.cppblog.com/flyinghare/aggbug/117071.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghare/" target="_blank">会飞的兔子</a> 2010-06-03 10:08 <a href="http://www.cppblog.com/flyinghare/archive/2010/06/03/117071.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用LuaPlus在C++项目中集成Lua脚本</title><link>http://www.cppblog.com/flyinghare/archive/2010/03/13/109617.html</link><dc:creator>会飞的兔子</dc:creator><author>会飞的兔子</author><pubDate>Sat, 13 Mar 2010 10:03:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghare/archive/2010/03/13/109617.html</guid><wfw:comment>http://www.cppblog.com/flyinghare/comments/109617.html</wfw:comment><comments>http://www.cppblog.com/flyinghare/archive/2010/03/13/109617.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghare/comments/commentRss/109617.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghare/services/trackbacks/109617.html</trackback:ping><description><![CDATA[<p>摘自：<a href="http://blog.csdn.net/yjn001/archive/2009/01/16/3795842.aspx">http://blog.csdn.net/yjn001/archive/2009/01/16/3795842.aspx</a><br>花了两天时间，费了好大的功夫才实现了C＋＋项目中集成Lua脚本的可行性分析。下面的工作就是去写脚本了，在写脚本之前先把C++集成Lua的经验总结一下。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 目前能实现C++集成Lua的有很多。比较常见的有LuaPlus,LuaBind,ToLua++,LuaWrapper等。这几种我都试过了，各有优缺点。</p>
<p>&nbsp;&nbsp;&nbsp; LuaBind，确实不错，很强大。如果不是它需要Boost库支持的话我就选它了。</p>
<p>&nbsp;&nbsp;&nbsp; ToLua++，我只是粗略的看了下，因为编译太麻烦，很快就放弃了。不过看网上评价还不错。</p>
<p>&nbsp;&nbsp;&nbsp; LuaWrapper，国内前辈所出，本想支持一下，可一看说明还是需要Boost，只好放弃了。</p>
<p>并不是因为Boost不好，而是因为我的项目连带工程源代码都要投递去应聘的，不能保证对方机器上也安装了Boost库。</p>
<p>&nbsp;&nbsp;&nbsp; 最后还是选择了LuaPlus，感觉还可以，下面是使用经验总结。</p>
<p>1。创建一个State。</p>
<p>&nbsp;&nbsp; LuaStateOwner* pState = NULL;<br>&nbsp;&nbsp; pState = new LuaStateOwner(true);<br>&nbsp;&nbsp; if ( !pState )<br>&nbsp;&nbsp;&nbsp; return E_OUTOFMEMORY;</p>
<p>注意：LuaStateOwner构造函数参数true表示在构造的过程中对Lua标准库进行初始化。这一点非常重要。一开始我调用的不带参数的构造函数，然后在.lua中调用math.random()的时侯就一直失败，今天研究了一下午才弄明白的。</p>
<p>2. 注册C＋＋函数到Lua<br>&nbsp;&nbsp; (这一点我没试，直接引用示例里的)</p>
<p>static int PrintLSNumber(LuaState* state)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp; LuaStack args(state);</p>
<p>&nbsp;&nbsp;&nbsp; // Verify it is a number and print it.<br>&nbsp;&nbsp;&nbsp; if (args[1].IsNumber()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%f ", args[1].GetNumber());<br>&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; // No return values.<br>&nbsp;&nbsp;&nbsp; return 0;<br>}</p>
<p>&nbsp;&nbsp; LuaObject globalsObj = (*pState)-&gt;GetGlobals();<br>&nbsp;&nbsp; globalsObj.Register("PrintNumber", PrintLSNumber);</p>
<p><br>3。注册C＋＋类成员函数到Lua</p>
<p>&nbsp;&nbsp; LuaObject globalsObj = (*pState)-&gt;GetGlobals();<br>&nbsp;&nbsp; CTest test; //CTest为类名<br>&nbsp;&nbsp; globalsObj.RegisterDirect( "update", test, &amp;CTest::Update );</p>
<p>Update为CTest的一个成员函数，</p>
<p>双引号中的update是指注册到Lua中的函数名,在lua脚本中使用update()即调用了test对象的Update()函数。</p>
<p>4.从文件中载入并执行脚本</p>
<p>&nbsp;&nbsp; int iret = (*pState)-&gt;DoFile( "test.lua" );<br>&nbsp;&nbsp; if ( 0 != iret )<br>&nbsp;&nbsp;&nbsp; return false;<br>返回值为0表示成功,否则不成功.</p>
<p>5.C＋＋获取Lua脚本中的变量</p>
<p>&nbsp;&nbsp; float x = (*pState)-&gt;GetGlobal( "x" ).GetFloat();<br>&nbsp;&nbsp; 注意,要在DoFile之后才能从lua中获取变量，此时文件已被载入。</p>
<p>6.C＋＋中调用脚本里的函数</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LuaFunction&lt;bool&gt; RandBuild = (*pState)-&gt;GetGlobal("RandBuild");<br>&nbsp;&nbsp;&nbsp;&nbsp; bool ret = RandBuild();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; test.lua文件中：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; function RandBuild()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; math.random(); --第一次的随机数太小，合弃<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x = math.random( -100, 100 );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br>&nbsp;&nbsp;&nbsp;&nbsp; end;</p>
<p>7.Lua脚本中调用C++函数</p>
<p>&nbsp;&nbsp;&nbsp; 这里可以调用的就是前面注册过的C＋＋函数，调用时直接使用注册时的函数名。<br>&nbsp;&nbsp;&nbsp; 比如第3步中的，如果脚本中写update()，就相当于在C＋＋中test.Update();</p>
<p>8.C＋＋中直接调用注册的Lua函数</p>
<p>&nbsp;&nbsp;&nbsp; (*pState)-&gt;DoString( "update()" );<br>&nbsp;&nbsp;&nbsp; 这一句意思是只执行"update()"这一句脚本。</p>
<p>另外，项目目录下还要放上LuaPlus和Lua的头文件，还有LuaPlus的.lib和.dll。这些可以在LuaPlus网站上下载到。<a href="http://luaplus.org/tiki-index.php?page=LuaPlus+Home+Page">http://luaplus.org/tiki-index.php?page=LuaPlus+Home+Page</a><br>草草的写完，有点乱，就将就着看吧。</p>
<p>&nbsp;</p>
<p>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/yjn001/archive/2009/01/16/3795842.aspx">http://blog.csdn.net/yjn001/archive/2009/01/16/3795842.aspx</a></p>
<img src ="http://www.cppblog.com/flyinghare/aggbug/109617.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghare/" target="_blank">会飞的兔子</a> 2010-03-13 18:03 <a href="http://www.cppblog.com/flyinghare/archive/2010/03/13/109617.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通过reverse_iterator删除元素</title><link>http://www.cppblog.com/flyinghare/archive/2010/03/10/109332.html</link><dc:creator>会飞的兔子</dc:creator><author>会飞的兔子</author><pubDate>Wed, 10 Mar 2010 01:54:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghare/archive/2010/03/10/109332.html</guid><wfw:comment>http://www.cppblog.com/flyinghare/comments/109332.html</wfw:comment><comments>http://www.cppblog.com/flyinghare/archive/2010/03/10/109332.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghare/comments/commentRss/109332.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghare/services/trackbacks/109332.html</trackback:ping><description><![CDATA[<p>转自：<a href="http://blog.csdn.net/kuanghong/archive/2008/08/20/2801280.aspx">http://blog.csdn.net/kuanghong/archive/2008/08/20/2801280.aspx</a><br><br>调用reverse_iterator的base成员函数可以产生&#8220;对应的&#8221;iterator，但这句话有些辞不达意。举个例子，看一下这段代码，我们首先把从数字1-5放进一个vector中，然后产生一个指向3的reverse_iterator，并且通过 <br>reverse_iterator的base初始化一个iterator：</p>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">vector&nbsp;v;&nbsp;<br>v.reserve(</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">);&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;参见条款14&nbsp;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">；i&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">;&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">&nbsp;i)&nbsp;{&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;向vector插入1到5&nbsp;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">v.push_back(i);&nbsp;<br>}&nbsp;<br>vector::reverse_iterator&nbsp;ri&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;使ri指向3&nbsp;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">find(v.rbegin(),&nbsp;v.rend(),&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">);&nbsp;<br>vector::iterator&nbsp;i(ri.</span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">());&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;使i和ri的base一样</span></div>
<p>&nbsp;</p>
<p>执行上述代码后，可以想到产生的结果就像这样：&nbsp;<br>&nbsp;<img height=145 alt="" src="http://www.cppblog.com/images/cppblog_com/flyinghare/xxyycpp1.png" width=217 border=0><br>这张图很好，显示了reverse_iterator和它对应的base iterator之间特有的偏移量，就像rbegin()和rend()与相关的begin()和end()一样，但并没有说出了所有你需要知道的东西。特别是，它并没有解释怎样在ri上实现你在i上想要完成的操作。有些容器的成员函数只接受iterator类型的参数，所以如果你想要在ri所指的位置插入一个新元素，你不能直接这么做，因为vector的insert函数不接受reverse_iterator。如果你想要删除ri 所指位置上的元素也会有同样的问题。erase成员函数会拒绝reverse_iterator，坚持要求iterator。为了完成删除和一些形式的插入操作，你必须先通过base函数将reverse_iterator转换成iterator，然后用iterator来完成工作。 <br>先让我们假设你要在ri指出的位置上把一个新元素插入v。特别的，我们假设你要插入的值是99。记住ri在上 <br>图中遍历的顺序是自右向左，而且插入操作会将新元素插入到ri位置，并且将原先ri位置的元素移到遍历过程 <br>的&#8220;下一个&#8221;位置，我们认为3应该出现在99的左侧。插入操作之后，v看起来像这样：&nbsp;<br>&nbsp;<img height=52 alt="" src="http://www.cppblog.com/images/cppblog_com/flyinghare/xxyycpp2.png" width=186 border=0><br>当然，我们不能用ri来指定插入的地方，因为它不是一个iterator。我们必须用i来代替。如上所述，当ri指向3时，i（就是ri.base()）指向4。如果我们用ri来指定插入位置，那么用i指向插入位置，那个假设就是正确的。结论呢？ <br>● 要实现在一个reverse_iterator ri指出的位置上插入新元素，在ri.base()指向的位置插入就行了。对于 <br>insert操作而言，ri和ri.base()是等价的，而且ri.base()真的是ri对应的iterator。 <br>现在再来考虑删除元素的情况。回顾一下最初的vector（也就是在插入99之前）ri与i的关系：&nbsp;<br>&nbsp;<img height=132 alt="" src="http://www.cppblog.com/images/cppblog_com/flyinghare/xxyycpp3.png" width=176 border=0><br>如果你要删除ri指向的元素，你不能直接使用i了，因为i与ri不是指向同一个元素。因此，你要删除的是i的前一个元素。 <br>● 要实现在一个reverse_iterator ri指出的位置上删除元素，就应该删除ri.base()的前一个元素。对于删除操作而言，ri和ri.base()并不等价，而且ri.base()不是ri对应的iterator。 <br>我们还是有必要看看删除操作的代码，因为它还挺令人惊讶的。</p>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">vector&nbsp;v;&nbsp;<br>&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;向v插入1到5，同上&nbsp;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">vecot::reverse_iterator&nbsp;ri&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;<br>find(v.rbegin(),&nbsp;v.rend(),&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">);&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;同上，ri指向3&nbsp;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">v.erase(</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">ri.</span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">());&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;尝试删除ri.base()前面的元素；对于vector，一般来说编译不通过</span></div>
<p>&nbsp;</p>
<p>这个设计并不存在什么问题。表达式--ri.base()确实能够指出我们需要删除的元素。而且，它们能够处理除了 <br>vector和string之外的其他所有容器。它可能也能处理vector和string，但对于大多数vector和string的实现，它无。在这样的实现下，iterator（和const_iterator）会采用内建的指针来实现，所以ri.base()的结果是一个指针。C和C++都规定了不能直接修改函数返回的指针，所以在string和vector的迭代器是指针的STL平台上，像--ri.base()这样的表达式无法通过编译。要移植从一个由reverse_iterator指出的位置删除元素时，你应该尽量避免修改base的返回值。没问题。如果你不能减少调用base的返回值，只需要先增加reverse_iterator的值，然后再调用base！</p>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;同上&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">v.erase((</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">ri).</span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">());&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;删除ri指向的元素；&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;这下编译没问题了！</span></div>
<p>&nbsp;</p>
<p>因为这个方法适用于所有的标准容器，这是删除一个由reverse_iterator指出的元素时首选的技巧。 <br>现在已经很清楚了，reverse_iterator的base成员函数返回一个&#8220;对应的&#8221;iterator的说法并不准确。对于插入操作而言，的确如此；但是对于删除操作，并非如此。当需要把reverse_iterator转换成iterator的时候，有一点非常重要的是你必须知道你准备怎么处理返回的iterator，因为只有这样你才能决定你得到的iterator是否是你需要的。</p>
<p>&nbsp;</p>
<p>本文来自CSDN博客，转载请标明出处：<a href="http://blog.csdn.net/kuanghong/archive/2008/08/20/2801280.aspx">http://blog.csdn.net/kuanghong/archive/2008/08/20/2801280.aspx</a></p>
<img src ="http://www.cppblog.com/flyinghare/aggbug/109332.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghare/" target="_blank">会飞的兔子</a> 2010-03-10 09:54 <a href="http://www.cppblog.com/flyinghare/archive/2010/03/10/109332.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在C++中嵌入python并捕获错误</title><link>http://www.cppblog.com/flyinghare/archive/2010/01/31/106897.html</link><dc:creator>会飞的兔子</dc:creator><author>会飞的兔子</author><pubDate>Sun, 31 Jan 2010 13:46:00 GMT</pubDate><guid>http://www.cppblog.com/flyinghare/archive/2010/01/31/106897.html</guid><wfw:comment>http://www.cppblog.com/flyinghare/comments/106897.html</wfw:comment><comments>http://www.cppblog.com/flyinghare/archive/2010/01/31/106897.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/flyinghare/comments/commentRss/106897.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/flyinghare/services/trackbacks/106897.html</trackback:ping><description><![CDATA[<p>这是在 <a href="http://www.gamedev.net/">http://www.gamedev.net</a> 上看到有人提类似的问题</p>
<p>原主题：<a href="http://www.gamedev.net/community/forums/topic.asp?topic_id=491813">http://www.gamedev.net/community/forums/topic.asp?topic_id=491813</a><br>名叫&nbsp; SiCrane&nbsp; Staff 的老外回复内容如下：<br></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">boost</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">shared_ptr.hpp</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">boost</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">python.hpp</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">windows.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;PyInitializer&nbsp;{<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;PyInitializer()&nbsp;&nbsp;{&nbsp;Py_Initialize();&nbsp;}<br>&nbsp;&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">PyInitializer()&nbsp;{&nbsp;Py_Finalize();&nbsp;}<br></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;PyInitializer(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;PyInitializer&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;PyInitializer&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;PyInitializer&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">);<br>};<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;argv[])&nbsp;{<br>&nbsp;&nbsp;PyInitializer&nbsp;py;<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;PyRun_SimpleString(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">import&nbsp;cStringIO</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;PyRun_SimpleString(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">import&nbsp;sys</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;PyRun_SimpleString(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">sys.stderr&nbsp;=&nbsp;cStringIO.StringIO()</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;stuff&nbsp;that&nbsp;might&nbsp;raise&nbsp;a&nbsp;Python&nbsp;exception</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;boost::python::import(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">my_script</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;if&nbsp;my_script&nbsp;doesn't&nbsp;exist</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;}&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;(boost::python::error_already_set)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;PyErr_Print();<br>&nbsp;&nbsp;&nbsp;&nbsp;boost::python::</span><span style="COLOR: #0000ff">object</span><span style="COLOR: #000000">&nbsp;sys(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boost::python::handle</span><span style="COLOR: #000000">&lt;&gt;</span><span style="COLOR: #000000">(PyImport_ImportModule(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">sys</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">))<br>&nbsp;&nbsp;&nbsp;&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;boost::python::</span><span style="COLOR: #0000ff">object</span><span style="COLOR: #000000">&nbsp;err&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;sys.attr(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">stderr</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;std::</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;err_text&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;boost::python::extract</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">std::</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(err.attr(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">getvalue</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)());<br>&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;err_text.c_str(),&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Python&nbsp;Error</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;MB_OK);<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br></span></div>
<img src ="http://www.cppblog.com/flyinghare/aggbug/106897.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/flyinghare/" target="_blank">会飞的兔子</a> 2010-01-31 21:46 <a href="http://www.cppblog.com/flyinghare/archive/2010/01/31/106897.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>