﻿<?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++博客-canaan-随笔分类-外文翻译</title><link>http://www.cppblog.com/chinapeter2008/category/14357.html</link><description>c++爱好者</description><language>zh-cn</language><lastBuildDate>Sat, 19 Jun 2021 20:07:34 GMT</lastBuildDate><pubDate>Sat, 19 Jun 2021 20:07:34 GMT</pubDate><ttl>60</ttl><item><title>ONVIF协议云台服务规范(三)-移动操作 ONVIF PTZ Service Specification-Move Operations</title><link>http://www.cppblog.com/chinapeter2008/archive/2021/06/19/217721.html</link><dc:creator>canaan</dc:creator><author>canaan</author><pubDate>Sat, 19 Jun 2021 12:38:00 GMT</pubDate><guid>http://www.cppblog.com/chinapeter2008/archive/2021/06/19/217721.html</guid><wfw:comment>http://www.cppblog.com/chinapeter2008/comments/217721.html</wfw:comment><comments>http://www.cppblog.com/chinapeter2008/archive/2021/06/19/217721.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chinapeter2008/comments/commentRss/217721.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinapeter2008/services/trackbacks/217721.html</trackback:ping><description><![CDATA[<h2>5.3&nbsp;&nbsp; &nbsp;移动操作<br /></h2><p>&nbsp;&nbsp;&nbsp; 本节介绍三种移动PTZ单元操作，绝对、相对或移动。所有操作都需要profile token，引用PTZ配置中的Media Profile。<br /></p><p>&nbsp;&nbsp; &nbsp;所有移动命令应以非阻塞方式执行，表示不应等到请求的移动操作完成。新的移动请求可以覆盖最后的移动操作。</p><p>&nbsp;&nbsp; &nbsp;由于本规范涉及的物理设备范围广泛，因此本规范不要求对PTZ移动操作的特定相应时间。但是设备应尽量减少PTZ移动命令响应的延迟。设备没有完全控制PTZ控制输入和设备移动的滞后。网络与客户端的延迟会增加滞后。实现应该尽快减少设备的延迟。</p><p>5.3.1.&nbsp;&nbsp; &nbsp;绝对移动（AbsoluteMove）<br />&nbsp;&nbsp; &nbsp;如果PTZ节点支持绝对水平/俯仰或绝对变焦的移动，则应支持绝对移动操作。这个命令的位置参数指定PTZ单元要移动的绝对位置。它分为一个可选的水平/俯仰元素和一个可选的变焦元素。如果忽略了水平/俯仰位置，则当前的水平/俯仰运动不受此命令的影响。变焦也是同样的原理。</p><p>&nbsp;&nbsp; &nbsp;PTZ节点支持的绝对位置空间，如果省略了空间信息，则PTZ配置的相应的默认空间，采用指定控件的媒体属性。设备仅为有绝对位置空间提供支持绝对水平/俯仰或变焦的服务。现有的移动操作命令中的速度参数比PTZ配置中的默认速度优先级要高。如果空间引用了速度参数，那么需要支持PTZ节点支持的速度空间。</p><p>&nbsp;&nbsp; &nbsp;如果无法达到所要求的绝对位置，操作将失败。</p><p><strong>请求（REQUEST）:</strong><br />&#8226; ProfileToken [tt:ReferenceToken]<br />对现有媒体配置文件的引用<br />&#8226; Position [tt:PTZVector]<br />指定绝对目标位置的矢量<br />&#8226; Speed &#8211; 可选[tt:PTZSpeed]<br />可选速度矢量<br /><strong>响应（RESPONSE）</strong>: 空消息<br /><strong>错误（FAULTS）</strong>：<br />&#8226; env:Sender - ter:InvalidArgVal - ter:NoProfile<br />请求的配置文件token内ProfileToken不存在。<br />&#8226; env:Sender - ter:InvalidArgVal - ter:NoPTZProfile<br />请求的配置文件token未引用PTZ配置。<br />&#8226; env:Sender - ter:InvalidArgVal - ter:SpaceNotSupported<br />引用了PTZ节点不支持的空间。<br />&#8226; env:Sender - ter:InvalidArgVal - ter:InvalidPosition<br />请求的位置超出了界限。<br />&#8226; env:Sender - ter:InvalidArgVal - ter:InvalidSpeed<br />请求的速度超出了界限。<br /><strong>访问权限类（ACCESS CLASS）</strong>：<br />ACTUATE<br /></p><h3>5.3.2.&nbsp;&nbsp; &nbsp;相对移动（RelativeMove）<br /></h3><p>&nbsp;&nbsp;&nbsp; 如果PTZ节点支持相对水平/俯仰或相对变焦移动，则需要支持相对移动（RelativeMove）操作。此操作的转换参数指定当前位置与要移动的位置的插值。该操作可分为一个可选的水平/俯仰元素和一个可选的变焦参数。如果水平/俯仰忽略掉了，那么当前的水平/俯仰位置不会受此命令的影响。变焦元素也同样。<br />&nbsp;&nbsp; &nbsp;转换元素中引用的空间应该为PTZ节点支持的转换空间。如果转换参数的空间信息忽略掉了，那么将根据PTZ配置的默认空间。设备需要支持相对水平/俯仰移动，相对变焦移动或不支持相对运动。<br />&nbsp;&nbsp; &nbsp;在请求移动的命令中携带的速度参数优先于PTZ配置中的默认速度。如果空间引用了速度参数，则PTZ节点需要支持速度空间。<br />&nbsp;&nbsp; &nbsp;通过发送水平/俯仰和变焦0值命令可以在当前位置停止PTZ单元。停止应具有与引用相对空间完全相同的效果。<br />&nbsp;&nbsp; &nbsp;如果请求转换后的绝对位置是无法到达的，那么PTZ节点需要移动最接近的有效位置。<br /><strong>请求（REQUEST）:</strong><br />&#8226; ProfileToken [tt:ReferenceToken]<br />对现有媒体配置文件的引用<br />&#8226; Translation [tt:PTZVector]<br />指定相对于当前位置的位置平移的向量<br />&#8226; Speed &#8211; 可选[tt:PTZSpeed]<br />可选速度矢量<br /><strong>响应（RESPONSE）</strong>: 空消息<br /><strong>错误（FAULTS）</strong>：<br />&#8226; env:Sender - ter:InvalidArgVal - ter:NoProfile<br />请求的配置文件token内ProfileToken不存在。<br />&#8226; env:Sender - ter:InvalidArgVal - ter:NoPTZProfile<br />请求的配置文件token未引用PTZ配置。<br />&#8226; env:Sender - ter:InvalidArgVal - ter:SpaceNotSupported<br />引用了PTZ节点不支持的空间。<br />&#8226; env:Sender - ter:InvalidArgVal - ter:InvalidTranslation<br />请求的转换超出了界限。<br />&#8226; env:Sender - ter:InvalidArgVal - ter:InvalidSpeed<br />请求的速度超出了界限。<br /><strong>访问权限类（ACCESS CLASS）</strong>：<br />ACTUATE<br /></p><h3>5.3.3.&nbsp;&nbsp; &nbsp;连续移动（ContinuousMove）<br /></h3><p>&nbsp;&nbsp;&nbsp; 具有PTZ功能的设备应支持连续移动。此命令的速度参数为水平/俯仰和缩放指定的有符号的速度值。组合的水平/俯仰元素及变焦元素也是可选的。如果水平/俯仰元素忽略掉了，当前的水平/俯仰元素则不受此命令的影响。变焦元素也是如此。引用有速度元素的空间的PTZ节点需要支持速度空间。如果速度参数忽略掉了空间信息，那么采用相应的指定媒体文件的PTZ配置的默认空间。设备通过仅为支持的情况提供速度空间来支持连续水平/俯仰移动和连续变焦动作。<br />&nbsp;&nbsp; &nbsp;当前移动操作的超时参数优先于相应PTZ配置的默认超时参数。超时参数决定PTZ节点的连续移动的时间。<br />&nbsp;&nbsp; &nbsp;当0作为该轴的连续移动参数时，设备应停止在特定轴（水平，俯仰或变焦）的移动。引用的速度空间也应有独立的停止功能。这个命令在连续移动的影响与在5.3.5节中的停止命令是一样的。<br />&nbsp;&nbsp; &nbsp;请求的速度得到的绝对位置是不能到达的，则PTZ节点应移动到最接近的能到达的位置。连续移动操作的典型应用是通过操纵杆控制PTZ。<br /><strong>请求（REQUEST）:</strong><br />&#8226; ProfileToken [tt:ReferenceToken]<br />对现有媒体配置文件的引用<br />&#8226; Velocity [tt:PTZSpeed]<br />速度矢量指定水平，俯仰和变焦的速度。<br />&#8226; Timeout&#8211; 可选[tt:duration]<br />可选超时<br /><strong>响应（RESPONSE）</strong>: 空消息<br /><strong>错误（FAULTS）</strong>：<br />&#8226; env:Sender - ter:InvalidArgVal - ter:NoProfile<br />请求的配置文件token内ProfileToken不存在。<br />&#8226; env:Sender - ter:InvalidArgVal - ter:NoPTZProfile<br />请求的配置文件token未引用PTZ配置。<br />&#8226; env:Sender - ter:InvalidArgVal - ter:SpaceNotSupported<br />引用了PTZ节点不支持的空间。<br />&#8226; env:Sender - ter:InvalidArgVal - ter:InvalidTranslation<br />请求的转换超出了界限。<br />&#8226; env:Sender - ter:InvalidArgVal - ter:TimeoutNotSupported<br />指定的超时参数不在支持的超时时间范围内。<br />&#8226; env:Sender - ter:InvalidArgVal - ter:InvalidSpeed<br />请求的速度超出了界限。<br /><strong>访问权限类（ACCESS CLASS）</strong>：<br />ACTUATE<br /></p><h3>5.3.4.&nbsp;&nbsp; &nbsp;地理移动（GeoMove）<br /></h3><p>&nbsp;&nbsp;&nbsp; 设备有GeoMove信号，则PTZ节点需要支持这类命令。<br />&nbsp;&nbsp; &nbsp;可选的AreaHeight和AreaWidth参数可以添加到参数中，所以PTZ设备可以决定变焦因子。如果没有提供AreaHeight和AreaWidth，该单元将不会更改变焦。AreaHeight和AreaWidth用米来表示。<br />&nbsp;&nbsp; &nbsp;请求的转换过程中的速度参数优先于相应的PTZ配置的默认速度。如果引用的空间含有速度参数，那么PTZ节点应支持速度空间。<br />&nbsp;&nbsp; &nbsp;如果PTZ设备不支持自动检索地理位置，那么在执行地理引用命令之前使用SetGeoLocation进行设置。客户端如果在设备设置地理位置之前发送GeoMove命令，设备应返回一个错误。<br />&nbsp;&nbsp; &nbsp;取决于PTZ设备的运动方式，请求的位置可能无法到达。这种情况下设备应返回一个错误，表示由于物理限制无法执行请求的操作。<br /><strong>请求（REQUEST）:</strong><br />&#8226; ProfileToken [tt:ReferenceToken]<br />对现有媒体配置文件的引用<br />&#8226; Target [tt:GeoLocation]<br />目标坐标。<br />&#8226; Speed &#8211; 可选[tt:PTZSpeed]<br />指定水平，俯仰和变焦的速度矢量。<br />&#8226; AreaWidth &#8211; 可选[xs:float]<br />要显示的可选区域。<br />&#8226; AreaHeight &#8211; 可选[xs:float]<br />要显示的可选区域。<br /></p><p><strong>响应（RESPONSE）</strong>: 空消息<br /><strong>错误（FAULTS）</strong>：<br />&#8226; env:Sender - ter:InvalidArgVal - ter:NoProfile<br />请求的配置文件token内ProfileToken不存在。<br />&#8226; env:Sender - ter:InvalidArgVal - ter:NoPTZProfile<br />请求的配置文件token未引用PTZ配置。<br />&#8226; env:Sender - ter:InvalidArgVal - ter:GeoMoveNotSupported<br />设备不支持地理移动。<br />&#8226; env:Sender - ter:InvalidArgVal - ter:UnreachablePosition<br />请求的转换超出了界限。<br />&#8226; env:Sender - ter:InvalidArgVal - ter:TimeoutNotSupported<br />指定的超时参数不在支持的超时时间范围内。<br />&#8226; env:Sender - ter:InvalidArgVal - ter:GeoLocationUnknown<br />由于地理位置未配置或不可用，该单元无法执行GeoMove。<br /><strong>访问权限类（ACCESS CLASS）</strong>：<br />ACTUATE<br /></p><h3>5.3.5.&nbsp;&nbsp; &nbsp;停止（Stop）<br /></h3><p>&nbsp;&nbsp;&nbsp; PTZ设备需支持停止操作。如果没有指定停止的参数，那么这个命令将停止所有正在进行的水平，俯仰和变焦动作。通过指定相应的停止参数可以停止对应的操作。<br /><strong>请求（REQUEST）:</strong><br />&#8226; ProfileToken [tt:ReferenceToken]<br />对现有媒体配置文件的引用<br />&#8226; PanTilt &#8211; 可选[xs:boolean]<br />停止水平和俯仰操作（默认为true）。<br />&#8226; Zoom &#8211; 可选[xs:boolean]<br />停止变焦操作（默认为true）。<br />响应（RESPONSE）: 空消息<br /><strong>错误（FAULTS）</strong>：<br />&#8226; env:Sender - ter:InvalidArgVal - ter:NoProfile<br />请求的配置文件token内ProfileToken不存在。<br />&#8226; env:Sender - ter:InvalidArgVal - ter:NoPTZProfile<br />请求的配置文件token未引用PTZ配置。<br /><strong>访问权限类（ACCESS CLASS）</strong>：<br />ACTUATE<br /></p><h3>5.3.6.&nbsp;&nbsp; &nbsp;移动并开始跟踪（MoveAndStartTracking）<br /></h3><p>&nbsp;&nbsp;&nbsp; 设备PTZ节点有MoveAndTrack时应该支持这个命令。这个操作的目的是向设备发送一个自动命令：移动摄像机到想要的位置然后通过追踪算法代理PTZ操作。使用原子命令，延迟被最小化。移动位置是可选的且可以按照三种模式进行设置：<br />&#8226; 通过地理位置坐标<br />&#8226; 通过预置位token<br />&#8226; 通过PTZVector位置<br />&nbsp;&nbsp; &nbsp;请求位置移动的的速度参数优先于相应的PTZ配置的默认速度。如果引用空间含有速度参数，那么PTZ节点需支持速度空间。<br />&nbsp;&nbsp; &nbsp;如果在同一个设备中完成了侦察和追踪，那么ObjectID引用可以作为参数，以指定应跟踪哪个对象。<br />&nbsp;&nbsp; &nbsp;请求的绝对位置设备无法到达，则操作将失败。<br /><strong>请求（REQUEST）:</strong><br />&#8226; ProfileToken [tt:ReferenceToken]<br />对现有媒体配置文件的引用<br />&#8226; GeoLocation&nbsp; &#8211; 可选 [tt:GeoLocation]<br />可选目标坐标。<br />&#8226; PresetToken &#8211; 可选[tt:ReferenceToken]<br />对一个存在的预置位token的可选应用。<br />&#8226; TargetPosition &#8211; 可选[tt:PTZVector]<br />指定绝对目标位置的可选向量。<br />&#8226; Speed &#8211; 可选[tt:PTZSpeed]<br />可选速度矢量。<br />&#8226; ObjectID &#8211; 可选[tt:ObjectID]<br />要跟踪对象的可选Object ID。<br /><strong>响应（RESPONSE）</strong>: 空消息<br /><strong>错误（FAULTS）</strong>：<br />&#8226; env:Sender - ter:InvalidArgVal - ter:NoProfile<br />请求的配置文件token内ProfileToken不存在。<br />&#8226; env:Sender - ter:InvalidArgVal - ter:NoPTZProfile<br />请求的配置文件token未引用PTZ配置。<br />&#8226; env:Sender - ter:InvalidArgVal - ter:SpaceNotSupported<br />引用了PTZ节点不支持的空间。<br />&#8226; env:Sender - ter:InvalidArgVal - ter:InvalidPosition<br />请求的位置超出了界限。<br />&#8226; env:Sender - ter:InvalidArgVal - ter:InvalidSpeed<br />请求的速度超出了界限。<br />&#8226; env:Sender - ter:InvalidArgVal - ter:GeoMoveNotSupported<br />设备不支持地理移动。<br />&#8226; env:Sender - ter:InvalidArgVal - ter:UnreachablePosition<br />请求的转换超出了界限。<br />&#8226; env:Sender - ter:InvalidArgVal - ter:GeoLocationUnknown<br />由于地理位置未配置或不可用，该单元无法执行GeoMove。<br />&#8226; env:Sender - ter:InvalidArgVal - ter:NoToken<br />请求的预置位token不存在。<br /><strong>访问权限类（ACCESS CLASS）</strong>：<br />ACTUATE<br /></p><h3>5.3.7.&nbsp;&nbsp; &nbsp;状态获取（GetStatus）<br /></h3><p>PTZ设备需支持通过GetStatus命令报告PTZ状态。PTZ状态包含以下信息：<br />&#8226; 位置Position (可选) &#8211; 引用空间指定云台单元的绝对位置。相应PTZ配置的默认绝对空间应在位置元素中引用。如果设备有StatusPosition能力，则需要显示此信息。<br />&#8226; 移动状态MoveStatus(可选) &#8211; 表示水平/俯仰/变焦设备单元当前是否正在移动、空闲或处于位置状态。如果设备有MoveStatus能力，则需要显示此信息。未知状态不应在正常错误中使用，但是在初始化或错误状况下使用。<br />&#8226; 错误Error (可选) &#8211; 表示当前PTZ错误状态。MoveStatus未知状态时，显示这个字段。<br />&#8226; 国际标准时间 UTC Time &#8211; 指定生成状态时的UTC时间。<br /><strong>请求（REQUEST）</strong>:<br />&#8226; ProfileToken [tt:ReferenceToken]<br />对现有媒体配置文件的引用<br /><strong>响应（RESPONSE）</strong>: 空消息<br />&#8226; PTZStatus[tt:PTZStatus]<br />请求媒体文件的PTZStatus。<br /><strong>错误（FAULTS）</strong>：<br />&#8226; env:Sender - ter:InvalidArgVal - ter:NoProfile<br />请求的配置文件token内ProfileToken不存在。<br />&#8226; env:Sender - ter:InvalidArgVal - ter:NoPTZProfile<br />请求的配置文件token未引用PTZ配置。<br />&#8226; env:Receiver &#8211; ter:Action - ter:NoStatus<br />请求的媒体配置文件中没有可用的PTZ状态。<br /><strong>访问权限类（ACCESS CLASS）</strong>：<br />&nbsp;&nbsp; &nbsp;READ_MEDIA</p><img src ="http://www.cppblog.com/chinapeter2008/aggbug/217721.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinapeter2008/" target="_blank">canaan</a> 2021-06-19 20:38 <a href="http://www.cppblog.com/chinapeter2008/archive/2021/06/19/217721.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ONVIF协议云台服务规范 (二) ONVIF PTZ Service Specification</title><link>http://www.cppblog.com/chinapeter2008/archive/2021/06/17/217716.html</link><dc:creator>canaan</dc:creator><author>canaan</author><pubDate>Thu, 17 Jun 2021 08:34:00 GMT</pubDate><guid>http://www.cppblog.com/chinapeter2008/archive/2021/06/17/217716.html</guid><wfw:comment>http://www.cppblog.com/chinapeter2008/comments/217716.html</wfw:comment><comments>http://www.cppblog.com/chinapeter2008/archive/2021/06/17/217716.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chinapeter2008/comments/commentRss/217716.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinapeter2008/services/trackbacks/217716.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;5.&nbsp;&nbsp;服务5.1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PTZ节点5.1.1.&nbsp;&nbsp;常规&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 支持PTZ的设备可以有多个PTZ节点。PTZ节点可以表示机械PTZ驱动器。上传的云台驱动程序或数字...&nbsp;&nbsp;<a href='http://www.cppblog.com/chinapeter2008/archive/2021/06/17/217716.html'>阅读全文</a><img src ="http://www.cppblog.com/chinapeter2008/aggbug/217716.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinapeter2008/" target="_blank">canaan</a> 2021-06-17 16:34 <a href="http://www.cppblog.com/chinapeter2008/archive/2021/06/17/217716.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ONVIF协议云台服务规范(一) ONVIF PTZ Service Specification</title><link>http://www.cppblog.com/chinapeter2008/archive/2021/06/16/217715.html</link><dc:creator>canaan</dc:creator><author>canaan</author><pubDate>Wed, 16 Jun 2021 13:59:00 GMT</pubDate><guid>http://www.cppblog.com/chinapeter2008/archive/2021/06/16/217715.html</guid><wfw:comment>http://www.cppblog.com/chinapeter2008/comments/217715.html</wfw:comment><comments>http://www.cppblog.com/chinapeter2008/archive/2021/06/16/217715.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chinapeter2008/comments/commentRss/217715.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinapeter2008/services/trackbacks/217715.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1.&nbsp;&nbsp;范围&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本文档定义了用于配置和操作云台变焦控制器的web服务接口。此外，还定义了相关事件。Web服务的使用不在本文档的范围内。请参考ONVIF核心规范。2.&nbsp;&nbsp;引用标准ONVIF核心规范&lt;http://www...&nbsp;&nbsp;<a href='http://www.cppblog.com/chinapeter2008/archive/2021/06/16/217715.html'>阅读全文</a><img src ="http://www.cppblog.com/chinapeter2008/aggbug/217715.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinapeter2008/" target="_blank">canaan</a> 2021-06-16 21:59 <a href="http://www.cppblog.com/chinapeter2008/archive/2021/06/16/217715.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>标准模板库(STL)四 《随机访问容器(Random Access Container）》</title><link>http://www.cppblog.com/chinapeter2008/archive/2012/03/31/169644.html</link><dc:creator>canaan</dc:creator><author>canaan</author><pubDate>Sat, 31 Mar 2012 05:52:00 GMT</pubDate><guid>http://www.cppblog.com/chinapeter2008/archive/2012/03/31/169644.html</guid><wfw:comment>http://www.cppblog.com/chinapeter2008/comments/169644.html</wfw:comment><comments>http://www.cppblog.com/chinapeter2008/archive/2012/03/31/169644.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chinapeter2008/comments/commentRss/169644.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinapeter2008/services/trackbacks/169644.html</trackback:ping><description><![CDATA[<div><strong style="font-size: 14pt;">随机访问容器</strong><br style="font-size: 14pt;" /><br /><strong><span style="font-size: 12pt;">容器</span></strong><br />类目：容器<br /><br /><strong style="font-size: 12pt;">描述</strong><br style="font-size: 12pt;" />随机访问容器是一个迭代器类型为随机访问迭代器的<a target="_blank" href="http://www.cppblog.com/chinapeter2008/archive/2012/03/21/168512.html">可逆容器</a>。它提供常量缓冲时间来访问随机元素。<br /><br /><strong style="font-size: 12pt;">改善自</strong><br style="font-size: 12pt;" /><br /><a target="_blank" href="http://www.cppblog.com/chinapeter2008/archive/2012/03/21/168512.html">可逆容器</a><br /><br /><strong><span style="font-size: 12pt;">相关类型</span></strong><br /><br />除了定义在<a target="_blank" href="http://www.cppblog.com/chinapeter2008/archive/2012/03/21/168512.html">可逆容器</a>中的类型，没有其他额外类型。尽管这个迭代器类型的需求加强了：必须是随机访问迭代器。<br /><br /><strong style="font-size: 12pt;">标记法</strong><br style="font-size: 12pt;" /><br />X 随机访问容器模型类型<br />a,b X类型对象<br />T X类型的值<br /><br /><strong style="font-size: 12pt;">定义</strong><br style="font-size: 12pt;" /><br /><strong>有效表达式</strong><br /><br />除了定义在<a target="_blank" href="http://www.cppblog.com/chinapeter2008/archive/2012/03/21/168512.html">可逆容器</a>中的表达式外，下面的表达式也必须有效。<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回类型<br />Element access（访问元素）&nbsp;&nbsp; a[n]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; n可以转换成size_type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果可变，那么是引用，否则为常量引用<br /><br /><strong>表达式语义</strong><br /><br />一个表达式的语义只在这个情况下定义，当他在<a target="_blank" href="http://www.cppblog.com/chinapeter2008/archive/2012/03/21/168512.html">可逆容器</a>中没有定义，或者有额外的信息。<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;&nbsp;&nbsp;&nbsp; 语义&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 后置<br />Element access(访问元素)&nbsp;&nbsp;&nbsp;&nbsp; a[n]&nbsp;&nbsp;&nbsp; 0&lt;=n&lt;a.size()&nbsp;&nbsp;&nbsp;&nbsp; 返回容器的第n个元素<br /><br /><strong style="font-size: 12pt;">复杂度保证</strong><br style="font-size: 12pt;" /><br />访问元素的运行时复杂度为缓冲常量时间。<br /><br /><strong style="font-size: 12pt;">不变量</strong><br style="font-size: 12pt;" /><br />Element access(访问元素) a[n]返回的元素与增加a.begin()n次得到的结果迭代器解引用是一样的。<br /><br /><strong style="font-size: 12pt;">模型</strong><br style="font-size: 12pt;" /><br />vector<br />deque<br /><br /><strong style="font-size: 12pt;">注释</strong><br style="font-size: 12pt;" /><br /><strong style="font-size: 12pt;">参见</strong><br style="font-size: 12pt;" /><br />Iterator overview,随机访问迭代器,Sequence<br /></div><img src ="http://www.cppblog.com/chinapeter2008/aggbug/169644.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinapeter2008/" target="_blank">canaan</a> 2012-03-31 13:52 <a href="http://www.cppblog.com/chinapeter2008/archive/2012/03/31/169644.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>标准模板库(STL)三 《可逆容器(Reversible Container)》</title><link>http://www.cppblog.com/chinapeter2008/archive/2012/03/21/168512.html</link><dc:creator>canaan</dc:creator><author>canaan</author><pubDate>Wed, 21 Mar 2012 08:07:00 GMT</pubDate><guid>http://www.cppblog.com/chinapeter2008/archive/2012/03/21/168512.html</guid><wfw:comment>http://www.cppblog.com/chinapeter2008/comments/168512.html</wfw:comment><comments>http://www.cppblog.com/chinapeter2008/archive/2012/03/21/168512.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/chinapeter2008/comments/commentRss/168512.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinapeter2008/services/trackbacks/168512.html</trackback:ping><description><![CDATA[<div><strong>可逆容器(Reversible Container)</strong><br /><strong><br />类目：容器</strong><br /><br /><strong>描述</strong><br /><br />可逆容器是一个有双向迭代器的前向容器。它可以向后向后迭代通过容器。<br /><br /><strong>改善自</strong><br /><br /><a target="_blank" href="http://www.cppblog.com/chinapeter2008/archive/2012/03/19/168310.html">Forward Container</a><br /><br /><strong>相关类型</strong><br /><br />介绍了两个新的类型。此外，迭代器类型和常量迭代器类型必须满足比前向容器(<a target="_blank" href="http://www.cppblog.com/chinapeter2008/archive/2012/03/19/168310.html">Forward Container</a>)更严格的要求。迭代器类型和反向迭代器类型必须是双向迭代器(Bidirectional Iterators)，而不仅仅是前向迭代器(<a target="_blank" href="http://www.cppblog.com/chinapeter2008/archive/2012/03/19/168310.html">ForWard Iterators</a>)。<br /><br />反向迭代器类型(Reverse iterator type)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X::reverse_iterator&nbsp;&nbsp;&nbsp; 一个反向迭代器适配器的基迭代器类型是容器的迭代器类型。递增反向迭代器(rever_iterator)类型对象向后移动通过容器：Reverse Iterator适配器映射了++操作符和--操作符。<br />常量反向迭代器类型(Const reverse iterator type)&nbsp; X::const_reverse_iterator&nbsp; 一个反向迭代器适配器的基迭代器是容器的常量迭代器类型。[1]<br /><br /><strong>标记法</strong><br /><br />X&nbsp;&nbsp;&nbsp; 反向容器模式类型<br />a,b&nbsp; 类型X对象<br /><br /><strong>定义</strong><br /><br /><strong>有效表达式</strong><br /><br />除了前向容器(<a target="_blank" href="http://www.cppblog.com/chinapeter2008/archive/2012/03/19/168310.html">Forward Container</a>)中的表达式外，下面的表达式也必须有效<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; 返回类型<br />范围起始Beginning of range a.rbegin()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果a是可变的，那么是reverse_iterator,否则为const_reverse_iterator[1]<br />范围结束End of range&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.rend()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果a是可变的，那么是reverse_iterator，否则为const_reverse_iterator[1]<br /><br /><strong>表达式语义</strong><br /><br />一个表达式的语义只有在这种情况下定义，当它没有在前向容器(<a target="_blank" href="http://www.cppblog.com/chinapeter2008/archive/2012/03/19/168310.html">Forward Container</a>)中定义，或者有额外的信息。<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 后置<br />逆向范围起始Beginning of range a.rbegin()&nbsp;&nbsp;&nbsp; 相当于X::reverse_iterator(a.end())。 a.rbegin()是提领或者是past-the-end。当a.size() == 0是，它为past-the-end。<br />逆向范围结束End of reverse range a.rend()&nbsp;&nbsp;&nbsp; 相当于X::reverse_iterator(a.begin())。 a.rend()是past-the-end。<br /><br /><strong>复杂性保证</strong><br /><br />rbegin()和rend()运行时复杂性是摊销时间为常数。<br /><br /><strong>不变因素</strong><br /><br />有效范围&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [a.rbegin(), a.rend())是一个有效范围。<br />等待范围&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.begin()到a.end()之间的距离和a.rbegin()到a.rend()之间的距离是一样的。<br /><br /><strong>模型</strong><br /><br />vector<br />list<br />deque<br /><br /><strong>注释</strong><br /><br />[1]一个容器的迭代器类型和常量迭代器类型有可能是相同的类型：一个容器不需要提供可变的迭代器。因此反向迭代器类型和常量反向迭代器类型也可能是相同的。<br /><br />参见<br /><br />Iterator overview, Bidirectional Iterator, Sequence<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br /></div><img src ="http://www.cppblog.com/chinapeter2008/aggbug/168512.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinapeter2008/" target="_blank">canaan</a> 2012-03-21 16:07 <a href="http://www.cppblog.com/chinapeter2008/archive/2012/03/21/168512.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>标准模板库(STL)二 《前向容器(Forward Container)》</title><link>http://www.cppblog.com/chinapeter2008/archive/2012/03/19/168310.html</link><dc:creator>canaan</dc:creator><author>canaan</author><pubDate>Mon, 19 Mar 2012 04:10:00 GMT</pubDate><guid>http://www.cppblog.com/chinapeter2008/archive/2012/03/19/168310.html</guid><wfw:comment>http://www.cppblog.com/chinapeter2008/comments/168310.html</wfw:comment><comments>http://www.cppblog.com/chinapeter2008/archive/2012/03/19/168310.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chinapeter2008/comments/commentRss/168310.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinapeter2008/services/trackbacks/168310.html</trackback:ping><description><![CDATA[<div><strong>前向容器(Forward Container)</strong><br /><br /><strong>容器</strong><br />类目：容器<br /><br /><strong>描述</strong><br /><br />前向容器中的元素是按一定的顺序排序的：这个顺序不会因为迭代而自动改变。一定的顺序要求允许定义相等的元素（如果容器中的元素是可以比较相等的Equality Comparable）和字典序（如果容器中的元素类型是可以比较小于的 LessThen Comparable）。<br /><br />前向容器中的迭代器满足前向迭代器的要求：因此，前向容器支持多通道算法，并允许同一个容器可以同时拥有多个激活的迭代器。<br /><br /><strong>完善(Refinement of)</strong><br /><br />Container,EqualityComparable,LessThanComparable<br /><br /><strong>相关类型</strong><br /><br />除了容器总定义的，没有其他额外的类型。然而，迭代器类型的要求加强：迭代器类型必须是前向迭代器模式。<br /><br /><strong>标记法</strong><br /><br />X 是一个前向容器模式的类型<br />a,b 类型X的对象<br />T 类型X的值<br /><br /><strong>定义</strong><br /><br /><strong>有效表达式</strong><br /><br />除了容器中定义的表达式外,EqualityComparable,和LessThanComparable，下面的表达式必须是有效的。<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回类型<br />等式(Equality)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a == b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T是EqualityComparable&nbsp;&nbsp; 可转换成bool<br />不等式(Inequality)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a != b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T是EqualityComparable&nbsp;&nbsp; 可转换成bool<br />小于(Less)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a &lt; b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T是LessThanComparable&nbsp;&nbsp; 可转换成bool<br />大于(Greater)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a &gt; b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T是LessThanComparable&nbsp;&nbsp; 可转换成bool<br />小于或等于(Less or equal)&nbsp;&nbsp; a &lt;= b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T是LessThanComparable&nbsp;&nbsp; 可转换成bool<br />大于或等于(Greater or equal)a &gt;= b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T是LessThanComparable&nbsp;&nbsp; 可转换成bool<br /><br /><strong>表达式语义</strong><br /><br />一个表达式的语义只有在这种情况下定义，当它没有定义在Container, EqualityComparable, 或者LessThanComparable，或者有额外的信息。<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;&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;&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; 后置<br />等式(Equality)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a == b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果a.size() == b.size()而且a中的每个元素都等于b中的对应的元素，那么返回true。否则返回false。<br />小于(Less)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a &lt; b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 相当于lexicographical_compare(a,b)<br /><br /><strong>复杂性担保</strong><br /><br />等式和不等式的操作与容器的大小呈线性关系。<br /><br /><strong>不变</strong><br /><br />顺序 两个不同的迭代器迭代一个前向容器的，都是以同样的顺序访问它的元素，提供一个没有干预性的操作。<br /><br /><strong>模型</strong><br /><br />vector<br />list<br />slist<br />deque<br />set<br />hash_set<br />map<br />hash_map<br />multiset<br />hash_multiset<br />multimap<br />hash_multimap<br /><br /><strong>注释</strong><br /><br /><strong>参见</strong><br /><br />iterator overview, Forward Iterator, Sequence<br /></div><img src ="http://www.cppblog.com/chinapeter2008/aggbug/168310.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinapeter2008/" target="_blank">canaan</a> 2012-03-19 12:10 <a href="http://www.cppblog.com/chinapeter2008/archive/2012/03/19/168310.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>标准模板库(STL)一  《容器》</title><link>http://www.cppblog.com/chinapeter2008/archive/2012/03/13/167769.html</link><dc:creator>canaan</dc:creator><author>canaan</author><pubDate>Tue, 13 Mar 2012 05:20:00 GMT</pubDate><guid>http://www.cppblog.com/chinapeter2008/archive/2012/03/13/167769.html</guid><wfw:comment>http://www.cppblog.com/chinapeter2008/comments/167769.html</wfw:comment><comments>http://www.cppblog.com/chinapeter2008/archive/2012/03/13/167769.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chinapeter2008/comments/commentRss/167769.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinapeter2008/services/trackbacks/167769.html</trackback:ping><description><![CDATA[<div><h1><strong>容器</strong></h1><br />类目：容器<br /><br /><h3>描述</h3><br />容器是一个可以存储对象（它的元素），并具有访问其元素的方法的一个对象。特别是，每一个容器模式类型都有一个关联的迭代器类型来遍历容器中的元素。<br /><br />不能保证容器中的元素按特定的方式来存储；事实上，不同的是每次迭代器是如何通过容器的。也不能保证容器的多个迭代器是一直有效的。（特定的容器类型，像前向容器是提供这样的保证的。）<br /><br />容器&#8220;拥有&#8221;它的元素：存储在一个容器中的元素的寿命不能超过容器本身。[1]<br /><br /><h3>完善</h3><br />Assignable<br /><br /><h3>相关类型</h3>(Value type)值类型&nbsp; X::value_type&nbsp; 存储在容器中的对象类型。值类型必须是Assignable，但不必是DefaultConstructible.[2]<br />(Iterator type)迭代器类型 X::iterator&nbsp; 迭代器类型用来遍历容器的元素。迭代器的值类型就是容器的值类型。必须可以从iterator type转换成const iterator type。迭代器的类型必须是一个输入迭代器。[3]<br />(Const iterator type)常量迭代器类型 X::const_iterator 是一个可以查看但不能修改容器中元素的迭代器类型。[3][4]<br />(Reference type)引用类型 X::reference 是一个行为像容器值类型引用的类型。[5]<br />(Const reference type)常量引用类型 X::const_reference 是一个行为像容器值类型常量引用的类型。[5]<br />(Pointer type)指针类型 X::pointer 是一个行为像容器值类型指针的类型。[6]<br />(Distance type)距离类型 X::distance_type&nbsp; 一个有符号整数类型来表示两个容器迭代器之间的距离。此类型必须跟迭代器之间的距离类型是一样的。[2]<br />(Size type)大小类型 X::size_type 一个无符号整数类型来表示任何非负值的容器距离类型。[2]<br /><br /><h3>标记法</h3><br />X&nbsp;&nbsp;&nbsp; 容器模式对象<br />a,b&nbsp; X类型对象<br />T&nbsp;&nbsp;&nbsp; X类型的值<br /><br /><h3>定义</h3><br />容器的(size)大小就是它所包含的元素个数，它是一个非负数。<br /><br />容器的(area)面积就是它占用的字节数。更确切地说，它是元素的面积的总和加上与容器本身相关的任何开销。如果容器的值类型T是一个简单的类型（而不是一个容器类型），那么这个容器的面积就是sizeof(T)的常数倍。也就是说，一个简单值类型的容器a的面积是O(a.size())。<br /><br />一个(variable sized)可变大小的容器提供插入和/或移除元素的方法；容器大小可能会变化。一个(fixed size)固定大小的容器，它的大小在它的生命周期内是一只不变的。一些固定大小的容器类型，大小在编译时确定。<br /><br /><h3>有效表达式</h3><br />除了Assignable,EqualityComparable,和LessThanComparable这些已经定义的表达式，下面的表达式也必须是有效的。<br /><br /><strong>名称&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表达式&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类型要求&nbsp;&nbsp;&nbsp; 返回类型</strong><br />范围起始&nbsp; a.begin()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果是可变的，返回值为iterator(迭代器)，否则为const_iterator[4][7]<br />范围结束&nbsp; a.end()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果是可变的，返回值为iterator(迭代器)，否则为const_iterator[4]<br />大小&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.size()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; size_type<br />最大容量&nbsp; a.max_size()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; size_type<br />空容器&nbsp;&nbsp;&nbsp; a.empty()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可转换成bool类型<br />交换&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.swap(b)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void<br /><br /><h3>表达式语义</h3><br /><strong>名称&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;&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;&nbsp;&nbsp;&nbsp;&nbsp; 后置</strong><br />拷贝构造函数&nbsp; X(a)&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X().size() == a.size()。X()包含了a中所有元素的副本。<br />拷贝构造函数&nbsp; X b(a)&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b().size() == a.size()。b包含了a中所有元素的副本。<br />赋值运算符&nbsp;&nbsp;&nbsp; b = a&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b().size() == a.size()。b包含了a中所有元素的副本。<br />析构函数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.~X()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 销毁a中所有的元素，并释放为它们分配的内存（如果有的话）。<br />范围起始&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.begin()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回一个指向容器第一个元素的迭代器(iterator)。[7]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.begin()要么是提领要么是past-the-end。仅仅当a.size == 0的时候它才是past-the-end。<br />范围结束&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.end()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回一个指向容器的最后一个元素的后面的迭代器(iterator)。&nbsp;&nbsp;&nbsp;&nbsp; a.end 是 past-the-end。<br />大小&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.size()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回容器的大小，也就是元素的个数。[8]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.size() &gt;= 0 &amp;&amp; a.size &lt;= a.max_size()<br />最大容量&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.max_size()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回容器的最大容量。[8]&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;&nbsp;&nbsp; a.max_size() &gt;= 0 &amp;&amp; a.max_size &gt;= a.size()<br />空容器&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.empty()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 相当于 a.size() == 0 （但是可能更快）&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; a.swap(b)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 相当于swap(a,b)[9]<br /><br />复杂性担保<br /><br />拷贝构造函数，复制操作符，析构函数跟容器大小呈线性关系。<br /><br />begin()和end()的摊销时间为常数。<br /><br />size()跟容器大小呈线性关系。[10] max_size()和empty()的摊销时间为常数。如果你要测试一个容器是否为空，你应该总是写c.empty而不是c.size() == 0。这两个表达式是等价的，但前者可能要快得多。<br /><br />swap()的摊销时间为常数。[9]<br /><br /><h3>不变量</h3><br />有效范围&nbsp;&nbsp;&nbsp;&nbsp; 任何容器a， [a.begin(), a.end())是一个有效范围。[11]<br />范围大小&nbsp;&nbsp;&nbsp;&nbsp; a.size()等于从a.begin()到a.end()的距离。<br />完整性&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个迭代算法[a.begin(), a.end())，将会遍历a中的每个元素。[11]<br /><br /><h3>模型</h3><br />vector<br /><br /><h3>注释</h3><br />[1]元素的寿命不能超过其容器可能看起来像一个严重的限制，事实上，它并不是限制。请注意指针和迭代器都是对象；就像任何其他对象一样，他们可以被存储在一个容器内。在这种情况下，容器拥有指针本身，而不是它们指向的对象。<br /><br />[2]这种表达式必须是一个typedef，这是一个类型的代名词。<br /><br />[3]这可能是一个typedef或者其他类型，或者一个定义嵌套类作为一个内部类的X的特定的类型。<br /><br />[4]容器的iterator类型和const iterator类型可能是一样的：不能保证每个容器必须有一个相关的可变迭代器类型。例如，set和hash_set定义iterator和const iterator为同一类型。<br /><br />[5]引用类型需要与普通C++引用类型有相同的语义，但它实际上并不是普通的C++引用。例如，在某些实现中，可能会提供额外的引用类型来支持非标准的内存模型。但是请注意，&#8220;智能引用&#8221;（用户定义的引用类型提供额外的功能）不是一个可行的选择。用户定义的类型不可能与C++引用类型具有相同语义，因为C++语言不支持重新定义的成员访问运算符(operator.)。<br /><br />[6]跟[5]中的引用类型一样，指针类型需要与C++指针有相同的语义，但实际并不是C++指针。&#8220;智能指针&#8221;不同于&#8220;智能引用&#8221;是有可能的。因为可以为用户定义类型来定义的引用操作符和指针成员访问运算符可以访问运算符*和-&gt;。<br /><br />[7]迭代器类型(iterator type)必须是一个输入迭代器(input iterator)，它只提供了一个非常薄弱的担保；特别是，输入迭代算法必须都是&#8220;单通道&#8221;。容器只有一个简单的迭代器(iterator)可以随时激活。Forward Container(前向容器)没有这个限制。<br /><br />[8]一个固定大小的容器，size() == max_size()。<br /><br />[9]对于任何Assignable类型，swap可以定义分配条款。这需要三个任务，每一个容器类型，容器的大小呈线性关系。然而，在某种意义上，a.swap(b)是多余的。它的存在仅仅为了提高效率：许多容器，如vector和list，它实现swap的时间复杂度是不变的，而不是线性的。一些容器类型X，那么它们的模板化swap(X&amp;,X&amp;)可以简单地写在X::swap(X&amp;)。也就是说X::swap(X&amp;)只能定义在执行时间是常量的情况下。不是所有的容器类X都需要这样的一个成员函数，但是如果这样的函数存在，那么必须保证摊销时间为常量。<br /><br />[10]对于许多容器，如vector和deque，size是O(1).这满足了O(N)的要求。<br /><br />[11]虽然[a.begin(), a.end())必须是一个有效的范围，而且每个元素必须都包含在容器内，但是在这个范围内出现的顺序是不确定的。如果你两次遍历一个容器，它不能保证这两次的遍历顺序是相同的。Forward Container前向容器没有这个限制。<br /><br /><h3>参见</h3><br />迭代器概述，输入迭代器，序列<br /></div><img src ="http://www.cppblog.com/chinapeter2008/aggbug/167769.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinapeter2008/" target="_blank">canaan</a> 2012-03-13 13:20 <a href="http://www.cppblog.com/chinapeter2008/archive/2012/03/13/167769.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>标准模板库 目录三 函数对象、Utilities、内存分配</title><link>http://www.cppblog.com/chinapeter2008/archive/2012/03/12/167718.html</link><dc:creator>canaan</dc:creator><author>canaan</author><pubDate>Mon, 12 Mar 2012 07:27:00 GMT</pubDate><guid>http://www.cppblog.com/chinapeter2008/archive/2012/03/12/167718.html</guid><wfw:comment>http://www.cppblog.com/chinapeter2008/comments/167718.html</wfw:comment><comments>http://www.cppblog.com/chinapeter2008/archive/2012/03/12/167718.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chinapeter2008/comments/commentRss/167718.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinapeter2008/services/trackbacks/167718.html</trackback:ping><description><![CDATA[<div>6、函数对象<br />&nbsp;&nbsp;&nbsp; 1、简介<br />&nbsp;&nbsp;&nbsp; 2、概念<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、generator(不需要参数的函数)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、一元函数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、二元函数<br />&nbsp;&nbsp; &nbsp; 4、Adaptable Generator(可适应的不需要参数的函数)<br />&nbsp;&nbsp; &nbsp; 5、一元可适应函数<br />&nbsp;&nbsp; &nbsp; 6、二元可适应函数<br />&nbsp;&nbsp; &nbsp; 7、谓词<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、谓词<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、二元谓词<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、可适应谓词<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、二元可适应谓词<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、StrictWeakOrdering<br />&nbsp;&nbsp; &nbsp; 8、Monoid曹错<br />&nbsp;&nbsp; &nbsp; 9、随机数生成器<br />&nbsp;&nbsp;&nbsp; 3、预定义函数对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、算术运算<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、加法<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、减法<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、乘法（原名&#8220;次&#8221;）<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、除法<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、取模运算<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6、否定<br />&nbsp;&nbsp; &nbsp; 2、比较算法<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、equal_to<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、not_equal_to<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、less<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、greater<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、less_equal<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6、greater_equal<br />&nbsp;&nbsp; &nbsp; 3、逻辑操作<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、logical_and(逻辑与)<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、logical_or(逻辑或)<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、logical_not(逻辑否)<br />&nbsp;&nbsp; &nbsp; 4、广义身份认证操作<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、identity<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、project1st<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、project2nd<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、select1st<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、select2nd<br />&nbsp;&nbsp; &nbsp; 5、subtractive_rng<br />&nbsp;&nbsp;&nbsp; 4、函数对象适配器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、binder1st<br />&nbsp;&nbsp; &nbsp; 2、binder2nd<br />&nbsp;&nbsp; &nbsp; 3、ptr_fun<br />&nbsp;&nbsp; &nbsp; 4、pointer_to_unary_function<br />&nbsp;&nbsp; &nbsp; 5、pointer_to_binary_function<br />&nbsp;&nbsp; &nbsp; 6、unary_negate<br />&nbsp;&nbsp; &nbsp; 7、binary_negate<br />&nbsp;&nbsp; &nbsp; 8、unary_compose<br />&nbsp;&nbsp; &nbsp; 9、binary_compose<br />&nbsp;&nbsp; &nbsp; 10、成员函数适配器<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、mem_fun<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、mem_fun_ref<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、mem_fun1<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、mem_fun1_ref<br />7、Utilities<br />&nbsp;&nbsp;&nbsp; 1、概念<br />&nbsp;&nbsp; &nbsp;1、Assignable<br />&nbsp;&nbsp; &nbsp;2、Default Constructible<br />&nbsp;&nbsp; &nbsp;3、Equality Comparable<br />&nbsp;&nbsp; &nbsp;4、LessThan Comparable<br />&nbsp;&nbsp;&nbsp; 2、函数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、关系操作符<br />&nbsp;&nbsp;&nbsp; 3、类<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、pair<br />8、内存分配<br />&nbsp;&nbsp;&nbsp; 1、类<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、分配器<br />&nbsp;&nbsp; &nbsp;2、raw_storage_iterator<br />&nbsp;&nbsp;&nbsp; 2、函数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、construct<br />&nbsp;&nbsp; &nbsp;2、destroy<br />&nbsp;&nbsp; &nbsp;3、uninitialized_copy<br />&nbsp;&nbsp; &nbsp;4、uninitialized_copy_n<br />&nbsp;&nbsp; &nbsp;5、uninitialized_fill<br />&nbsp;&nbsp; &nbsp;6、uninitialized_fill_n<br />&nbsp;&nbsp; &nbsp;7、temporary_buffer<br />&nbsp;&nbsp; &nbsp;8、get_temporary_buffer<br />&nbsp;&nbsp; &nbsp;9、return_temporary_buffer<br />9、设计文档<br />&nbsp;&nbsp;&nbsp; 1、线程安全<br />&nbsp;&nbsp;&nbsp; 2、复杂规格的意义<br />&nbsp;&nbsp;&nbsp; 3、字符串的表示<br />10、分类索引<br />11、全文索引<br /></div><img src ="http://www.cppblog.com/chinapeter2008/aggbug/167718.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinapeter2008/" target="_blank">canaan</a> 2012-03-12 15:27 <a href="http://www.cppblog.com/chinapeter2008/archive/2012/03/12/167718.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>标准模板库 目录二  迭代器和算法</title><link>http://www.cppblog.com/chinapeter2008/archive/2012/03/09/167465.html</link><dc:creator>canaan</dc:creator><author>canaan</author><pubDate>Fri, 09 Mar 2012 01:41:00 GMT</pubDate><guid>http://www.cppblog.com/chinapeter2008/archive/2012/03/09/167465.html</guid><wfw:comment>http://www.cppblog.com/chinapeter2008/comments/167465.html</wfw:comment><comments>http://www.cppblog.com/chinapeter2008/archive/2012/03/09/167465.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chinapeter2008/comments/commentRss/167465.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinapeter2008/services/trackbacks/167465.html</trackback:ping><description><![CDATA[<div>4、迭代器<br />&nbsp;&nbsp; 1、简介<br />&nbsp;&nbsp; 2、概念<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、普通迭代器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、输入迭代器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、输出迭代器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、前向迭代器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、双向迭代器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6、随机访问迭代 <br />&nbsp;&nbsp;&nbsp; 3、迭代器标签<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、简介<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、iterator_traits<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、iterator_category<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、distance_type<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、value_type<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6、迭代器标签类<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、input_iterator_tag<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、output_iterator_tag<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、forward_iterator_tag<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、bidirectional_iterator_tag<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、random_access_iterator_tag <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7、迭代器基础类<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、input_iterator<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、output_iterator<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、forward_iterator<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、bidirectional_iterator<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、random_access_iterator <br />&nbsp;&nbsp;&nbsp; 4、迭代函数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、distance<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、advance<br />&nbsp;&nbsp;&nbsp; 5、迭代器类<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、istream_iterator<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、ostream_iterator<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、front_insert_iterator<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、back_insert_iterator<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、insert_iterator<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6、reverse_iterator<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7、reverse_bidirectional_iterator<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8、raw_storage_iterator<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9、sequence_buffer <br />5、算法<br />&nbsp;&nbsp;&nbsp; 1、不会改变内容的算法<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、for_each<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、find<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、find_if<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、adjacent_find<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、find_fist_of<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6、count<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7、count_if<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8、mismatch<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9、equal<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10、search<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11、search_if<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12、find_end<br />&nbsp;&nbsp;&nbsp; 2、会改变内容的算法<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、copy<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、copy_n<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、copy_backward<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、交换<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、swap<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、iter_swap<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、swap_ranges<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、transform<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6、替换<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、replace<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、replace_if<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、replace_copy<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、replace_copy_if<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7、fill<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8、fill_n<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9、generate<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10、generate_n<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11、移除<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、remove<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、remove_if<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、remove_copy<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、remove_copy_if<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12、unique<br />&nbsp;&nbsp; &nbsp;13、unique_copy<br />&nbsp;&nbsp; &nbsp;14、reverse<br />&nbsp;&nbsp; &nbsp;15、reverse_copy<br />&nbsp;&nbsp; &nbsp;16、rotate<br />&nbsp;&nbsp; &nbsp;17、rotate_copy<br />&nbsp;&nbsp; &nbsp;18、random_shuffle<br />&nbsp;&nbsp; &nbsp;19、random_sample<br />&nbsp;&nbsp; &nbsp;20、random_sample_n<br />&nbsp;&nbsp; &nbsp;21、partition<br />&nbsp;&nbsp; &nbsp;22、stable_partition<br />&nbsp;&nbsp;&nbsp; 3、排序<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、排序<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、sort<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、stable_sort<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、partial_sort<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、partial_sort_copy<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、is_sorted<br />&nbsp;&nbsp; &nbsp; 2、nth_element<br />&nbsp;&nbsp; &nbsp; 3、二进制搜索<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、lower_bound<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、upper_bound<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、equal_range<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、binary_search<br />&nbsp;&nbsp; &nbsp; 4、merge<br />&nbsp;&nbsp; &nbsp; 5、inplace_merge<br />&nbsp;&nbsp; &nbsp; 6、排序范围内设置操作<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、includes<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、set_union<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、set_intersection<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、set_difference<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、set_symmetric_difference<br />&nbsp;&nbsp; &nbsp; 7、堆操作<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、push_heap<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、pop_heap<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、make_heap<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、sort_heap<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、is_heap<br />&nbsp;&nbsp; &nbsp; 8、最大值和最小值<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、min<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、max<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、min_element<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、max_element<br />&nbsp;&nbsp; &nbsp; 9、lexicographical_compare<br />&nbsp;&nbsp; &nbsp;10、lexicographical_compare_3way<br />&nbsp;&nbsp; &nbsp;11、next_permutation<br />&nbsp;&nbsp; &nbsp;12、prev_permutation<br />&nbsp;&nbsp;&nbsp; 4、广义数值算法<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、iota<br />&nbsp;&nbsp; &nbsp; 2、accumulate<br />&nbsp;&nbsp; &nbsp; 3、inner_product<br />&nbsp;&nbsp; &nbsp; 4、partial_sum<br />&nbsp;&nbsp; &nbsp; 5、adjacent_difference<br />&nbsp;&nbsp; &nbsp; 7、power<br /><br />下一节 《<a id="viewpost1_TitleUrl" href="../archive/2012/03/12/167718.html">标准模板库 目录三 函数对象、Utilities、内存分配</a>》<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div><img src ="http://www.cppblog.com/chinapeter2008/aggbug/167465.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinapeter2008/" target="_blank">canaan</a> 2012-03-09 09:41 <a href="http://www.cppblog.com/chinapeter2008/archive/2012/03/09/167465.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为什么你总是认为你的产品不够好  （Why you'll always think your product is shit）</title><link>http://www.cppblog.com/chinapeter2008/archive/2012/03/08/167374.html</link><dc:creator>canaan</dc:creator><author>canaan</author><pubDate>Thu, 08 Mar 2012 03:26:00 GMT</pubDate><guid>http://www.cppblog.com/chinapeter2008/archive/2012/03/08/167374.html</guid><wfw:comment>http://www.cppblog.com/chinapeter2008/comments/167374.html</wfw:comment><comments>http://www.cppblog.com/chinapeter2008/archive/2012/03/08/167374.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/chinapeter2008/comments/commentRss/167374.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinapeter2008/services/trackbacks/167374.html</trackback:ping><description><![CDATA[<div><br />
<br />
<div align="center"><strong>为什么你总是认为你的产品不够好<br />
Why you'll always think your product is shit<br />
<br />
<br />
<br />
</strong></div>
<img alt="" src="http://www.cppblog.com/images/cppblog_com/chinapeter2008/p1.jpg" border="0" /><br />
<br />
&#8220;<strong>我的产品还没有准备好。</strong>&#8221;你说这之前。我们都曾经说过。<br />
<br />
每个人在发布他们第一个产品的时候都会觉得他们的产品还没有完全准备好。或者甚至是已经发布在使用的，也没有想象中的那么完美，因为如果你只是做一点点，他就会变的更好一点。在正常情况下，这会导致潜在很大的改善路线图，在一个不正常的情况下，它会导致这个产品无休止的迭代，始终得不到结果。<br />
<br />
大约在一年前，我拜访了Pixar的办公室了解到有关此产品的一点，我想和大家分享下面的这个小故事：<br />
<br />
<strong>Over at Pixar</strong>...<br />
Matt Silas(@matty8r),Pixar的长期雇员带我参观了他们的办公室，我也接受了他的盛情款待。从Palo Alto出发经过长达一小时的车程终于到了Emeryville，Matt向我展示了整个个玻璃上的奥斯卡奖，然后开始全面的参观。我们有拍很多照片，所以这里好的像是：VentureBeat,Urbanpeak。<br />
<br />
我一直是Pixar的粉丝--不仅仅是他们的产品，还有他们的历史和文化。关于Pixar和他们创造电影的过程是多么的迷人，还有很多话要讲，我推荐一本书：《To Infinity and Beyond》。它让我知道了在他们的电影中使用了一些非常的合作和迭代的方法，毕竟，做的比较多的还是软件。这里有一些简单的例子：<br />
<br />
Pixar的团队是由有创意的人才和软件工程师组成的。这是反映在他们的高层，John Lasseter和Ed Catmull。<br />
<br />
Pixar电影的过程是从一个故事开始的--然后故事情节--然后用一些方法来形成最后的蓝图。<br />
<br />
他们每天在构建他们的&#8220;电影&#8221;，让他们知道他们的立场，在需要的地方用上素描和蹩脚的CGI--跟传统电影不同的是在它的最后。<br />
<br />
有时候，他们与&#8220;玩具总动员&#8221;的原始版本，他们必须停止他们正在做的事情，然后重新开始这个电影制作过程直到所有事情确定下来--听起来很熟悉，有木有？<br />
<br />
其他有关高科技世界的是Steve Jobs亲自监督他们的办公室空间的设计。《超人》导演Brad Bird对于这个有专业的说法：<br />
<br />
&#8220;这是我们的建筑。这中间，他造了一个大的中庭区，最初似乎觉得这是在浪费空间。原因就是大家来之后都在各自的办公室空间工作。软件工程师在这里，画动画的在这里，还有那边是做设计的。Steve 把信箱，会议室，食堂，最出色的最想不到的是浴室，居然在最中间--当初让我们觉得很疯狂--每个人的一天都可以在这里完成。Jobs意识到当人们在于其他人眼神接触时，事情就会发生了。所以他想办法不让他们接触到其他公司。&#8221;<br />
<br />
无论如何，我听到很多这样的故事--像预期的一样，这次参观是难以忘记的，最后，我们停在Pixar礼品店。<br />
在那里，我问Matt一个休闲的问题，一年之后，我还清楚的记得：<br />
<br />
我说：&#8220;Pixar电影中你最喜欢哪一部？&#8221;<br />
Matt:&nbsp; *叹气*<br />
我笑着说： &#8220;为什么叹气？&#8221;<br />
Matt:&nbsp; &#8220;这是一个很棘手的问题，因为他们都是很好的。但是同时，因为你在这里工作，你花了那么长的时间在上面，你很难会去看它。你知道你所作的所有的小决定和所有采取的捷径。你也记得那些风险你必须放弃和结束的，因为你没有时间了。所以当你看电影的时候，你可以看到所有的缺陷，知道你看到你的朋友和家人时，你才会开始忘记这些。&#8221;<br />
<br />
哇哦！如此深刻。<br />
<br />
世界上像Pixar这样的公司，无疑会产生一些最令人喜爱和完美的经验，但是最后还是没能产生一个产品，让团队中所有的人都认为它是最好的。之后思考为什么会是这样呢，原因是显而易见的--用预见性和技能来完善一些能使之更好，还需要能力是一个巨大的关键点。比你的能力更关键的，我觉得是完善或者解决设计问题的速度不够快。因为所有的设计使整个系列平衡，这个时候你不结束，你到底想要什么呢。<br />
<br />
<strong>教训：你永远是不会高兴的。</strong><br />
<br />
在这次谈话中我得到了，就是我们做很多工作让我们的产品更好，但是永远不会到达满意。一个伟人一旦说过你的产品是垃圾--也许你一直会认为它就是垃圾。然而在同一时间，它是我们创意的斗争，最终使我们的创作越来越好。有一天，即使你仍然认为你的产品很糟糕，你会看到你的顾客正在开心地使用它。<br />
<br />
一个短暂的瞬间，你会忘记对于它你为什么会不满意。<br />
<br />
特别感谢Matt Silas(@以撒1985, 关注它)给我一个独特的经验。（最后，我在Luxo Jr.旁边拍了一张照片后离开了。）<br />
<br />
<img alt="" src="http://www.cppblog.com/images/cppblog_com/chinapeter2008/p2.jpg" border="0" height="1024" width="764" /><br />
<br />
<strong>喜欢这篇文章吗？</strong><br />
如果你喜欢这篇文章，请订阅或者关注我的微薄。在这里你还可以找到更多的文章。<br />
Andrew Chen写<br />
<br />
Canaan翻译 微薄（@以撒1985）<br />
<br />
2012年3月2日 下午7:27</div>
<div>原文：<a href="http://andrewchenblog.com/2012/03/02/why-your-product-will-never-seem-like-its-good-enough/" target="_blank">http://andrewchenblog.com/2012/03/02/why-your-product-will-never-seem-like-its-good-enough/</a></div><img src ="http://www.cppblog.com/chinapeter2008/aggbug/167374.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinapeter2008/" target="_blank">canaan</a> 2012-03-08 11:26 <a href="http://www.cppblog.com/chinapeter2008/archive/2012/03/08/167374.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>标准模板库 目录一   容器</title><link>http://www.cppblog.com/chinapeter2008/archive/2012/03/01/166874.html</link><dc:creator>canaan</dc:creator><author>canaan</author><pubDate>Thu, 01 Mar 2012 07:23:00 GMT</pubDate><guid>http://www.cppblog.com/chinapeter2008/archive/2012/03/01/166874.html</guid><wfw:comment>http://www.cppblog.com/chinapeter2008/comments/166874.html</wfw:comment><comments>http://www.cppblog.com/chinapeter2008/archive/2012/03/01/166874.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chinapeter2008/comments/commentRss/166874.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinapeter2008/services/trackbacks/166874.html</trackback:ping><description><![CDATA[<div><br /><strong style="font-size: 14pt;">标准模板库 目录一</strong><strong style="font-size: 14pt;">&nbsp;&nbsp; 容器</strong><br style="font-size: 14pt;" /><br />1、STL简介<br />2、如何使用文档<br />3、容器<br />&nbsp;&nbsp;&nbsp; 1、概念<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、一般概念<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、<a target="_blank" href="http://www.cppblog.com/chinapeter2008/archive/2012/03/13/167769.html">容器</a><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、<a target="_blank" href="http://www.cppblog.com/chinapeter2008/archive/2012/03/19/168310.html">前向容器</a><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、<a target="_blank" href="http://www.cppblog.com/chinapeter2008/archive/2012/03/21/168512.html">可逆容器</a><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、<a target="_blank" href="http://www.cppblog.com/chinapeter2008/archive/2012/03/31/169644.html">随机访问容器</a><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、序列<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、序列<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、前面插入序列<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、后面插入序列<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、关联容器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、关联容器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、简单关联容器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、结对关联容器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、排序关联容器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、哈希关联容器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6、哈希函数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7、单一关联容器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8、多重关联容器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9、单一排序关联容器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10、多重排序关联容器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11、单一哈希关联容器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12、多重哈希关联容器<br />&nbsp;&nbsp;&nbsp;&nbsp; 2、容器类<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、序列<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、vector(向量)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、deque(队列)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、list(表)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、bit_vector(位向量)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、关联容器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、set(集合)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、map(映像)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、multiset(多重集)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、multimap(多重映像)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、hash_set(哈希集)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6、hash_map(哈希映像)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7、hash_multimap(哈希多重映像)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8、hash(哈希)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、字符串包<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、Character Traits<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、char_traits<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、basic_string<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、rope<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、容器适配器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、stack(栈)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、queue(队列)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、priority_queue(优先队列)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6、bitset(位集)<br /><br />下一节 《标准模板库 目录二 迭代器》</div><img src ="http://www.cppblog.com/chinapeter2008/aggbug/166874.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinapeter2008/" target="_blank">canaan</a> 2012-03-01 15:23 <a href="http://www.cppblog.com/chinapeter2008/archive/2012/03/01/166874.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>标准模板库（STL）简介五  《STL的其他部分(Other parts of the STL)》</title><link>http://www.cppblog.com/chinapeter2008/archive/2012/03/01/166867.html</link><dc:creator>canaan</dc:creator><author>canaan</author><pubDate>Thu, 01 Mar 2012 06:47:00 GMT</pubDate><guid>http://www.cppblog.com/chinapeter2008/archive/2012/03/01/166867.html</guid><wfw:comment>http://www.cppblog.com/chinapeter2008/comments/166867.html</wfw:comment><comments>http://www.cppblog.com/chinapeter2008/archive/2012/03/01/166867.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chinapeter2008/comments/commentRss/166867.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinapeter2008/services/trackbacks/166867.html</trackback:ping><description><![CDATA[<div><br /><strong style="font-size: 14pt;">STL的其他部分(Other parts of the STL)</strong><br style="font-size: 14pt;" /><br />如果你理解算法，迭代器和容器，那么就几乎知道STL的所有。然后，STL还包括一些其他类型的组件。首先，STL包括一些utilities：在库的不同地方使用的非常基本的概念和功能。Assignable概念，例如，描述那些有赋值操作符和拷贝构造函数的类型。几乎所有STL的类都是Assignable模式，几乎所有的算法都要求他们的参数是Assignable模式的。<br /><br />其次，STL包含一些低层次的机制来分配和释放内存。分配器非常专业，无论你使用它们的目的是什么，你都可以安全的忽略它们。<br /><br />最后，STL包括了大量的函数对象集，也被称为函子(functors)。正如迭代器是指针的泛化，函数对象是函数的泛化：你可以使用普通的函数调用方法来调用一个函数对象：这里有几种不同概念的函数对象关系，包括一元函数（只有一个参数的函数对象，即一个被称为f(x)的函数对象）和二元函数（需要两个参数的函数对象，即一个被称为f(x,y)的函数对象）。函数对象是一般程序的一个重要组成部分，因为它们不仅仅允许对象类型抽象泛型编程还允许正在执行的操作抽象泛型编程。</div><img src ="http://www.cppblog.com/chinapeter2008/aggbug/166867.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinapeter2008/" target="_blank">canaan</a> 2012-03-01 14:47 <a href="http://www.cppblog.com/chinapeter2008/archive/2012/03/01/166867.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>标准模板库（STL）简介四 《改进(Refinement)--迭代器的改进》</title><link>http://www.cppblog.com/chinapeter2008/archive/2012/02/28/166677.html</link><dc:creator>canaan</dc:creator><author>canaan</author><pubDate>Tue, 28 Feb 2012 02:33:00 GMT</pubDate><guid>http://www.cppblog.com/chinapeter2008/archive/2012/02/28/166677.html</guid><wfw:comment>http://www.cppblog.com/chinapeter2008/comments/166677.html</wfw:comment><comments>http://www.cppblog.com/chinapeter2008/archive/2012/02/28/166677.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chinapeter2008/comments/commentRss/166677.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinapeter2008/services/trackbacks/166677.html</trackback:ping><description><![CDATA[<div><strong>改善(Refinement)</strong><br /><br />输入迭代器实际上是一个比较薄弱的概念：它必须的要求很少。输入迭代器必须支持指针的算术运算的一个子集（使用前缀和后缀操作符+来增加输入迭代器）），但是并不是需要指针所有的算术运算。这对于find算法已经足够了，但是一些另外的算法的参数需要满足额外的要求。reverse算法，它的参数的&#8220;减少&#8221;(decrement)功能必须要像&#8220;增加&#8221;(increment)功能一样的，它使用表达式 --last。在概念方面，我们说revers算法的参数必须是双向迭代器(Bidirectional Iterator)模式，而不是输入迭代器。<br /><br />双向迭代器概念非常类似于输入迭代器概念：它只是简单的增加了一些额外的要求。双向迭代器模式类型是输入迭代器模式类型的一个子集。任何一个类型，如果它是双向迭代器模式，那么它肯定也是输入迭代器模式。例如，int*，既是双向迭代器模式又是输入迭代器模式。但istream_iterator，只是一个输入迭代器模式。它不符合更严格的双向迭代器的要求。双向迭代器是输入迭代器的一个改进。改进这个概念就跟c++类中的继承非常相似：我们使用不同的词，而不叫它&#8220;继承&#8221;的最主要的原因是强调&#8220;改进&#8221;的概念而不是实际类型。<br /><br />除了我们已经讨论的两个迭代器概念，其实还有另外三个迭代器概念：这5个迭代器概念有输出迭代器，输入迭代器，前向迭代器，双向迭代器和随机访问迭代器；前向迭代器是输入迭代器的改进，双向迭代器是前向迭代器的改进，随机访问迭代器是双向迭代器的改进。输出迭代器与其他四个迭代器是有关系的，担不是一部分层次的改进：它不是任何其他迭代器概念的改进，也没有其他迭代器是从改进它而来的。迭代器概述有更多关于迭代器一般的消息。<br /><br />容器类，像迭代器一样，被组织成一个层次的概念。所有容器都是容器概念模式；更完善的概念；如序列和关联容器，描述特定类型的容器。<br /><br />下一节 《STL的其他部分》<br /></div><img src ="http://www.cppblog.com/chinapeter2008/aggbug/166677.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinapeter2008/" target="_blank">canaan</a> 2012-02-28 10:33 <a href="http://www.cppblog.com/chinapeter2008/archive/2012/02/28/166677.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>标准模板库（STL）简介三 《概念和建模(Concepts and Modeling)》</title><link>http://www.cppblog.com/chinapeter2008/archive/2012/02/23/166328.html</link><dc:creator>canaan</dc:creator><author>canaan</author><pubDate>Thu, 23 Feb 2012 05:41:00 GMT</pubDate><guid>http://www.cppblog.com/chinapeter2008/archive/2012/02/23/166328.html</guid><wfw:comment>http://www.cppblog.com/chinapeter2008/comments/166328.html</wfw:comment><comments>http://www.cppblog.com/chinapeter2008/archive/2012/02/23/166328.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chinapeter2008/comments/commentRss/166328.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinapeter2008/services/trackbacks/166328.html</trackback:ping><description><![CDATA[<div><strong style="font-size: 14pt;"><span style="font-size: 18pt;"><br />概念和建模(Concepts and Modeling)</span></strong><br style="font-size: 14pt;" /><br />任何模板函数的一个非常重要的问题，不仅仅是关于STL算法，而是什么类型集可以正确的替换形式模板参数。很明显，例如，int* 或double*可以替换find函数的形式模板参数<strong>InputIterator</strong>。同样清楚的是，int或double可能不行：find函数使用表达式*first，和用操作符，从而使int类型对象或double类型对象没意义。那么基本的答案是，发现STL隐式定义了一套类型的需求，它可以满足这些要求的实例。替换<strong>InputIterator</strong>的任何类型必须提供这些操作：它必须能够比较两个对象是否相等，它必须可以增加该类型的一个对象，它必须可以通过该类型的引用来获得它指向的对象，依次类推。<br /><br />find函数并不是STL中有这些需求的唯一的算法；for_each函数和count函数，还有其他算法函数的参数也必须要满足这些要求。这些要求相当重要，值得我们给它们一个名字：我们称这种类型集的要求为概念(concept)，我们称这个特定的概念为输入迭代器(<strong>Input Iterator</strong>)。一个类型如果满足了所有这些要求，我们说这个类型符合一个概念，或者说是一个概念模型。我们说int*是一个输入迭代器<strong>(Input Iterator</strong>)的模型，因为int*提供了输入迭代器的所有要求的操作。<br /><br />概念不是C++语言的一部分;没有办法在一个程序中定义一个或者申明一个概念模型的特定类型。然而，概念是STL的一个极其重要的组成部分。使用概念(concepts)使得写程序时有可能把接口从实现中清楚地分离：find函数的作者只需要考虑这个接口符合输入迭代器(<strong>Input Iterator</strong>)概念，而不是去实现每一个可能的类型符合这个概念。同样，如果你想使用find函数,你只需要确保你传递给他的参数是输入迭代(<strong>Input Iterator</strong>)模型。这就是find函数和reverse函数可以用于lists,vector,C数组，和许多其他类型的原因：概念编程，而不是为特定类型编程，使得它可以重用软件组件和结合这些组件。<br /><br />下一节 <a href="http://www.cppblog.com/chinapeter2008/archive/2012/02/28/166677.html">《改进(refinement)》</a><br /></div><img src ="http://www.cppblog.com/chinapeter2008/aggbug/166328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinapeter2008/" target="_blank">canaan</a> 2012-02-23 13:41 <a href="http://www.cppblog.com/chinapeter2008/archive/2012/02/23/166328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>标准模板库（STL）简介二  《迭代器》</title><link>http://www.cppblog.com/chinapeter2008/archive/2012/02/22/166235.html</link><dc:creator>canaan</dc:creator><author>canaan</author><pubDate>Wed, 22 Feb 2012 06:52:00 GMT</pubDate><guid>http://www.cppblog.com/chinapeter2008/archive/2012/02/22/166235.html</guid><wfw:comment>http://www.cppblog.com/chinapeter2008/comments/166235.html</wfw:comment><comments>http://www.cppblog.com/chinapeter2008/archive/2012/02/22/166235.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chinapeter2008/comments/commentRss/166235.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinapeter2008/services/trackbacks/166235.html</trackback:ping><description><![CDATA[<div><strong style="font-size: 18pt;">迭代器(Iterators)</strong><br style="font-size: 18pt;" /><br />在上面C数组逆向排序的例子中，reverse的参数明显是double*类型。如果用reverse逆向排序vector或list, 参数又是什么呢？也就是说reverse申明的是什么参数，还有v.begin<br /><br />()和v.end()返回什么？<br /><br />答案就是reverse的参数是迭代器(iterators)就是指针对一般化。指针本身就是迭代器，所以reverse可以逆向排序C数组中的元素。类似的，vector申明了嵌套类型iterator和<br /><br />const_iterator。在上面的例子中，v.begin()和v.end()的返回类型是 vector&lt;int&gt;::iterator。也有一些迭代器，像istream_iterator和ostream_iterator，它们与容器是没有<br /><br />关联的。<br /><br />迭代器是让算法与容器分离成为可能：算法是模板，需要被迭代类型参数化使用，所以它们不会限制在某一种容器类型。考虑，例如，如何写一个算法在一个范围内进行线性搜索<br /><br />。下面是STL中find算法。<br /><br />&nbsp;&nbsp; template&lt;class InputIterator, class T&gt;<br />&nbsp;&nbsp; InputIterator find(InputIterator first, InputIterator last, const T&amp;value)<br />&nbsp;&nbsp; {<br />&nbsp;&nbsp; &nbsp;while(first != last &amp;&amp; *first != value)++first;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return first;<br />&nbsp; }<br /><br />find函数需要三个参数：两个迭代器定义一个范围，还有一个value值查找。它在[first,last)这个范围内从开始到最后一个一个检查迭代，当它找到一个迭代指向的值跟我们寻找<br /><br />的值相同时或者它到达范围的结束时，就停止查找。<br />first和last被申明为InputIterator类型，而InputIterator是一个模板参数。也就是说实际上没有一个类型为InputIterator：当你调用find函数时，编译器会把形式参数<br /><br />InputIterator和T替换成实际类型参数。如果find函数的前面两个参数类型为int*，第三个参数类型为int,那么就像调用下面的函数。<br />&nbsp;&nbsp; int* find(int* first, int* last, const int&amp; value)<br />&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(first != last &amp;&amp; *first != value)++first;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return first;<br />&nbsp;&nbsp; }<br /><br /><br />下一节 《概念与建模》</div><img src ="http://www.cppblog.com/chinapeter2008/aggbug/166235.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinapeter2008/" target="_blank">canaan</a> 2012-02-22 14:52 <a href="http://www.cppblog.com/chinapeter2008/archive/2012/02/22/166235.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>标准模板库（STL）简介一 《容器和算法》</title><link>http://www.cppblog.com/chinapeter2008/archive/2012/02/20/166090.html</link><dc:creator>canaan</dc:creator><author>canaan</author><pubDate>Mon, 20 Feb 2012 13:02:00 GMT</pubDate><guid>http://www.cppblog.com/chinapeter2008/archive/2012/02/20/166090.html</guid><wfw:comment>http://www.cppblog.com/chinapeter2008/comments/166090.html</wfw:comment><comments>http://www.cppblog.com/chinapeter2008/archive/2012/02/20/166090.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chinapeter2008/comments/commentRss/166090.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinapeter2008/services/trackbacks/166090.html</trackback:ping><description><![CDATA[<div><br /><div align="center"><strong style="font-size: 18pt;">标准模板库（STL）简介<br /></strong></div><br />STL是一个包含类，算法和迭代器的C++库；它提供许多计算机科学的基本算法和数据结构。STL是一个基本库，意味着它的组成有大量的参数：基本上每个组成部分都是一个模板。在你使用STL之前要弄清楚模板是怎么工作的。<br /><br /><strong style="font-size: 14pt;">容器和算法</strong><br style="font-size: 14pt;" /><br style="font-size: 14pt;" />就像许多其他类库一样,STL库也包含容器类：这些类的意图是用来容纳其他对象。STL包含Vector（矢量，向量）类，list（清单）,deque（队列）,set（集）,multiset（多重集）,map,multimap,hash_set（哈希集）,hash_multiset（哈希多重集）,hash_map和hash_multimap。所有这些类都是一个模板，它可以实例化来容纳任何类型的对象。举个例子，你可以用vector&lt;int&gt;来代替普通的C数组，而且vector不用管理分配动态内存。<br /><br />&nbsp;&nbsp;&nbsp; vector&lt;int&gt; v(3);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //声明一个包含3个元素的vector。<br />&nbsp;&nbsp;&nbsp; v[0] = 7;<br />&nbsp;&nbsp;&nbsp; v[1] = v[0] + 3;<br />&nbsp;&nbsp;&nbsp; v[2] = v[0] + v[1];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //v[0] == 7, v[1] == 10, v[2] == 17<br /><br />STL也包含了很多算法用来操作容器中的数据。你可以使一个vetor中的元素逆向排列，举个使用reverse算法的例子。<br />&nbsp; &nbsp;<br />&nbsp;reverse(v.begin(), v.end());&nbsp;&nbsp; // v[0] == 17, v[1] == 10, v[2] == 7<br /><br />调用这个reverse函数需要注意两个要点。第一，它不是成员函数，而是一个全局函数。第二，它需要两个参数而不是一个：它不是作用在容器上，而是作用在一系列元素上。在这个具体的例子一系列元素就是整个容器v。<br /><br />这些事实的原理都是一样的：reverse，像其他STL算法，都是与STL容器类分离的。这意味着reverse不仅仅只能用在vector中的元素，还可以用在lists中的元素，甚至是C数组中的元素。下面的程序是正确的。<br />&nbsp;<br />&nbsp; double A[6] = {1.2, 1.3, 1.4, 1.5, 1.6, 1.7}；<br />&nbsp;&nbsp; reverse(A, A + 6);<br />&nbsp;&nbsp; for(int i=0; i&lt;6; ++i)<br />&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "A[" &lt;&lt; i &lt;&lt; "]=" &lt;&lt; A[i];<br /><br />这个例子用了一个范围，就像逆序一个vector的例子：reverse的第一个参数指向这个范围的开始，第二个参数指向这个范围的末尾的后面。这个范围是[A, A+6）；这两个不对称的记号让人想到两个不一样的端点，第一个是这个范围的开始，第二个是这个范围末端的后一位。<br /><br /><br /><a href="http://www.cppblog.com/chinapeter2008/archive/2012/02/22/166235.html">下一节《迭代器》</a><br /></div><img src ="http://www.cppblog.com/chinapeter2008/aggbug/166090.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinapeter2008/" target="_blank">canaan</a> 2012-02-20 21:02 <a href="http://www.cppblog.com/chinapeter2008/archive/2012/02/20/166090.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>标准模板库STL程序员指南</title><link>http://www.cppblog.com/chinapeter2008/archive/2010/07/30/121665.html</link><dc:creator>canaan</dc:creator><author>canaan</author><pubDate>Fri, 30 Jul 2010 01:21:00 GMT</pubDate><guid>http://www.cppblog.com/chinapeter2008/archive/2010/07/30/121665.html</guid><wfw:comment>http://www.cppblog.com/chinapeter2008/comments/121665.html</wfw:comment><comments>http://www.cppblog.com/chinapeter2008/archive/2010/07/30/121665.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/chinapeter2008/comments/commentRss/121665.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/chinapeter2008/services/trackbacks/121665.html</trackback:ping><description><![CDATA[<p><a href="http://www.cppblog.com/chinapeter2008/archive/2012/02/20/166090.html">STL简介</a></p>
<p><a href="http://www.cppblog.com/chinapeter2008/archive/2012/03/01/166874.html">目录</a></p>
<p>索引</p>
<p>设计文档</p>
<p>其他STL资源</p>
<p>IOstream库（实验）</p>
<p>如何使用本站</p>
<p>STL下载</p>
<p>分类索引</p>
<p>最新消息</p>
<p>常见问题</p>
<p>允许免费使用，复制，修改，分发和出售本软件及其文档以任何用途。只是在拷贝文件和支持文档中都要有版权申明。Silicon Graphics 没有因为任何陈述本软件适合范围。它按原样提供没有任何担保。</p>
<p>版权所有&#169; 1994<br />惠普公司</p>
<p>原文：<a onclick="pageTracker._trackPageview('/outgoing/www.sgi.com/tech/stl/?referer=');" href="http://www.sgi.com/tech/stl/" target="_blank"><u><font color="#0000ff">http://www.sgi.com/tech/stl/</font></u></a></p><img src ="http://www.cppblog.com/chinapeter2008/aggbug/121665.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/chinapeter2008/" target="_blank">canaan</a> 2010-07-30 09:21 <a href="http://www.cppblog.com/chinapeter2008/archive/2010/07/30/121665.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>