bakey's profile灵魂深处PhotosBlogLists Tools Help

Blog


    18 February

    为什么都没人留言呢?

    看Blog不回可是不厚道滴-.-
    偶已经好努力写blog了哇~~~~
    大家多踩两下哇~~~~
    17 February

    也许我该好好学习学习

    2005男人感悟100条,男人,请认真阅读![转帖]
    1:能不抽烟最好不抽,它或许可以帮助你吸引一些女生,但不抽绝不会招来厌烦,表现男子气概的途径有很多,没必要拿健康做赌注。

    2:给自己定目标,一年,两年,五年,也许你出生不如别人好,通过努力,往往可以改变70%的命运。破罐子破摔只能和懦弱做朋友。

    3:找女朋友外表是第一关,但要了解她的品行之后再做打算也不迟。

    4:不要在乎小钱,工作的人都后悔从前对自己的GF不够好。记住你们的重要日子,你们的谈话,女生要敏感得多,这样做,至少可以证明你对她的重视。

    5:爱她,但别怕她,你们是恋人,也是朋友,她要的不是宠物,这样的感情,走不长远。

    6:她要是病了,带她去医院,她害怕时,找个人少的地方抱着她,给她勇气,帮她排队,挂号,放下你那点可悲的面子,周围人只会向她投来羡慕的眼光,不会对你说三道四。

    7:别把两个人的生活绞在一起,空间才是爱情的长寿药。不要经常吃醋,谁都有异性朋友,该吃的时候才吃,并且让她知道。

    8:善待她的朋友,即使她讨厌的人,你也没资格说坏话,你要做的,就是静静的听她倾诉。适当给她安慰。有时候,她们更需要依靠,即使你们都还是学生。

    9:不要问她过去,时机到了,她会毫无保留的告诉你。她要是想见从前那位,让她去,原因是你不让她去,她也会去。为何不表现得大度点,但要让她知道你相当的郁闷。

    10:珍惜身边人,不要见异思迁,大家都需要安定。即使对方比你GF漂亮10倍,还主动靠近你,给你暗号,请严肃的告诉她,你有女朋友!

    11:她开始管你的生活,你的钱 ,对你唠叨,频繁发消息询问你的位置。别担心,她只是把自己交给了你,害怕失去你。

    12:带她去你从前常去的地方,她内心会无比快乐,你失意时,她会在第一时间找到你。

    13:发生口角后,别关机,也别在街上和其他异性闲逛,那只能使矛盾激化。

    14:过生日,送她草莓蛋糕,不要太大,但要足够精致,把你对她的腻称放在蛋糕上。再买一个大的,让她和朋友一起过。

    15:牵手时,即使你的手有多汗,也别放开。

    16:把她介绍给你最好的朋友,包括异性朋友。

    17:别总是让她打电话来,她也需要被重视的感觉。

    18:衣着尽量和她的品位搭调,即使你要提升品质,请带上她一起。

    19:别偷看她的隐私,不要去猜测,在一起是缘分,离开也是缘分。

    20:如果失恋,不要轻信江湖上传言的借酒消愁,吐的滋味不好受,即使喝了,也别急着喝茶,茶不但不能解酒,反而还会伤肾。

    21:不要整天想着如何重修旧好,除了爱情,前面还有许多问题需要你去解决。这是个现实的社会,感情不能当饭吃,贫穷夫妻百事哀。不要相信电影,那只是个供许多陌生人喧嚣情感的场所。

    22:分手之后,可以伤心难过,但过渡期不能太长,因为这期间是绝佳的学习和工作时间。

    23:如果你实在奈不住寂寞,至少等上大半年,否则你不仅否定了她,也否定了你自己。

    24:当她不再爱你的时候,无论你有多想她也别打电话告诉她,因为有些人会记住第一个,而有些人只会记住上一个。

    25:好朋友里面,一定要培养出一个知己,不要以为你有多么八面玲珑,到处是朋友,最后真心对你的,只有一个,相信我。

    26:她的离开如若是一个重大打击,找间手艺不错的发型设计理个发,这样可以让你涣然一新。

    27:不要去打扰她的生活,她只会觉得从前看错人,你也会鄙视自己。

    28:你们在街上相遇,请向她微笑,把微笑留给伤你最深的人。

    29:告诉周围人,你和她已经分手,避免他们给你打报告,哪天又看见谁谁谁了。

    30:不要相信星座命理,那是哄小朋友的,命运在自己手中。难道你想等出栋房子或是车子?

    31:你的朋友最好以你自己为中心发散,允许少数支点连接,千万不要把朋友圈变成密不透风的多边型,你要为自己留底牌。

    32:不喜欢的人少接触,但别在背后说坏话,说是非之人,必定是是非之人,谨记,祸从口出。

    33:朋友圈里的你,平时都很忍让,请注意适当拿出你的主见。反之,不要太计较。

    34:给老师或者领导留下好印象,他们不会在你沉沦时再踩你几脚,相反可能会拉你一把。在社交中,原则是跌停股,世俗是潜力股。

    35:少玩游戏,这不是韩国,你打不出房子车子还有女人。进了大学,就进了社会,这是场马拉松。北京现在一个砖头抛上去,砸下来7,8个研究生受伤,现在的你是否该有点打算。

    36:拿出极限,尽力而为。你要想的是成功,而不是失败。所以面对困难首先就是拿出信心。除了你心爱女人的鼓励,这应该是最有用的东西。

    37:定时整理书桌书柜,良好的精神面貌可以让你事半功倍。

    38:学好英语,那些说学英语没用的暂时可以不去管,他们要么年纪大了,要么就是自己早过了CET6准备托福了,在这里哗众取宠。你可以不拿证,但一定要学好。

    39:不是足够热爱你的专业,并且学出来前途不够光明,趁早转业。现在更多人更看重“钱途”

    40:知道自己要干什么,寝室的卧谈会的确可以帮你磨嘴皮子,夜深人静,问问自己,将来的打算,并朝着那个方向去实现。

    41:偶尔翻翻时尚类的杂志,女朋友和女性朋友都可以从中受益。

    42:尽量少看A片,正常的男人即使是单身,也不会成天迷恋肉欲。而每次你SY后都会有大量锌元素流失,此元素与你大脑活动有密切联系。

    43:坚持做运动,俯卧撑可以锻炼你的胸肌和腹肌,请记住游泳圈是成功人事才有资格拥有的奢侈品。

    44:每天早上一杯水,预防胆结实。睡前一小时不要喝水,否则会过早出现眼袋。

    45:宁愿要深色袜子也少买白色的,这样会让人觉得你不够成熟,学生朋友自便。

    46:新同事或新朋友请你吃饭,不要觉得理所当然,请礼尚往来,否则你的名声会越来越臭。无论是大学还是公司,很多故事都是听来的。

    47:有男友的女人不要碰,即便你想one night stand 也要做好心理准备。后果同上,严重时会出现体肤之痛。

    48:朋友的女人不要碰,无论是现在的还是曾经的,后果同上。要知道,男人经营自己就像经营一个公司,要树立品牌文化。想问为什么的朋友请先做个你是受害者的假设,再跟我发短消息讨论。

    49:博爱的女人不要碰,往往这种女人连自己要什么都不知道,我想没人愿意和若干成年男性分享自己的爱。天作孽,犹可活,自作孽,不可活。

    50:没主见,不上进,懒惰的女人不要碰。就算你有钱,你有的是钱,最终你也会厌烦其中。何况不见得她们个个都是花瓶,何况你还有审美疲劳。

    51:不以物喜,不以己悲,我知道这很难,但要成功,这是必修课。

    52:空闲时间不要全拿去泡BAR,读点文学作品,学习一些经营流程,管理规范,国际时事,法律常识。这能保证你在任何聚会都有谈资。

    53:每年回母校看看那些为你付出过的老师,走上社会你才了解她们才是无私的,比起那点学费,她们简直太伟大了。学会感恩。

    54:回家帮父母做点简单家务,陪他们买菜,做饭,逛街,冬天送他们一人一件羽绒服,他们并不奢望什么,但他们需要得到你的承认,中国的父母是最苦的,孩子是最幸福的。(离婚除外)

    55:大家都年轻,没什么钱,不用太在意谁谁又穿AD ,NIKE ,或者其他。而GF对于PRADA,蓝寇,CD,LV,的热恋,你也不必放在心上,女人天生和美挂上了勾,她们只是宁愿相信你能够为她们买一样昂贵的礼物,以满足她们的虚荣心,然后在同伴面前炫耀一番。实则她们也是热爱生活的,而当你有能力完成时,也会觉得把她包装得漂漂亮亮的很是欣慰。

    56:告诉她,你喜欢的内衣。或者在UNDERWEAR店要打佯时陪她去买。

    57:欺负她时,请带上套子,如不习惯,请自行解决,直到无法忍受为止,或者泼自己一身冷水。流产很痛苦,我只是听说。

    58:有正义感,但请更理智,你父母不希望养育二十多年的儿子化为泡影。但当她遇到流氓时,请你勇敢的挡在她前面。大声说话可以让你的勇气迅速提升。(这是我答辩时认识到的)

    59:最好不要在她面前玩天真,多数MM都不喜欢,除非她要求。

    60:接吻前先嚼块口香糖,接吻时请闭上眼睛,睁开时,告诉你有多爱她。

    61:尊重每一个人,包括为你擦鞋的,卖报的,环卫工人...等等。

    62:接到陌生电话请先说,“你好,找哪位”

    63:想发脾气时,尽量忍,忍不住就去厕所蹲半个小时,或是找个海拔较高的地方站半个小时。

    64:如果GF要跟你吵,尽量克制,不能避免时,跟她吵,吵架是最好的交流方式。你们互相可以得到心里渴望已久的答案。但别带脏字,别把对方的亲戚带出来,最后尽量妥协,有些事,只能暂时妥协。不要把问题留过夜。

    65:出差回来给她一个惊喜,并带上礼物。(想在这条上跟我开玩笑的朋友,请私下跟我开)

    66:在她兜里放些零钱,在她不常用的兜里放张一百。

    67:尊老爱幼,帮助别人后,你会感到无比轻松快乐。

    68:去市场买东西,杀价先杀四分之三,现在杀一半行不通了。

    69:如果可以,给你的对手留条生路,钱是赚不完的。这个世界上,没有天生的敌人。

    70:饮水思源,永远做一个有思想的人,即使你不会有大成就,钱也会足够花。

    71:为她学一首歌,如果可能,结婚时当着大家的面唱给她听。

    72:要做一件事,成功之前,没必要告诉其他人,成功之后,和他们分享快乐。

    73:每年去寺庙为家人点几盏油灯,告诉自己的良心,你不在的时候,同样是爱他们的。

    74:学会察言观色,不要意气用事,否则会有许多不必要的麻烦。

    75:享受孤独,地球不会因为只有你一个人而停止转动,也许她会很晚才出现,在此之前,你要学会正确利用时间,并且让自己发光发亮。

    76:从前的她,深夜给你打电话,如果你还爱她,接电话。如果你不爱她,关机。(没听见不在讨论范围之内)

    77:夜里的约会最好不要选择偏僻的地方,有些突发事件,会让你痛不欲生。如果你还爱她的话。

    78:公司的东西不要带回家,即使有小便宜,也别参与,在你成为领导前,也别指责,这是你管不到的。

    79:开发你的另外一个情感宣泄功能,倾听。

    80:朋友之间不要合作做生意,或者办公司。麻烦会接踵而来。你要减轻负担,减小风险,可以,找陌生人。

    81:今日事,今日毕,不要日复一日,年复一年。不然到你60岁,你还告诉孙子,爷爷明年一定要毕业!

    82:感谢曾经爱过你的人,她祝福你的短信,一定要回。

    83:朋友之间发生争执,不要次次都是忍让,每个人都有坚持自己的权利,让他们知道你的想法,你所坚持的。没关系,不出两天,你们又是好朋友。

    84:说该说的,不说不该说的。对朋友,也应当有所保留。对她,不要把她和从前那个相提并论,谁都受不了。

    85:头发,指甲,胡子,打理好。社会是个排斥性的接受体,这个星球所需要的艺术家极其有限,请不要冒这个险,就算你留长头发比较好看,也要尽量给人干净的感觉。

    86:牌局可有可无,那不是年轻人该干的,除非工作需要,否则不要培养这种兴趣。当你看见GF坐在赌博机面前聚精会神的呐喊着某张牌时,你是什么感觉?

    87:每学期给自己写总结,上课认真学习,所谓的好好学习,天天向上,学好了,就是最管用的绝招。机会常常伪装成麻烦,从你身边路过,也只会留给做好准备的人。上班的朋友同理。

    88:不要整天把国家大事摆在嘴上,去改变你能改变的,接受你无法改变的。

    89:选一个生日陪你母亲过,那也是她的受难日。不要年年都和同样一群人过。到头来,全心为你的,只有她。

    90:有了手机,尽量少上网,就算你仅仅是看新闻,读文章,大把时间也会不经意从你身边流失。

    91:不要以为你是个男人,就不需要保养。至少饮食方面不能太随便,多吃番茄,海产品,韭菜,香蕉,都是对男性健康有益处的食物。你要是看不到价值,我可以告诉你。至少你能把看病节约下来的钱给她多买几盒DIOR。

    92:善待小动物,你以后也有子子孙孙,同样是生命,培养一下自己的爱心吧。这并不表示你懦弱。

    93:如果考公务员,要有十足的心理准备。早点开始托关系吧,还不见得一定就有收效。

    94:力求上进的人,不要总想着靠谁谁,人都是自私的,自己才是最靠得住的人。

    95:如果你们相处几年下来,她开始冷落你,对你不闻不问,请别怪她,让她离开。给不了她幸福,给她自由。

    96:如果你想和她说分手,请在考试之后,人都是脆弱的。

    97:她给你买礼物,你可以高兴,但不要太高兴。人生就是场经营,有人经营感情,有人经营利益,有人经营幸福,而有人经营阴谋。

    98:面对失败,不要太计较,天将降大任于斯人也,必先苦其心志,劳其筋骨,饿起体肤....但要学会自责,找到原因,且改掉坏习惯。二十岁没钱,那很正常,三十岁没钱,那是宿命。

    99:学会微笑,以后在很多场合都用得上它。如何让微笑好看,首先你得拥有健康的牙齿。如何保证牙齿健康,一,早晚,饭后刷牙;二,每年去探望一次牙科医生;三,少管闲事。

    100:凡事要坚持,就像我写这篇文章一样。
    16 February

    Google's BigTable 原理 (翻译)

       题记:google 的成功除了一个个出色的创意外,还因为有 Jeff Dean 这样的软件架构天才。

                                                      ------ 编者

    官方的 Google Reader blog 中有对BigTable 的解释。这是Google 内部开发的一个用来处理大数据量的系统。这种系统适合处理半结构化的数据比如 RSS 数据源。 以下发言  Andrew Hitchcock  在 2005 年10月18号 基于: Google 的工程师 Jeff Dean 在华盛顿大学的一次谈话 (Creative Commons License).

     


    首先,BigTable 从 2004 年初就开始研发了,到现在为止已经用了将近8个月。(2005年2月)目前大概有100个左右的服务使用BigTable,比如: Print,Search History,Maps和 Orkut。根据Google的一贯做法,内部开发的BigTable是为跑在廉价的PC机上设计的。BigTable 让Google在提供新服务时的运行成本降低,最大限度地利用了计算能力。BigTable 是建立在 GFS ,Scheduler ,Lock Service 和 MapReduce 之上的。

    每个Table都是一个多维的稀疏图 sparse map。Table 由行和列组成,并且每个存储单元 cell 都有一个时间戳。在不同的时间对同一个存储单元cell有多份拷贝,这样就可以记录数据的变动情况。在他的例子中,行是URLs ,列可以定义一个名字,比如:contents。Contents 字段就可以存储文件的数据。或者列名是:”language”,可以存储一个“EN”的语言代码字符串。

    为了管理巨大的Table,把Table根据行分割,这些分割后的数据统称为:Tablets。每个Tablets大概有 100-200 MB,每个机器存储100个左右的 Tablets。底层的架构是:GFS。由于GFS是一种分布式的文件系统,采用Tablets的机制后,可以获得很好的负载均衡。比如:可以把经常响应的表移动到其他空闲机器上,然后快速重建。

    Tablets在系统中的存储方式是不可修改的 immutable 的SSTables,一台机器一个日志文件。当系统的内存满后,系统会压缩一些Tablets。由于Jeff在论述这点的时候说的很快,所以我没有时间把听到的都记录下来,因此下面是一个大概的说明:

    压缩分为:主要和次要的两部分。次要的压缩仅仅包括几个Tablets,而主要的压缩时关于整个系统的压缩。主压缩有回收硬盘空间的功能。Tablets的位置实际上是存储在几个特殊的BigTable的存储单元cell中。看起来这是一个三层的系统。

    客户端有一个指向METAO的Tablets的指针。如果METAO的Tablets被频繁使用,那个这台机器就会放弃其他的tablets专门支持METAO这个Tablets。METAO tablets 保持着所有的META1的tablets的记录。这些tablets中包含着查找tablets的实际位置。(老实说翻译到这里,我也不太明白。)在这个系统中不存在大的瓶颈,因为被频繁调用的数据已经被提前获得并进行了缓存。

        现在我们返回到对 列的说明:列是类似下面的形式: family:optional_qualifier。在他的例子中,行:www.search-analysis.com  也许有列:”contents:其中包含html页面的代码。 “ anchor:cnn.com/news” 中包含着 相对应的url,”anchor:www.search-analysis.com/” 包含着链接的文字部分。列中包含着类型信息。

        (翻译到这里我要插一句,以前我看过一个关于万能数据库的文章,当时很激动,就联系了作者,现在回想起来,或许google的 bigtable 才是更好的方案,切不说分布式的特性,就是这种建华的表结构就很有用处。)

        注意这里说的是列信息,而不是列类型。列的信息是如下信息,一般是:属性/规则。 比如:保存n份数据的拷贝 或者 保存数据n天长等等。当 tablets 重新建立的时候,就运用上面的规则,剔出不符合条件的记录。由于设计上的原因,列本身的创建是很容易的,但是跟列相关的功能确实非常复杂的,比如上文提到的 类型和规则信息等。为了优化读取速度,列的功能被分割然后以组的方式存储在所建索引的机器上。这些被分割后的组作用于 列 ,然后被分割成不同的 SSTables。这种方式可以提高系统的性能,因为小的,频繁读取的列可以被单独存储,和那些大的不经常访问的列隔离开来。

    在一台机器上的所有的 tablets 共享一个log,在一个包含1亿的tablets的集群中,这将会导致非常多的文件被打开和写操作。新的log块经常被创建,一般是64M大小,这个GFS的块大小相等。当一个机器down掉后,控制机器就会重新发布他的log块到其他机器上继续进行处理。这台机器重建tablets然后询问控制机器处理结构的存储位置,然后直接对重建后的数据进行处理。

    这个系统中有很多冗余数据,因此在系统中大量使用了压缩技术。

        Dean 对压缩的部分说的很快,我没有完全记下来,所以我还是说个大概吧:压缩前先寻找相似的 行,列,和时间 数据。

        他们使用不同版本的: BMDiff 和 Zippy 技术。

       BMDiff 提供给他们非常快的写速度: 100MB/s 1000MB/s 。Zippy 是和 LZW 类似的。Zippy 并不像 LZW 或者 gzip 那样压缩比高,但是他处理速度非常快。

        Dean 还给了一个关于压缩 web 蜘蛛数据的例子。这个例子的蜘蛛 包含 2.1B 的页面,行按照以下的方式命名:“com.cnn.www/index.html:http”.在未压缩前的web page 页面大小是:45.1 TB ,压缩后的大小是:4.2 TB , 只是原来的 9.2%。Links 数据压缩到原来的 13.9% , 链接文本数据压缩到原来的 12.7%。

    Google 还有很多没有添加但是已经考虑的功能。

        1.  数据操作表达式,这样可以把脚本发送到客户端来提供修改数据的功能。
        2. 多行数据的事物支持。
        3.  提高大数据存储单元的效率。
        4. BigTable 作为服务运行。
        好像:每个服务比如: maps 和 search history 历史搜索记录都有他们自己的集群运行 BigTable。
        他们还考虑运行一个全局的 BigTable 系统,但这需要比较公平的分割资源和计算时间。

    原文地址:
    http://blog.csdn.net/accesine960/archive/2006/02/09/595628.aspx

    http://blog.outer-court.com/archive/2005-10-23-n61.html

    15 February

    开学前夕

    打算20号回学校了,可是在回学校前的这几天里却感到莫名的烦躁.不知为什么,总是做什么都提不起劲来,想做题,却不想思考.想学点东西,却静不下心来.
    哎~~其实我是恨渴望回到学校去的,下学期有很多事情要做,有很多东西要学,有很多东西需要我很努力地去维持,去继续.有使命等待我回去完成~~~
    但是不知为什么这一切我在家里就是提不起精神去做.哎~~~好烦好烦啊.有很多事情都没有解决啊...郁闷死我了,好想哭:((((~~
    14 February

    2.14,情人节的凌晨

    不管是否要逃避点什么,我都要写一点东西了.刚才为了她一句话,我们又吵了起来,而且这次我的反应还特别地强烈,手机也关掉了.是否我太小气了?还是为了别的什么?每次这种时候我就特别地控制不了自己,总要做点伤害彼此双方的事.
    实在不愿意在今天情人节说起这些不愉快的事,当是一个教训吧.记一下,希望以后我们可以更加快乐~~
    咳咳.
    不过虽然是情人节,我们始终不能在一起过:(  成本太大,不过打算推后庆祝吧.一个节日过得是否开心,关键不是什么时候过,是和什么人一起过吧.嘿嘿.也许今天每个人都会有自己的故事,希望所有的人都开开心心,有情人终成眷属^_^
    11 February

    加了好多stl的东西

    自己都还没仔细看看,发在spaces上作参考.顺便也可以学习一下.努力ing......

    Singleton 的实现

    Singleton 的实现

    //////////////////////////////////////////////////////////////////////
    //              Singleton 的实现
    //////////////////////////////////////////////////////////////////////
    //这种作为类的静态对象实现的单件模式无法控制该静态对象的初始化时间.
    //因为初始化顺序是未定义的.
    //如果要控制初始化时间. 可以用函数内的静态变量的方法. 它的初始化就是在函数首次被调用时进行了.
    class Singleton {
    private:
     static Singleton _instance;
     Singleton(){}
     Singleton(const Singleton &){};
    public:
     ~Singleton(){}
     static Singleton & get()
        {
               return _instance;
        }
       
        void Singleton::run()
        {
             cout << "The _instance is Running !" << endl;
        }
    };
    Singleton Singleton::_instance;

    int main() {
     Singleton::get().run();
     return 0;
    }
     
    //用另一种方法实现
    //单件模式
    #include <iostream.h>
    class point
    {
    public:
    static point * getinstance()
    {
       if (p == NULL)
            p = new point();
       return p;
    }
    private:
    point()
    {
     cout<<"hello!";
    }
    static point * p;
    };
    point * point::p = NULL;
    void main()
    {
     point * pt = point::getinstance();
    }
     

    16

    第16章 Container Classes 容器类

    第16章
    Container Classes
    容器类

    分为序列式容器和关联式容器.
    另外STL还提供了3种Container adapters 它们自身并不是容器.

    16.1 序列 (Sequences)
    STL定义了3种序列 vector  list  deque
    16.1.1 vector
    vector<T , Allocator>
    支持随机访问. 方便的在尾端插入/删除元素.
    vector的size和capacity是两个概念.
    vector会自动管理内存.
    它典型的有三个成员变量指针. start  finish  end_of_storage
    没有成员函数可以缩小vector的容量(capacity). 但可以把其元素拷贝至另一个
    小容量的容器.然后用容器间赋值的办法间接实现.
    构造函数:
          expilcit vector :: vector( const Allocator& A = Allocator() ); // 产生一个空的vector
          expilcit vector :: vector( size_type n, const T & x = T() , const Allocator & A = Allocator() );
          // 产生的vector中具有n个元素. 且 n 个元素都是 x 的复制品.
          template<class InputIterator>
          vector:: vector(InputIterator f, InputIterator l, const Allocator& A = Allocator() );
          //产生的vector 包含 [ f , l) 的元素的复制品.
         
    其他的一些函数:
          allocator_type vector :: get_allocator() const ; // 返回vector构造时所用的allocator
          void  vector :: reserve(size_type n);
          // 增加容量. 若n <= 当前capacity() . 则此函数不作任何事.
          reference vector:: front()  //返回第一个元素.
          reference vector:: back() //返回最后一个元素.
          void vector:: pop_back()  //删除最后一个元素.
          iterator vector:: insert(iterator pos, const T& x); //在pos的前一个位置插入x.
          template < class InputIterator>
          void vector :: insert (iterator pos , InputIteartor f, InputIterator l); //在pos的前一个位置插入[f, l)
          void vector:: insert(iterator pos, size_type n, const T& x) //在pos前一个位置插入n个x的复制品
          iterator vector::erase(iterator pos) // 删除pos所指元素.
          iterator vector::erase(iterator f, iterator l) // 删除[f,l)内的元素.
          void vector :: clear() //删除所有元素.
          void vector::resize(size_type n, const T& t = T() ); // 将容器内元素的数量改变为n .新增的元素为t的复制品.
     
    16.1.2 list
    list<T, Allocator>
    list是一种双向链表. 所以它能支持双向移动.
    对它的插入/删除/连接不会造成指向该list的iterator失效.
    构造函数:
           expilcit list::list(const Allocator& A = Allocator() ) //产生一个空的list
            expilcit list::list(size_type n, const T& x = T(), const Allocator& A=Allocator() );
            //产生的list包含n个x的复制品.
            //拷贝构造函数
            template<class InputIterator>
            list::list(InputIteator f, InputIterator l , const Allocator& A = Allocator() );
            // 产生的list包含[f , l)
    其他一些成员函数:
            size_type list::size() const ; //返回list的元素的个数. 它要遍历一遍链表.
            size_type list::max_size() const ;  //返回list的最大可能的元素个数;
            reference list::front() ; //返回第一个元素
     
            reference list::back(); // 返回最后一个元素.
            void list::push_front(const T& t) ; //在开头插入元素;
            void list::pop_front() ; //删除开头元素;
            void list::push_back(const T& t) ; //在结尾插入元素;
            void list::pop_back() ; //删除结尾元素;
            iterator list::insert(iterator pos , const T& x); //在pos的前一个位置插入x
            template<class InputIterator>
            void list :: insert(iterator pos, InputIterator f, InputIterator l); //在pos前插入[f,l)
            void list::insert(iterator pos, size_type n, const T& x)
            //在pos前插入n个x的复制品.
            iterator list::erase(iterator pos); //删除pos所指元素;
            iterator list::erase(iterator f, iterator l) //删除[f , l)的元素
            void list:: clear()
            void list::resize(size_type n, const T& t = T() );
     
    16.1.3 slist
    //单向链表. stl中不支持

    16.1.4 deque
    deque<T, Allocator>
    双向队列.它和vector类似. 支持随机访问. 支持在常量时间内在序列尾端插入/删除元素.
    但它还支持在常量时间内在序列开头插入删除元素. 它在序列中间插入元素的时间开销取决
    于插入位置距离deque开头或结尾中较短的距离.
    deque的实现比较复杂.所以一般开销都比较大.一般需要排序的时候把所有元素都复制到vector中
    排序后再复制回来. 但是它支持在序列的开头和结尾快速的插入/删除元素.

    16.2 Associative Containers (关联式容器)
    STL提供4种关联容器. set  map  multiset  multimap
    16.2.1 set
    set<Key, Compare, Allocator>
    set 中的key_type型元素都是以递增排序的.(参数 Compare 定义这种顺序关系缺省为 less<Key>) . 而且没有重复key.
    在set中插入/删除元素不会造成指向它的Iterator 失效.
    构造函数:
             expilcit set::set( const key_compar& comp=key_compare() , const Allocator& A = Allocator() );
            
             template <class InputIteartor>
             set :: set (InputIterator f, InputIterator l,
                   const key_compar& comp=key_compare() , const Allocator& A = Allocator()  )
    其他一些成员函数:
              begin() / end()
              rbegin() / rend()
              size()
              max_size()
              empty()
              key_comp() //比较key的函数对象
              value_comp()
              get_allocator()
             
               pair<iterator, bool> set:: insert(const value_type& x);
              //插入x. 若插入成功(即原set中没有该key). 返回true
               template<class InputIterator>
               void set::insert(InputIterator f, InputIteraor l);
                //将[f,l)插入set
               void set::erase(Iteartor pos);
               void set::erase(const key_type & k);
               void set::erase(iterator f, iterator l);
               iterator set::find(const key_type& k) const;
               size_type set::count(const value_type& k) const ; //返回键值为k的元素个数 . 非0即1.

    16.2.2 map
    map<Key, T, Compare, Allocator>
    它和set类似. 但它存储的式(键,值)对.
    它可以方便的用 [键] 的形式取一个元素. 但这只是它的方便的写法. 代替find / insert 等函数.
    构造函数:
            expilcit map::map(const key_compare& comp = key_compare(),
                    const Allocator& A = Allocator() );  //产生一个空的map
             template <class InputIteartor>
             map :: map (InputIterator f, InputIterator l,
                   const key_compar& comp=key_compare() , const Allocator& A = Allocator()  )
    其他一些成员函数:
              begin() / end()
              rbegin() / rend()
              size()
              max_size()
              empty()
              key_comp() //比较key的函数对象
              value_comp()
              get_allocator()
              swap()
               iterator map:: insert(iterator pos, const value_type& x);
               template<class InputIterator>
               void map::insert(InputIterator f, InputIteraor l);
                //将[f,l)插入set
               void map::erase(Iteartor pos);
               size_type map::erase(const key_type & k);
               void map::erase(iterator f, iterator l);
               iterator map::find(const key_type& k) const;
               size_type set::count(const value_type& k) const ; //返回键值为k的元素个数 . .
               mapped_type& operator[ ] (const key_type&);
               //由于同一个键在一个map中最多出现一次. 所以它返回该键关联的对象的引用. 若map中没有该对象.
               //则先将一个缺省的对象插入.  //注意: 返回的是map元素的值的引用.而不是value_type&

    16.2.3 multiset
    multiset<Key, Compare, Allocator>
    它与set的区别是它可以容纳相同key值的元素在一个对象里.参考set.
    16.2.4 multimap
    multimap<Key, T, Compare, Allocator>
    它与map的区别是它可以容纳相同的key值的多个元素在一个对象里. 参考map.
     
    16.3  Container Adapters
    包括stack  queue priority_queue三个类.
    他们都是只提供容器的有限的操作.
    16.3.1 stack
    stack< T , Sequence >  //第2个参数类型为stack底层实现所用的容器的类型. 缺省为 deque<T>
    它声明于 <stack> 代表栈数据结构. 它只允许在栈顶 访问/插入/删除元素.
    但不能访问栈内的其他元素.
    构造函数:
          stack();
          stack(Sequence& s) ; //用s初始化栈内底层实现时所用的容器.
    其他函数:
          size()
          empty()
          top()
          push(const value_type& x)
          void pop();
    16.3.2 queue
    queue < T , Sequence >  //第2个参数类型为queue 底层实现所用的容器的类型. 缺省为 deque<T>
    它声明于 <queue > 代表队列数据结构. 它只允许访问队列两端的元素. 在队列结尾插入元素.
    以及在队列开始删除元素.
    构造函数:
          queue ();
          queue (Sequence& s) ; //用s初始化栈内底层实现时所用的容器.
    其他函数:
          size()
          empty()
          front()
          back()
          push(const value_type& x)
          void pop();
    16.3.3 priority_queue
    priority_queue < T , Sequence , Compare> 
    //第二个类型参数是它底层实现用到的容器.缺省是vector<T>.通常用堆来实现.
    //第三个参数提供T型对象的大小比较,缺省为less<T>.
    优先级队列. 它只能插入/查看/删除最顶端的元素. 不能修改任何一个元素. 也不能遍历这些元素.
    它最顶端的元素是元素中的最大值的一个.
    stl中它声明于<queue>
    构造函数:
          priority_queue (const Compare& c = Compare() );
          //构造一个空的优先级队列
         
          template<class InputIterator>
          priority_queue (InputIterator f, InputIterator l , const Compare& c = Compare() );
          构造的优先级队列包含了[f , l) 的元素.
          priority_queue (const Compare& c, const Sequence& s);
          //先用s构造优先级队列中内部实现所用的容器对象. 在根据 c 指定的比较对其排序.
          template<class InputIterator>
          priority_queue (InputIterator f, InputIterator l , const Compare& c, const Sequence& s);
          构造的优先级队列包含了s中的元素, 以及[f , l) 的元素. 并已经排序.
    其他函数:
          size()
          empty()
          top() //返回的是最顶端元素的const型引用.
          push(const value_type& x)
          void pop();

    15

    第15章 Function Object Classes 函数对象类

    第15章
    Function Object Classes
    函数对象类
    在<functional>
    15.1 Function Object Base Classes
    15.1.1 unary_function     //单参
    unary_function<Arg, Result>
    它是一个空基类. 没有任何成员数据或成员函数. 只有类型定义信息.
    两个typedef:
              argument_type     //参数的类型
              result_type        //返回值类型
    15.1.2 binary_function
    binary_function<Arg1, Arg2, Result>
    它是一个空基类. 没有任何成员数据或成员函数. 只有类型定义信息.
    三个typedef:
              first_argument_type     //参数1的类型
              second_argument_type     //参数2的类型
              result_type        //返回值类型

    15.2 算术运算 (Arithmetic Operations)
    15.2.1 plus 类
    plus<T>
    binary_function<T,T,T>的子类. 该类的函数对象计算两个参数的和.
    例如: plus<int>( ) 构造了一个该类的对象.
              plus<int>() ( 2, 3 ); //得到5.
    15.2.2 minus 类
    minus<T>
    类似plus类. 它计算两个参数的差. x-y
    15.2.3 multiplies
    multiplies<T>
    类似plus类. 它计算两个参数的积. x*y
    15.2.4 divides
    divides<T>
    类似plus类. 它计算两参数的商. x/y
    15.2.5 modulus
    modulus<T>
    类似plus类. 它计算两参数的余数. x%y
    15.2.6 negate
    negate<T>
    该类的对象做函数时.只有一个参数. 计算参数的相反数. -x

    15.3 大小比较 ( Comparisons )
    15.3.1 equal_to
    equal_to<T>
    其result_type为bool
    该类的对象做函数时.判断两个参数是否相等. x == y 返回true
    15.3.2 not_equal_to
    not_equal_to<T>
    类似equal_to.判断两个参数是否不等. x != y 返回true
    15.3.3 less
    less<T>
    类似equal_to. 判断 x < y
    15.3.4 greater
    greater<T>
    类似equal_to . 判断 x > y
    15.3.5 less_equal
    less_equal<T>
    类似equal_to. 判断 x <= y
    15.3.6 greater_equal
    greater_equal<T>
    类似equal_to . 判断 x >= y

    15.4 逻辑运算 (Logical Operations)
    15.4.1 logical_and
    logical_and<T>
    计算 x && y .
    15.4.2 logical_or
    logical_or<T>
    计算 x || y .
    15.4.3 logical_not
    logical_not<T>
    计算 !x

    15.5 证同( Identity ) 与 投射( Projection )
    15.5.1 identity
    identity<T>
    该类的函数对象只有一个参数.返回值还是该参数.
    15.5.2 project1st
    project1st<Arg1, Arg2>
    它接受两个参数. 返回第一个参数并忽略第二个参数. 是identity的一般化形式.
    15.5.3 project2nd
    project2nd<Arg1, Arg2>
    它接受两个参数. 返回第二个参数并忽略第一个参数. 是identity的一般化形式.
    15.5.4 select1st
    select1st<Pair>
    接受一个pair参数. 返回pair的第一个元素.
    15.5.5 select2nd
    select2nd<Pair>
    接受一个pair参数. 返回pair的第二个元素.

    15.6 特殊的函数对象
    15.6.1 hash
    hash<T>
    其中类型T.在stl中只能是char* . const char* . string 以及内建的整型. 如果你要
    搭配其他的类型就要提供自己的Hash函数类.
    使用例子:
         hash<const char*> H;
         cout << H("foo") << endl;

    15.7 Member Function Adapters

    15.8 其他的 Adapters
    15.8.1 binder1st

    14

    第14章 Iterator Classes (迭代器类)

    第14章
    Iterator classes
    迭代器类
    在头文件<iterator>
    14.1 Insert Iterators
    是一种Output Iterator.
    14.1.1 front_insert_iterator
    front_insert_iterator<FrontInsertionSequence>
    这个类是具有Output Iterator功能的一个迭代器适配器类.通过该类型完成的赋值动作.可以将对象
    插入到序列的开头(原第一个元素之前).
    使用例子:
    list<int> l;
    l.push_front(3);
    front_insert_iterator<list<int> > ii(l);
    *ii ++ = 0; //将0安插到l最前边.
    *ii++ = 1; // 将1安插到0前边;
    ................
    再看一个例子. 它将一个序列的元素反序拷贝到另一序列中了:
    vector<int> v;
    ......
    list<int> l;
    copy(v.begin(), v.end(), front_inserter(l)); //不明确写出front_insert_iterator类型.
                             //而是用辅助函数front_inserter . 这样比较方便.
    front_insert_iterator 类的一些成员函数:
             front_insert_iterator::front_insert_iterator(FrontInsertionSequence & s); //构造函数.接受一个容器类的对象的参数.
             //拷贝构造函数.
             //析构函数
             front_insert_iterator& front_insert_iterator:: operator* (); //用来实现 *i = x. 在序列前插入.
             front_insert_iterator& front_insert_iterator:: operator++(); //重载++ 包括前缀后缀的.
    还有一个非成员的函数:
             template <class FrontInsertionSequence>
             front_insert_iterator <FrontInsertionSequence>
             front_inserter(FrontInsertionSequence& s) ; 
             //等价于  front_insert_iterator <FrontInsertionSequence>(s); 构造函数. 但使用更方便.
    14.1.2 back_insert_iterator
    back_insert_iterator <BackInsertionSequence>
    它和上一个迭代器适配器类相似. 在序列后边插入元素.
    如果ii是一个back_insert_iterator<Seq>
    则 *ii = x 就相当于 seq.push_back(x);
    14.1.3 insert_iterator
    insert_iterator <Container>
    迭代器适配器类. 它的构造函数要两个参数:
              insert_iterator::insert_iterator(Container& c, Container::iterator i);
              //赋值时会在i所指元素之前插入元素.
    此外还有一个返回该类对象的非成员函数inserter :
             template<class Container, class Iterator>
             insert_iterator<Container> inserter(Container& c, Iterator p);
             这个函数相当于insert_iterator<container>(c, i); 但更方便.

    14.2 Stream Iterators
    配合输入输出流类工作.
    14.2.1 istream_iterator
    istream_iterator<T, charT, traits, Distance>
    是一种Input Iterator.  它能为"来自某个basic_istream"的对象执行格式化
    输入动作. 一旦stream结束. istream_iterator便呈现一个特别的"stream终结值".
    它的模板参数分别为:
           T      istream_iterator的value_type. 即*运算返回值的类型.
           CharT       InputStream的chartype . 缺省为char.
           traits        InputStream 的char traits class . 缺省为 char_traits<charT>.
           Distance       Iterator的difference type. 缺省为 ptrdiff_t.
    在这个类中定义的还有:
          char_type : charT
          traits_type: traits
          istream_type : basic_istream<charT, traits>
    构造函数:
            istream_iterator( istream_type& s); //当s到达stream终点时. 这个迭代器和end-of-stream iterator比较结果会相等.
    缺省构造函数:
            istream_iterator() //它产生一个end-of-stream iterator .那是个past-the-end(结尾之后)的iterator.
    14.2.2 ostream_iterator
    ostream_iterator<T , charT , traits>
    它是一个Output Iterator. 能将一个T object格式化输出到某个指定的basic_ostream中.
    模板参数:
           T:  被写到ostream的那些对象的类型.
           charT: Output stream 的chartype . 缺省为char
           traits:  Output stream 的chartrais class . 缺省为 char_traits<charT>
     在这个类中定义的还有:
          char_type : charT
          traits_type: traits
          ostream_type : basic_ostream<charT, traits>
    构造函数:
         ostream_iterator(ostream_type& s); //它产生一个osteram_iterator .使得对这个迭代器的赋值就像 s << t 一样.
         ostream_iterator(ostream_type& s, const charT* delim);
         // 这个构造函数具有定界符号(delimiter). 它产生的osteram_iterator. 使得通过对该迭代器的赋值就像 s << t << delim 一样.
    14.2.3 istreambuf_iterator
    istreambuf_iterator<chatT, traits>
    这个类和istream_iterator非常相似. 但它只是从input stream读入单个字符. 它是一种Input Iterator.
    在遇到stream终结时. 会以一个past-the-end值表示之.
    模板参数:
       charT:  istreambuf_iterator的valuetype. 表示这个迭代器会读入类型为charT的字符.
       traits:   InputStream的char_traits class . 缺省为 char_traits<charT>
    使用例子:
      istreambuf_iterator<char> first(cin);
      istreambuf_iterator<char> end;
      vector<char> buffer(first, end);
      .....
    14.2.4 ostreambuf_iterator
    ostreambuf_iterator <charT, traits>
    和上一个类似.

    14.3 reverse_iterator
    reverse_iterator<Iterator>
    这是一个迭代器适配器类. 它能够在区间上逆向移动.它的++相当于原迭代器的--
    例如有 list<int> l;
    把l的end()转换成该类迭代器用 reverse_iterator< list<int> :: iterator> ( l.end());

    13

    第13章 排序和查找

    第13章
    排序和查找
    Sorting and Searching

    13.1 对某个区间排序 Sorting Ranges
    13.1.1 sort
    //将元素以非递减顺序排序
    //排序后相等的元素之间的前后关系不保持.
    (1)用operator<
    template <class RandomAccessIterator>
    void sort (RandomAccessIterator first, RandomAccessIterator last);
    (2)用指定的函数比较代替<
    template <class RandomAccessIterator, class StrictWeakOrdering>
    void sort (RandomAccessIterator first, RandomAccessIterator last,
                StrictWeakOrdering comp);
    13.1.2 stable_sort
    //与sort的区别是它对排序后相等的元素之间的前后关系保持.
    1)用operator<
    template <class RandomAccessIterator>
    void stable_sort (RandomAccessIterator first, RandomAccessIterator last);
    (2)用指定的函数比较代替<
    template <class RandomAccessIterator, class StrictWeakOrdering>
    void stable_sort (RandomAccessIterator first, RandomAccessIterator last,
                StrictWeakOrdering comp);
    13.1.3 partial_sort
    // 部分的排序. 应用与 要求序列中前n个(n为middle - first)最小的元素的情况.
    // 因为没有必要对整个序列排序. 所以这里用它比用sort快.
    1)用operator<
    template <class RandomAccessIterator>
    void stable_sort (RandomAccessIterator first, RandomAccessIterator middle,
                                        RandomAccessIterator last);
    (2)用指定的函数比较代替<
    template <class RandomAccessIterator, class StrictWeakOrdering>
    void stable_sort (RandomAccessIterator first, RandomAccessIterator middle,
                RandomAccessIterator last, StrictWeakOrdering comp);
    13.1.4 partial_sort_copy
    //将排序后的元素复制至另一序列中.
    //复制的元素的个数为源序列长度和目的序列长度之小者
    (1)用operator<
    template<class InputIterator, class RandomAccessIterator >
    void partial_sort_copy(InputIterator first, InputIterator last,
                 RandomAccessIterator result_first, RandomAccessIterator result_last);
    (2)用指定的函数比较代替<
    template<class InputIterator, class RandomAccessIterator ,
                          class StrictWeakOrdering >
    void partial_sort_copy(InputIterator first, InputIterator last,
                 RandomAccessIterator result_first, RandomAccessIterator result_last,
                 StrictWeakOrdering comp);
    13.1.5 nth_element
    //与partial_sort部分排序类似, 它也是部分的排序.
    // 区别是. 它只对小于(*nth)的部分排序.也就是在没排序的元素中找一个值.只排小于这个值的元素.
    (1)用operator<
    template <class RandomAccessIterator >
    void nth_element(RandomAccessIterator  first, RandomAccessIterator nth,
                       RandomAccessIterator  last);
    (2)用指定的函数比较代替<
    template <class RandomAccessIterator , class StrictWeakOrdering>
    void nth_element(RandomAccessIterator  first, RandomAccessIterator nth,
                       RandomAccessIterator  last, StrictWeakOrdering comp);
    13.1.6 is_sorted
    //检查一个序列是否已排序
    1)用operator<
    template <class ForwardIterator>
    void is_sorted (ForwardIterator first, ForwardIterator last);
    (2)用指定的函数比较代替<
    template <class ForwardIterator, class StrictWeakOrdering>
    void is_sorted(ForwardIterator first, ForwardIterator last,
                StrictWeakOrdering comp);

    13.2 sorted ranges 上的操作行为
    13.2.1 二分查找法 Binary Search
    13.2.1.1 binary_search
    //2分法查找序列中是否有指定元素. 找到返回true.
    (1)2分查找时用 <
    template <class ForwardIterator, class StrictWeaklyComparable>
    bool binary_search(ForwardIterator first, ForwardIterator last,
             const  StrictWeaklyComparable& value);
    (2)用指定的函数对象代替 <
    template <class ForwardIterator, class T, class StrictWeakOrdering>
    bool binary_search(ForwardIterator first, ForwardIterator last,
             const  T& value,  StrictWeakOrdering comp);
    13.2.1.2 lower_bound
    //用2分法查找一个位置. 返回值为"在不破坏顺序的前提下"的第一个可以插入value的位置.
    (1)2分查找时用 <
    template <class ForwardIterator, class StrictWeaklyComparable>
    ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last,
             const  StrictWeaklyComparable& value);
    (2)用指定的函数对象代替 <
    template <class ForwardIterator, class T, class StrictWeakOrdering>
    ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last,
             const  T& value,  StrictWeakOrdering comp);
    13.2.1.3 upper_bound
    //用2分法查找一个位置. 返回值为"在不破坏顺序的前提下"的最后一个可以插入value的位置.
    (1)2分查找时用 <
    template <class ForwardIterator, class StrictWeaklyComparable>
    ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last,
             const  StrictWeaklyComparable& value);
    (2)用指定的函数对象代替 <
    template <class ForwardIterator, class T, class StrictWeakOrdering>
    ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last,
             const  T& value,  StrictWeakOrdering comp);
    13.2.1.4 equal_range
    //用2分法查找一个元素. 返回值为"在不破坏顺序的前提下"的第一个和最后一个可以插入value的位置.
    (1)2分查找时用 <
    template <class ForwardIterator, class StrictWeaklyComparable>
    pair<ForwardIterator, ForwardIterator>  equal_range(ForwardIterator first,
                         ForwardIterator last,  const  StrictWeaklyComparable& value);
    (2)用指定的函数对象代替 <
    template <class ForwardIterator, class T, class StrictWeakOrdering>
    pair<ForwardIterator, ForwardIterator>  equal_range(ForwardIterator first,
               ForwardIterator last, const  T& value,  StrictWeakOrdering comp);
    13.2.2 合并(Merging)两个Sorted Ranges
    13.2.2.1 merge
    //合并两个区间为一个区间. 并且保持相对顺序. 对相等的元素.序列1中的在2的前面.
    (1) 用 <
    template <class InputIterator1, class InputIterator2, class OutputIterator>
    OutputIterator merge(InputIterator1 first1, InputIterator1 last1,
                InputIterator2 first2, InputIterator2 last2, OutputIterator result);
    (1) 用comp代替 <
    template <class InputIterator1, class InputIterator2,
                   class OutputIterator, class StrictWeakOrdering>
    OutputIterator merge(InputIterator1 first1, InputIterator1 last1,
                InputIterator2 first2, InputIterator2 last2,
                OutputIterator result, StrictWeakOrdering comp);
    13.2.2.2 inplace_merge
    //对一个序列.如果他的前半部分和后半部分是排过序的. 则这个函数将其变为整体序列有序的.
    //并且排序后的序列保持源序列的顺序.
    (1) 用 <
    template <class BidirectionalIterator>
    inline void inplace_merge(BidirectionalIterator first,
                       BidirectionalIterator middle,
                       BidirectionalIterator last);
    (2) 用 comp 代替 <
    template <class BidirectionalIterator, class StrictWeakOrdering>
    inline void inplace_merge(BidirectionalIterator first,
                       BidirectionalIterator middle,
                       BidirectionalIterator last, StrictWeakOrdering comp);
    使用例子:
    //排序算法 merge sort
    template <class BidirectionalIterator>
    void mergesort(BidirectionalIterator first, BidirectionalIterator last){
            typename iterator_traits<BidirectionalIterator> :: difference_type n
                      = distance(first, last);
           if (n == 0 || n==1) return;
           else {
                   BidirectionalIterator mid = first + n /2;
                   mergesort(first, mid);
                   mergesort(mid, last);
                   inplace_merge(first, mid, last);
            }
    }
    13.2.3 在已序序列(Sorted Ranges) 上执行集合(Set) 相关操作
    13.2.3.1 includes
    //对于两个已序集合. 判断序列2是否是序列1的子集.
    (1)用 <
    template <class InputIterator1, class InputIterator2>
    bool includes(InputIterator1 first1, InputIterator1 last1,
                InputIterator2 first2, InputIterator2 last2);
    (1) 用comp代替 <
    template <class InputIterator1, class InputIterator2, class StrictWeakOrdering>
    bool merge(InputIterator1 first1, InputIterator1 last1,
                InputIterator2 first2, InputIterator2 last2,  StrictWeakOrdering comp);
    13.2.3.2 set_union
    //计算两个已序序列的并集. 把结果保存在另一个序列中.结果序列也有序.
    (1) 用<
    template <class InputIterator1, class InputIterator2, class OutputIterator>
    OutputIterator set_union(InputIterator1 first1, InputIterator1 last1,
                InputIterator2 first2, InputIterator2 last2, OutputIterator result);
    (1) 用comp代替 <
    template <class InputIterator1, class InputIterator2,
                   class OutputIterator, class StrictWeakOrdering>
    OutputIterator set_union(InputIterator1 first1, InputIterator1 last1,
                InputIterator2 first2, InputIterator2 last2,
                OutputIterator result, StrictWeakOrdering comp);
    13.2.3.3 set_intersection
    //计算两个已序序列的交集. 把结果保存在另一个序列中.结果序列也有序.
    (1) 用<
    template <class InputIterator1, class InputIterator2, class OutputIterator>
    OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1,
                InputIterator2 first2, InputIterator2 last2, OutputIterator result);
    (1) 用comp代替 <
    template <class InputIterator1, class InputIterator2,
                   class OutputIterator, class StrictWeakOrdering>
    OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1,
                InputIterator2 first2, InputIterator2 last2,
                OutputIterator result, StrictWeakOrdering comp);
    13.2.3.4 set_difference
    //计算两个已序序列S1和S2. 只在S1而不在S2的元素够成的集合. 把结果保存在另一个序列中.
    (1) 用<
    template <class InputIterator1, class InputIterator2, class OutputIterator>
    OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1,
                InputIterator2 first2, InputIterator2 last2, OutputIterator result);
    (1) 用comp代替 <
    template <class InputIterator1, class InputIterator2,
                   class OutputIterator, class StrictWeakOrdering>
    OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1,
                InputIterator2 first2, InputIterator2 last2,
                OutputIterator result, StrictWeakOrdering comp);
    13.2.3.4 set_symmetric_difference
    //计算两个已序序列的对称差集.即只在一个序列中而不在另一个中的元素够成的集合.
    // 把结果保存在另一个序列中.结果序列也有序.
    (1) 用<
    template <class InputIterator1, class InputIterator2, class OutputIterator> 
    OutputIterator set_symmetric_difference(InputIterator1 first1, InputIterator1 last1,
                InputIterator2 first2, InputIterator2 last2, OutputIterator result);
    (1) 用comp代替 <
    template <class InputIterator1, class InputIterator2,
                   class OutputIterator, class StrictWeakOrdering>
    OutputIterator set_symmetric_difference(InputIterator1 first1, InputIterator1 last1,
                InputIterator2 first2, InputIterator2 last2,
                OutputIterator result, StrictWeakOrdering comp);

    13.3 堆的相关操作 Heap Operations
    堆并不是以顺序排列的序列. 而是以树状的方式表现序列的.其每个节点都小于或等于其父节点.
    13.3.1 make_heap
    // 将一个序列排序成堆方式的.
    (1) 用 <
    template <class RandomAccessIterator>
    void make_heap(RandomAccessIterator first, RandomAccessIterator last);
    (2) 用 comp 代替 <
    template <class RandomAccessIterator, class StrictWeakOrdering comp>
    void make_heap(RandomAccessIterator first,
              RandomAccessIterator last, StrictWeakOrdering comp comp);
    13.3.2 push_heap
    // 前提是序列[first, last-1)是一个有效的堆.则这个函数将一个对
    // 象添加到堆中.所要添加的对象就是序列中最后那个元素*(last-1).
    (1) 用 <
    template <class RandomAccessIterator>
    void push_heap(RandomAccessIterator first, RandomAccessIterator last);
    (2) 用 comp 代替 <
    template <class RandomAccessIterator, class StrictWeakOrdering comp>
    void push_heap(RandomAccessIterator first,
              RandomAccessIterator last, StrictWeakOrdering comp comp);
    13.3.3 pop_heap
    // 前提是序列[first, last)是一个有效的堆.则这个函数将堆中最大的一个对
    // 象从堆中删除.所要删除的对象就是序列中第一个元素*first; 删除后堆将"缩小"为[first, last-1)
    (1) 用 <
    template <class RandomAccessIterator>
    void pop_heap(RandomAccessIterator first, RandomAccessIterator last);
    (2) 用 comp 代替 <
    template <class RandomAccessIterator, class StrictWeakOrdering comp>
    void pop_heap(RandomAccessIterator first,
              RandomAccessIterator last, StrictWeakOrdering comp comp);
    13.3.4 sort_heap
    // 前提是序列[first, last)是一个有效的堆.则这个函数将序列[first, last)变为顺序排列的.
    // 它的算法实际就是一直调用pop_heap()而得到一个有序序列.
    (1) 用 <
    template <class RandomAccessIterator>
    void sort_heap(RandomAccessIterator first, RandomAccessIterator last);
    (2) 用 comp 代替 <
    template <class RandomAccessIterator, class StrictWeakOrdering comp>
    void sort_heap(RandomAccessIterator first,
              RandomAccessIterator last, StrictWeakOrdering comp comp);
    13.3.5 is_heap
    //如果[first, last)是一个堆.返回true . 否则返回false.
    (1) 用 <
    template <class RandomAccessIterator>
    bool is_heap(RandomAccessIterator first, RandomAccessIterator last);
    (2) 用 comp 代替 <
    template <class RandomAccessIterator, class StrictWeakOrdering comp>
    bool is_heap(RandomAccessIterator first,
              RandomAccessIterator last, StrictWeakOrdering comp comp);

    12章

    第12章 "会改变操作对象内容" 的算法

    第12章
    "会改变操作对象内容"的算法
    Basic Mutating Algorithms

    12.1 拷贝某个区间 ( Copying Ranges )
    12.1.1 copy
    // 返回值为目标区间的"last". 即写完后的下一个位置
    template <class InputIterator, class OutputIterator>
    OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result);
    12.1.2 copy_backward
    //和copy不同的是这个函数的第三个参数result指向的目标的尾端而不是开始.
    //并且复制时.是从最后一个元素开始复制. *(result -1) =  *(last - 1) .....
    template<class BidirectionalIterator1, class BidirectionalIterator Iterator2>
    BidirectionalIterator2 copy_backward(BidirectionalIterator1 first,
           BidirectionalIterator1 last , BidirectionalIterator2 result);

    12.2 互换元素 Swapping Elements
    12.2.1 swap
    // 交换两元素. 但是STL中的容器之间交换时不用这个函数.而是定制了自己的swap.(效率);
    template <class Assignable>
    void swap(Assignable& a, Assignable& b);
    12.2.2 iter_swap
    //交换两个迭代器所指对象的值. 但是很少用.因为可以用swap实现相同的功能.
    template <class ForwardIterator1, class ForwardIterator2>
    inline void iter_swap(ForwardIterator a, ForwardIterator2 b>;
    12.2.3 swap_ranges
    //交换两个区间的元素的值. 交换last1-first1 个元素. 返回值为序列2交换过的元素段的下一个位置.
    template <class ForwardIterator1, class ForwardIteator2>
    ForwardIterator2 swap_ranges(ForwardIterator1 first, ForwardIterator last,
                       ForwardIterator2 first2);

    12.3 transform
    //和for_each类似. 区别是for_each用每个元素做为参数调用指定的函数. 但是函数
    //返回的结果并不保存下来. 这个却将每次调用op时的结果保存在result 开始的区间中.
    (1)
    template <class InputIterator, class OutputIteratro, class UnaryFunction>
    OutputIterator transform(InputIteratorfirst, InputIterator last,
                OutputIterator result, UnaryFunction op);
    (2) 区别是:上个版本是每次用序列1的一个元素调用op. 这个版本每次用序列1中相邻的两个元素调用op.
    template <class InputIterator1, class InputIterator2,
             class OutputIterator, class BinaryFunction>
    OutputIterator transform (InputIterator1 first, InputIterator1 last1,
               InputIterator2 first2, OutputIterator result, BinaryFunction binary_op);

    12.4 元素替换 Replacing Elements
    12.4.1 replace
    //将序列中所有值为old_value的元素用new_value替换.
    template <class ForwardIterator, class T>
    void replace (ForwardIterator first, ForwardIterator last,
             const T& old_value, const T& new_value);
    12.4.2 replace_if
    //和replace区别是. replace函数有一个指定的old_value值. 本函数不指定某个值.
    //而是根据一个函数对象返回的值来判断是否替换
    template <class ForwardIterator , class Predicate, class T>
    void replace_if(ForwardIterator first, ForwardIterator last, Predicate pred, const T&new_value);
    12.4.3 replace_copy
    //前边的函数是替换源序列中的元素. 这个不改变源序列. 只是把源序列复制到
    //目标序列时替换old_value
    template<class InputIterator, class OutputIterator, class T>
    OutputIterator replace_copy (InputIterator first, InputIterator last,
        OutputIterator result, const T& old_value, const T& new_value);
    12.4.4 replace_copy_if
    //和replace_copy作用类似. 只是不指定要替换的值.而是指定一个函数.
    template<class InputIterator, class OutputIterator, class Predicate, class T>
    OutputIterator replace_copy_if (InputIterator first, InputIterator last,
        OutputIterator result, Predicate pred, const T& new_value);

    12.5 填充整个区间 (Filling Ranges)
    12.5.1 fill
    //
    template <class ForwardIterator , class T>
    void fill (ForwardIterator first, ForwardIterator last, const T&value);
    12.5.2 fill_n
    //
    template <class OutputIterator , class Size, class T>
    OutputIterator fill_n(OutputIterator first, Size n , const T& value);
    12.5.3 generate
    //对区间的每个元素赋值. *first = gen(); ..... *(last-1) = gen();  // 共调用gen() last-first次
    template <class ForwardIterator, class Generator>
    void generate(ForwardIteator first, ForwardIteator last, Generator gen); //gen为无参函数对象.
    12.5.4 generate_n
    //类似generate .参考一下.
    template <class OutputIteator , class Size, class Generator>
    OutputIterator generate_n (OutputIterator first, Size n , const Generator gen);

    12.6 移除元素 Removing Elements
    12.6.1 remove
    //删除序列中等于value的元素.  //注意.要真正改变序列的大小. 要用erase来配合使用.
    template <class ForwardIteator, class T>
    ForwardIterator remove(ForwardIterator first, ForwardIterator last, cosnt T &vaule);
    12.6.2 remove_if
    //
    template <class ForwardIterator , class Predicate>
    ForwardIterator remove_if(ForwardIteator first, ForwardIterator last, Predicate pred);
    12.6.3 remove_copy
    template <class InputIterator , class OutputIterator , class T>
    OutputIterator remove_copy(InputIterator first, InputIterator last,
                   OutputIteator result, const T& value);
    12.6.4 remove_copy_if
    template <class InputIterator , class OutputIterator , class Predicate>
    OutputIterator remove_copy(InputIterator first, InputIterator last,
                   OutputIteator result, Predicate pred);
    12.6.5 unique
    // 删除序列中相邻且相等的元素
    (1)
    template <class ForwardIterator>
    ForwardIterator unique ( ForwardIterator first, ForwardIterator last);
    (2)//用给定的2参函数对象替换 ==
    template <class ForwardIterator, class BinaryPredicate>
    ForwardIterator unique (ForwardIterator first, ForwardIterator last,
                BinaryPredicate binary_pred);
    12.6.6 unique_copy
    // 复制序列1到序列2, 若序列1中存在相邻且相等的元素.则只复制重复元素中的第一个.
    (1)
    template <class InputIterator, class OutputIterator>
    OutputIterator unique_copy(InputIterator first, InputIterator last, OutputIterator result);
    (2)
    template <class InputIterator, class OutputIterator, class BinaryPredicate>
    OutputIterator unique_copy(InputIterator first, InputIterator last,
                           OutputIterator result, BinaryPredicate binary_pred);

    12.7 排列算法 Permuting Algorithms
    用来改变序列内元素的排列顺序
    12.7.1 reverse
    // 翻转序列
    template<class BidirectionalIterator>
    void reverse(BidirectionalIterator first, BidirectionalIterator last>
    12.7.2 reverse_copy
    //把翻转后的结果存入另一个序列
    template <class BidirectionalIterator, class OutputIterator>
    OutputIteator reverse_copy (BidirectionalIterator first, BidirectionalIterator last,
                    OutputIteator result);
    12.7.3 rotate
    //将[middle, last) 的元素移到序列最前端(first处) . 而把[first, middle) 的元素放到后边.
    //例如将数组的最后三个元素移到开始处.
    template <class ForwardIterator>
    inline void rotate (ForwardIterator first, ForwardIterator middle, ForwardIterator last);
    12.7.4 rotate_copy
    //把移动的结果存入另一序列.
    template<class ForwardIterator, class OutputIterator>
    OutputIteartor rotate_copy(ForwardIterator first, ForwardIterator middle,
            ForwardIterator last, OutputIterator result);
    12.7.5 next_permutation
    //考虑求n个数的全排列的那个题.其中有个解法是通过交换两个位置上的数字得到下一个
    //序列. 这个函数的作用就是求下一个序列的.请参考那个题.
    (1)
    template <class BidirectionalIterator>
    bool next_permutation(BidirectionalIterator first, BidirectionalIterator last);
    (2)
    template <class BidirectionalIterator, class StrictWeakOrdering>
    bool next_permutation(BidirectionalIterator first, BidirectionalIterator last,
                               StrictWeakOrdering comp);
    12.7.6 prev_permutation
    //没看明白呀.

    12.8 分割 Partitions
    12.8.1 partition
    //根据pred函数重新排列序列中的元素. 使满足pred的排在不满足pred的元素之前.
    //函数返回这两者的分界处的迭代器middle.
    //对[first, middle)的元素来说, pred(*iter) 一定返回true. 而[middle, last)的元素,pred(*iter)返回false
    //重排后. 原来的相对顺序并不保持. 这个函数只把他们分为两部分而已.
    template <class BidirectionalIterator, class Predicate>
    BidirectionalIterator partition (BidirectionalIterator first, BidirectionalIterator last,
                       Predicate pred);
    12.8.2 stable_partition
    // 上面的partition函数在重排区间后. 并不保持原来元素的相对顺序.
    // 为了保持原来的相对顺序. 即假如分割前a在b之前,且分割后a b都在[first , middle) 中. 排序后a仍要在b之前.
    template<class ForwardIterator class Predicate>
    ForwardIterator stable_partition(ForwardIterator first, ForwardIterator last,
               Predicate pred);

    12.9 随机重排与抽样 Random Shuffling and Sampling
    12.9.1 random_shuffle
    //对一个可以随机存取的序列洗牌.
    (1) //洗牌调用内部的随机数函数
    template <class RandomAccessIterator >
    void random_shuffle( RandomAccessIterator first,  RandomAccessIterator last);
    (2)// 指定一个随机数函数.
    template <class RandomAccessIterator , class RandomNumberGenerator >
    void random_shuffle( RandomAccessIterator first,
                    RandomAccessIterator last, RandomNumberGenerator & rand);
    12.9.2 random_sample
    //把洗牌后的结果存入另一序列.
    //一共存入n个元素.此处n为两个序列长度的小者.
    (1)//使用缺省的随机数发生器
    template <class InputIterator, class RandomAccessIterator>
    RandomAccessIterator random_sample( InputIterator first, InputIterator last,
                      RandomAccessIterator  outfirst, RandomAccessIterator outlast);
    (2)//指定一个随机数发生器
    template <class InputIterator, class RandomAccessIterator, class RandomNumberGenerator >
    RandomAccessIterator random_sample( InputIterator first, InputIterator last,
                      RandomAccessIterator  outfirst, RandomAccessIterator outlast,
                      RandomNumberGenerator & rand);
    12.9.3 random_sample_n
    //
    (1)
    template<class ForwardIterator , class OutputIterator, class Distance)
    OutputIterator  random_sample_n(ForwardIterator  first, ForwardIterator  last,
                         OutputIterator out, Distance n);
    (2)
    template<class ForwardIterator , class OutputIterator, class Distance,
                          class RandomNumberGenerator )
    OutputIterator  random_sample_n(ForwardIterator  first, ForwardIterator  last,
                         OutputIterator out, Distance n, RandomNumberGenerator &rand);

    12.10 一般化之数值算法 Generalized Numeric Algorithms
    12.10.1 accumulate
    //计算init + 序列中所有元素的和.  //参数多了init 是为了对付空序列
    (1)
    template <class InputIterator, class T>
    T accumulate(InputIterator first, InputIterator last, T init);
    (2) 也可以不是计算序列的和.而用其他双参函数对象代替+
    template <class InputIterator, class T, class BinaryFunction>
    T accumulate(InputIterator first, InputIterator last, T init, BinaryFunction binary_op);
    12.10.2 inner_product
    //计算内积
    (1)
    template <class InputIterator1, class InputIterator2, class T>
    T inner_product(InputIterator1 first1, InputIterator1 last1,
               InputIterator2 first2, T init);
    (2)
    template <class InputIterator1, class InputIterator2, class T,
                       class BinaryFunction1, class BinaryFunction2>
    T inner_product(InputIterator1 first1, InputIterator1 last1,
               InputIterator2 first2, T init, BinaryFunction1 binary_op1,
                BinaryFunction2 binary_op2);
    12.10.3 partial_sum
    12.10.4 adjacent_difference

    11章,愿意看的就看吧

    第11章 "不改变所操作对象" 的算法

    第11章 "不改变操作对象"的算法 Nonmutating Algorithms
    11.1 线性查找 ( linear Search)
    11.1.1 find
    // 值查找
    template <class InputIterator, class EqualityComparable>
    InputIterator find(InputIterator first, InputIterator last,
                     const EqualityComparable &value);
    // 参数为要查找的区间. 和要查找的值.
    11.1.2  find_if
    // 条件查找
    template <class InputIterator , class Predicate>
    InputIterator find_if(InputIterator first, InputIterator last, Predicate pred);
    // 参数为要查找的区间和一个函数对象
    11.1.3  adjacent_find
    //在指定的区间查找相邻且相等的元素. 返回相等的两个元素中前者的iterator
    (1) //普通版本.查找时比较相等性
    template <class ForwardIteraor>
    Forwarditerator adjacent_find(ForwardIterator first, ForwardIterator last);
    (2) //这个版本查看相邻的两个元素是否满足给定的条件(不一定比较相等性).
        //条件由第3个参数指定(一个双参数的函数对象)
    template <class ForwardIterator, class BinaryPredicate>
    ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last,
                  BinaryPredicate Bindary_pred);
    11.1.4 find_first_of
    //在区间[first1, last1) 中查找[first2, last2)中任何一个元素第一次出现的位置
    (1) //一般版本.比较区间1中的某个元素是否在区间2中.若找到第一个在区间2中的元素.返回它的迭代器.
    template <class InputIterator , class ForwardIterator>
    InputIterator find_first_of(InputIterator first1, InputIterator last1,
              ForwardIterator first2, ForwardIterator last2);
    (2) //这个版本不是比较区间1中的某个元素是否在区间2中,而是它是否和区间2中
          //某个元素有指定的关系. 该关系由第5个参数指定(一个双参函数对象)
    template <class InputIterator, class ForwardIterator , class BinaryPredicate>
    InputIterator find_first_of(InputIterator first1, InputIterator last1,
             ForwardIterator first2, ForwardIterator last2, BinaryPredicate comp);

    11.2 子序列匹配 Subsequence Matching
    11.2.1  search
    //查找序列2在序列1中首次出现的位置. 返回迭代器指向匹配的位置的开始处.
    (1)一般版本.
    template <class ForwardIterator1, class ForwardIteraotr2>
    ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1,
           ForwardIterator2 first2, ForwardIterator2 last2);
    (2)这个版本在匹配比较两个序列中元素的相等性时不用== ,而用第五个参数指定的双参函数对象
    template <class ForwardIterator1, class ForwardIteraotr2, class BinaryPredicate>
    ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1,
           ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate binary_pred);
    11.2.2  find_end
    //它和search的作用一样. 区别是 search 查找的是序列2第一次出现的位置. 而
    //find_end查找的序列2最后一次出现的位置. 若查找失败返回序列1的last;
    //函数的用法同search那两个版本..
    11.2.3 search_n
    //查找连续的count个相等的元素. 且这些元素的值都等于value
    (1) // 一般版本
     template <class ForwardIterator , class Integer, class T>
    ForwardIterator search_n (ForwardIteator first, ForwardIterator last,
                       Integer count, const T& value);
    (2) // 不比较值相等. 用指定函数对象替代 ==
    template <class ForwardIterator, class Integer, class  T, class BinaryPredicate>
    ForwardIterator search_n (ForwardIterator first , ForwardIterator last,
                Integer count, const T& value, BinaryPredicate binary_pred);

    11.3 计算元素个数 counting Elements
    11.3.1 count
    //
    (1) //返回值为要统计的元素value的个数
    template <class InputIterator, class EqualityComparable>
    typename iterator_traits<InputIterator>::difference_type
    count (InputIterator first, InputIterator last, const EqualityComparable& value);
    (2) // 统计出的元素的个数由参数 n 返回.
    template <class InputIterator, class EqualityComparable, class Size>
    void
    count (InputIterator first, InputIterator last, const EqualityComparable& value, Size &n);
    11.3.2 count_if
    // 统计符合给定条件的对象的个数
    (1)
    template <class InputIterator, class Predicate>
    typename iterator_traits<InputIterator>::difference_type
    count_if (InputIterator first, InputIterator last, Predicate pred);
    (2)
    template <class InputIterator, class Predicate, class Size>
    void
    count_if (InputIterator first, InputIterator last, Predicate pred, Size n);

    11.4 for_each
    //用序列中的每个元素做参数调用指定的函数对象f
    template <class InputIterator, class UnaryFunction>
    UnaryFuntion  //返回值. 为参数中指定的那个函数对象. 通常不使用该返回值.
    for_each (InputIterator first, InputIterator last, UnaryFunction f);

    11.5 比较两个区间
    11.5.1 equal
    // 比较相等性.从first1 == first2 ..... 若都相等返回true
    (1)一般版本
    template <class InputIterator1, class InputIterator2>
    bool equal (InputIterator1 first1, InputIterator1 last1,
           InputIterator2 first2);
    (2)//比较是不用== , 而是用指定的函数对象代替==
    template <class InputIterator1, class InputIterator2, class BinaryPredicate>
    bool equal (InputIterator1 first1, InputIterator1 last1,
           InputIterator2 first2, BinaryPredicate binary_pred);
    11.5.2  mismatch
    //依次比较两个序列中的元素. 从A[0] B[0]开始比到 A[N] B[N] .
           //函数返回第一对不想等元素的迭代器的pair
    (1)//一般版本
    template<class InputIterator1, class InputIterator2>
    pair<InputIterator1, InputIterator2>
    mismatch(InputIterator1  first1, InputIterator1 last1, InputIteator2 first2);
    (2)//这个版本 不是比较相等性.而是用一个指定的双参函数对象代替==
    template<class InputIterator1, class InputIterator2, class BinaryPredicate>
    pair<InputIterator1, InputIterator2>
    mismatch(InputIterator1  first1, InputIterator1 last1,
                       InputIteator2 first2 ,BinaryPredicate binary_pred);
    11.5.3 lexicographical_compare
    // 按字典式比较两个序列. 即 *first1 < *first2 则序列1<序列2  .
    // 若*first1 == *first2 则比较下两个元素.
    // 若所有序列1中的元素都==序列2中对应的元素.但序列2比序列1长. 则序列1<序列2
    // 最后函数返回 序列1 < 序列2 ? 1 : 0;
    (1) // 一般版本. 比较使用==
    template <class InputIterator1, class InputIterator2>
    bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1,
                    InputIterator2 first2, InputIterator2 last2);
    (2) // 比较时用指定的2参函数对象替代==
    template <class InputIterator1, class InputIterator2, class BinaryPredicate>
    bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1,
                    InputIterator2 first2, InputIterator2 last2, BinaryPredicate comp);
     
    11.6 最大值与最小值
    11.6.1 min
    (1) 比较两对象时使用 <
    template <class LessThanComparable>
    const LessThanComparable& min(const LessThanComparable& a,
                    const LessThanComparable& b);
    (2) 比较两对象时用指定的双参函数对象代替 <
    template <class T, class BinaryPredicate>
    const T& min(const T&a, const T& b, BinaryPredicate comp);
    11.6.2 max
    (1) 比较两对象时使用 < .若两对象相等则返回第一个
    template <class LessThanComparable>
    const LessThanComparable& max(const LessThanComparable& a,
                    const LessThanComparable& b);
    (2) 比较两对象时用指定的双参函数对象代替 <
    template <class T, class BinaryPredicate>
    const T& max(const T&a, const T& b, BinaryPredicate comp);
    11.6.3 min_element
    //返回序列中最小的元素. 若有几个相等的元素都是最小的. 返回第一个. 若序列是空的. 返回last.
    (1) // 用<
    template <class ForwardIterator>
    ForwardIterator min_element(ForwardIterator first, ForwardIterator last);
    (2) // 用指定函数对象替代 <
    template <class ForwardIterator, class BinaryPredicate>
    ForwardIterator min_element(ForwardIterator first, ForwardIterator last, BinaryPredicate comp);
    11.6.4 max_element
    //返回序列中最大的元素. 若有几个相等的元素都是最大的. 返回第一个. 若序列是空的. 返回last.
    (1) // 用<
    template <class ForwardIterator>
    ForwardIterator max_element(ForwardIterator first, ForwardIterator last);
    (2) // 用指定函数对象替代 <
    template <class ForwardIterator, class BinaryPredicate>
    ForwardIterator max_element(ForwardIterator first, ForwardIterator last, BinaryPredicate comp);

    一些stl的知识,备用吧

    第10章 基本组件 Basic Components

    10.1 pair
    pair<T1, T2>

    定义于头文件<utility>

    只有T1 T2都有缺省构造函数时. 该pair才有缺省构造函数.
    只有T1 T2都有赋值操作符= 时. 该pair才有=
    只有T1 T2都有相等比较符==时. 该pair才可以比较相等.
    只有T1 T2都有<操作符时. 该pair才能有<比较

    pair还定义了下边的东西:

    first_type // 第一个元素的类型
    second_type //第二个元素的类型

    pair(const T1&x, const T1& y) //构造器
    pair(const pair&) //拷贝构造
    template<class U1, class U2>
    pair::pair(const pair<U1,U2> &p) //这个构造器允许构造pair时用另一个pair的两个元素分
                                          //别来构造当前pair的两个元素.
    pair& operator=(const pair&)  //赋值

    first //第一个元素
    second //第二个元素

    bool operator==(const pair&, const pair&) //全局的. 比较相等.
    bool operator<(const pair& x,  const pair& y) //全局的. 比较< . 若x.first < y.first 则x<y.
               //或二者的first相等. 还需要比较second部分. second部分小的为小.

    template <class T1, class T2>
    pair <T1,T2> make_pair(const T1& x, const T2& y) // 全局的辅助函数. 用来产生一个pair
                       // 等价于 pair<T1,T2>(x,y) 但更方便一些;


    10.2 Iterator 基本要素

    10.2.1 iterator_traits
    iterator_traits<Iterator>

    template <class Iterator>
    struct iterator_traits{
            typedef typename Iterator::iterator_category iterator_category; //标识迭代器的类型.如InputIterator
            typedef typename Iterator::value_type value_type; //
            typedef typename Iterator::difference_type differrence_type;
            typedef typename Iterator::pointer pointer;
            typedef typename Iterator::reference reference;
    };

    template<class T>
    struct itertor_traits<T*> {         //上个类的一个偏特化
             typedef random_access_iterator_tag iterator_category;
             typedef T value_type;
             typedef ptrdiff_t  difference_type;
             typedef T* pointer;
             typedef T& reference;
    };

    //另一个偏特化. 用于处理const T*
    template<class T>
    struct iterator_traits<const T*> {
             typedef random_access_iterator_tag iterator_category;
             typedef T value_type;
             typedef ptrdiff_t  difference_type;
             typedef const T* pointer;
             typedef const T& reference;
    };


    10.2.3 distance

    它是其他STL算法用的iterator的基本元素. 它计算first与last之间的距离.
    因为迭代器的类型不同(如随即访问迭代器). 计算的时间复杂度也不同.

    10.2.4 advance
    template <class InputIterator, class Distance>
    void advance(Inputiterator& i, Distance n);
    它用来将迭代器前进n步. 它也是因为迭代器类型不同而所需时间复杂度不同.
    另外. 只有当i属于Bidirectional Iterator时(可以做--运算). n才允许为负值.

    10.2.5 Iterator 基类
    iterator<Category, T, Distance, Pointer, Reference>

    它是个空类.只在其中定义了一些typedef.如果你要定义自己的迭代器类,可以从它继承.如:

    class my_forward_iterator : public std::iterator<forward_iterator_tag, double> { ... };

    10.3 allocator
    allocator<T>
    定义于<memory>

    STL 事先定义的容器都有一个缺省的allocator参数. 例如:
    vector <int >
    就等于是:
    vector <int , allocator<int> >


    10.4 内存管理基本元素
    这儿的几个算法.作用于未初始化的存储空间.而不是实际的c++对象上. 主要用于
    协助容器类的实现.

    10.4.1 construct
    template <class T1, class T2>
    void construct(T1* p, const T2& value);
    //p指向分配但并没有初始化的内存. 然后用value做参数调用T1的构造函数初始化该内存.
    在c++中. new一般是先为对象分配内存.同时在该内存上构造对象.
    但有时候用new的预分配内存策略. 把内存分配和对象的构造分开实现.特别是在容器中.
    //这个函数/相当于表达式 new(p) T1(value);
    // c++标准中没有这个函数了.

    10.4.2 destroy
    template <class T> void destroy(T* pointer>

    template <class ForwardIterator>
    void destroy(ForwardIterator first, ForwardIterator last);

    c++中的delele会调用对象的析构函数并释放内存.这个函数将析构和释放两个动作分开.
    和上边那个construct类似. 这个函数只析构.而不释放其内存.
    注意:在c++标准中没有这个函数了.

    10.4.3 uninitialized_copy
    template<class InputIterator, class ForwardIterator>
    ForwardIterator uninitialized_copy (InputIterator first, InputIterator last,
                               ForwardIterator result);
    //这是一个在stl中有用的函数. 定义于<memory>
    其中前两个参数first和last为复制的源的区间.
    第三个参数result则指向的是一段分配好的内存.但尚没有在该内存中构造对象.

    这个函数将源区间内的每个元素的复制品放到这段内存中去.

    但是这个函数有个要注意的地方: 复制时. 要么所有的对象构造成功.要么就一个也不构造.如:
    template <class InputIterator , class ForwardIterator>
    ForwardIterator
    uninitialized_copy (InputIterator first, InputIterator last, ForwardIterator result){
         ForwardIterator cur = result;
         try {
               for ( ; first !=last; ++first, ++cur)
                     construct(& *cur, *first); //调用10.4.1那个函数实现对象的构造
               return cur;
          }
          catch (...) {
               destroy (result, cur);     //析构已经构造的部分. 调用10.4.2那个函数
               throw;
          }
    }

    下面给出一个使用该函数的例子:
    int main(){
        int A1[] = {1,2,3,4,5,6}
        const int N = sizeof(A1) / sizeof(int);
        int *A2 = (int *) malloc ( N * sizeof (int)); //预分配内存
        uninitialized_copy(A1, A1+N, A2); // 事实上这里调用不能成功.
                         // 因为int缺少缺省构造函数.你可以把int封装到Int类中来改写一下.
    }


    10.4.4 uninitialized_full
    template <class ForwardIterator , class T>
    void uninitialized_fill(ForwardIterator first, ForwardIterator last, const T&x);
    //这个函数于10.4.3节的类似.
    // 它在一段预分配了的内存上用对象x填充该段内存. 填充时调用T的拷贝构造函数.
    //同上个函数一样. 它要么fill时填充所有元素.要么一个都不填充. 请参考前面的例子.
    定义于<memory>

    使用如:
    const int SZ = 100;
    Int *A = (Int*) malloc(N *sizeof(Int)); //预分配存储空间.
    Int val(3); //构造一个用来填充的对象.
    uninitialized_fill(A, A+N, val);

    10.4.5 uninitialized_fill_n
    template <class ForwardIterator , class Size, class T>
    ForwardIterator
    uninitialized_fill_n(ForwardIterator first, Size n, const T& x);

    //它的作用和原理与10.4.4中的类似.只是填充n个而已.下边给出一个使用该函数的例子:
    const int SZ = 100;
    Int *A = (Int*) malloc(N *sizeof(Int)); //预分配存储空间.
    Int val(3); //构造一个用来填充的对象.
    uninitialized_fill(A, N, val);


    10.5 临时缓冲区 (Temporary Buffers)

    10.5.1 get_temporary_buffer
    template <class T>
    pair<T*, ptrdiff_t> get_temporary_buffer(ptrdiff_t len);
    用来分配临时空间. 例如:
    get_temporary_buffer<T>(len)会返回一个缓冲区,此区足以容纳len个T对象.
    它声明于 <memory>

    10.2 return_temporary_buffer
    template <class T> void return_temporary_buffer(T* p);
    用来归还以get_temporary_buffer分配的内存.
    声明于 <memory>

    使用例子:
    int main(){
       pair<int*, ptrdiff_t > p = get_temporary_buffer<int>(10000);
       int * buf = p.first;
       ptrdiff_t N = p.second;
       ............
       return_temporary_buffer(buf);
    }

    03 February

    dynamic program on ZOJ(一定要啃下dp~~><~~)

    Vol I
    1013 by javaman
    1022 by javaman
    1025 by javaman
    1027 by javaman
    1074 by javaman
    1076 by javaman
    1093 by javaman
    1094 by javaman
    Vol II
    1100 by javaman
    1107 by javaman
    1108 by javaman
    1149 by javaman
    1183 by javaman
    1196 by javaman
    Vol III
    1200 by javaman
    1206 by javaman
    1227 by javaman
    1234 by javaman
    1245 by javaman
    1249 by javaman
    1250 by javaman
    1276 by javaman
    Vol IV
    1303 by javaman
    1346 by javaman
    1353 by javaman
    1366 by javaman
    1387 by javaman
    Vol V
    1424 by SgHao
    1425 by javaman
    1428 by javaman
    1446 by javaman
    1448 by SgHao
    1449 by javaman
    1454 by javaman
    1459 by javaman
    1462 by javaman
    1463 by javaman
    1470 by javaman
    1475 by javaman
    1483 by javaman
    1484 by javaman
    1499 by javaman
    Vol VI
    1503 by pandahyx
    1512 by javaman
    1515 by javaman
    1520 by javaman
    1524 by javaman
    1539 by javaman
    1554 by SgHao
    1563 by javaman
    1579 by javaman
    Vol VII
    1602 by javaman
    1607 by javaman
    1611 by javaman
    1629 by javaman
    1638 by javaman
    1642 by javaman
    1651 by javaman
    1666 by Vegetable Bird
    Vol VIII
    1713 by javaman
    1717 by javaman
    1731 by javaman
    1733 by javaman
    1738 by javaman
    1743 by javaman
    1756 by javaman
    1757 by javaman
    1787 by javaman
    1792 by javaman
    Vol IX
    1800 by SgHao
    1819 by javaman
    1853 by javaman
    1877 by javaman
    1880 by javaman
    1893 by javaman
    Vol X
    1913 by javaman
    1918 by javaman
    1925 by javaman
    1953 by javaman
    1985 by javaman
    1986 by javaman
    1988 by javaman
    1991 by javaman
    1995 by SgHao
    Vol XI
    2002 by javaman
    2014 by javaman
    2025 by javaman
    2042 by javaman
    2058 by javaman
    2059 by javaman
    2067 by javaman
    2068 by javaman
    2069 by javaman
    2081 by javaman
    2096 by javaman
    Vol XII
    2127 by javaman
    2136 by javaman
    2142 by SgHao
    2144 by javaman
    2156 by javaman
    2180 by javaman
    2189 by javaman
    Vol XIII
    2202 by javaman
    2206 by javaman
    2224 by javaman
    2242 by javaman
    2244 by javaman
    2254 by javaman
    2255 by Vegetable Bird
    2264 by javaman
    2271 by javaman
    2278 by javaman
    2280 by javaman
    2281 by javaman
    2283 by javaman
    2284 by javaman
    2297 by javaman
    Vol XIV
    2319 by javaman
    2337 by javaman
    2338 by javaman
    2349 by Vegetable Bird
    2353 by Vegetable Bird
    2354 by javaman
    2366 by javaman
    2372 by pandahyx
    2397 by javaman
    Vol XV
    2401 by javaman
    2402 by javaman
    2414 by Vegetable Bird
    2422 by jueyey
    2424 by javaman
    2432 by javaman

    求最大全1子矩阵o(n^2)的算法

    求最大全1子矩阵是Candy-Box的子问题。Candy-Box问题有o(n^2)的算法。
    Candy-Box
    最常用的描述形式为:一个被分为 n*m 个格子的糖果盒,第 i 行第 j 列位置的格子里
    面有 a [ i ][ j ] 颗糖。本来 Peter 打算送这盒糖果给某 PPMM 的,但是就在要送出
    糖果盒的前一天晚上,一只极其可恶的老鼠夜袭糖果盒,有部分格子被洗劫并且穿了洞。
    Peter 必须尽快从这个糖果盒里面切割出一个矩形糖果盒,新的糖果盒不能有洞,并且
    Peter 希望保留在新糖果盒内的糖的总数尽量多。
    伪代码:
    1.      初始化 maxV = 0
    2.      sum[m*n] = 0,  left[m] = 1,  right[m] = n,  height[m] = 0
    3.      for i=1 to m
    4.              leftmost = 1,  cursum = 0
    5.              for j=1 to n
    6.                      cursum += A[i, j]
    7.                      sum[i, j] = sum[i-1, j] + cursum
    8.                      if A[i, j] = 0
    9.                              height[j] = 0
    10.                             leftmost = j+1
    11.                     else
    12.                             height[j] ++
    13.                     left[j] = max{ leftmost, left[j] }
    14.             rigthmost = m
    15.             for j=m to 1
    16.                     if height[j] = 0
    17.                             rightmost = j-1
    18.                             continue
    19.                     right[j] = min{rightmost, right[j]}
    20.                     maxV =max
    21.     {sum[i,right[j]]+sum[i-height[j],left[j]-1]-sum[i-high[j],
                                              right[j]]-sum[left[j]-1], maxV}
    22.     return maxV

    可能会用到的数学知识与最短路问题

    1.费马小定理:a^p mod p=a (p为素数,且a不是p的倍数)

    2.数n的约数个数:
    n分解因数为p1^s1*p2^s2*……pm^sm
    则约数个数为(s1+1)*(s2+1)*……*(sm+1)

    3.Fibonacci数通项公式:Fn=round((1+√5)/2)^n/√5

    4.Catalan数通项公式:Cn=C(2n-2,n-1)/n
    递归式:Cn=∑Ci*C(n-i) (i=1..n-1,C1=C2=1)

    5.第二类Stirling数:S(n,k)表示n个元素的集合拆分成k部分的数
    S(n,k)=S(n-1,k-1)+k*S(n-1,k)

    6.整数分拆:P(n,k)-整数n分成k部分的数
    P(n,k)=P(n-1,k-1)+P(n-k,k)

    7.方程x1+x2+……+xk=n (xi>=0)的解的个数:C(n+k-1,k-1)
    方程x1+x2+……+xk=n (xi>0)的解的个数:C(n-1,k-1)

    8.n以内素数的大约个数:n/ln(n)

    最短路问题研究:

    map[i,j]表示i,j的权,为了计算方便,map[i,i]=0,边(i,j)不存在map[i,j]=∞
    dis[i,j]表示i到j的最短路
    n-点数,e-边数,s-SSSP中的源点

    Dijkstra:
    置s检查标志
    for n-1
    begin
      找到一个边(i,j),使得i已检查,j未检查,且map[i,j]最小,dis[s,j]:=dis[s,i]+map[i,j],置j检查标志
      if dis[s,j]+map[j,k]<dis[s,k] then dis[s,k]:=dis[s,j]+map[j,k]
    end
    SSSP,没有负权,O((n+e)*log n)

    Bellman-Ford:
    repeat
      change:=false;
      for 所有边[i,j]
        if dis[s,i]+map[i,j]<dis[s,j] then dis[s,j]:=dis[s,i]+map[i,j],change:=true;
    until not change;
    SSSP,正负权,O(ne)

    Floyd-Warshall:
    dis:=map
    for k:=1 to n do
      for i:=1 to n do
        for j:=1 to n do
          if s[i,k]+s[k,j]<s[i,j] then s[i,j]:=s[i,k]+s[k,j]
    APSP,没有负权,O(n^3)

    02 February

    一些花的名称

    azalea 杜鹃花
    begonia 秋海棠
    Brazil 巴西木
    cactus 仙人掌
    camellia 山茶花
    carnation 麝香石竹(康乃馨)
    Chinese enkianthus 灯笼花
    Chinese flowering crab-apple 海棠花
    chrysanthemum 菊花
    dahlia 大丽花
    daisy 雏菊
    datura 曼陀罗
    epiphyllum 昙花
    fringed iris 蝴蝶花
    fuchsia 倒挂金钟
    gardenia 栀子
    India canna 美人蕉
    jasmine 茉莉
    lilac 丁香
    lily 百合
    mangnolia 木兰花
    mangnolia 玉兰花
    morning glory 牵牛(喇叭花)
    narcissus 水仙花
    oleander 夹竹桃
    orchid 兰花
    pansy 三色堇
    peony 牡丹
    peony 芍药
    phalaenopsis 蝶兰
    rose 玫瑰
    rose 月季
    setose asparagus 文竹
    touch-me-not (balsam) 凤仙花
    tulip 郁金香
    violet, stock violet 紫罗兰
    water hyacinth 凤眼兰

    雅思英语派对词(Paired words)

    heart and soul 一心一意 ;

    ebb and flow 人世盛衰

    cloak and dagger 秘密的行动

    law and order 秩序

    move heaven and earth 不遗余力

    part and parcel 不可或缺

    pomp and ceremony 盛典

    rain or shine 不论如何

    rank and file 大众

    (fight) tooth and nail 全力以赴

    treat or trick 不给甜头就有好看的

    注:万圣节里小孩挨家挨户的讨cookie,say "treat or trick"

    facts and figures 确凿的事实

    hugs and kisses 热情欢迎

    ins and outs 来龙去脉

    odds and ends 零零星星

    堆物博弈

    堆物博弈
    【古老的堆物博奕】
        有一种很有意思的游戏不知道你玩儿过没有,就是有物体若干堆,可以是火柴棍或是
    围棋子等等均可。两个人轮流从堆中取物体若干,规定最后取光物体者取胜。这是我国民
    间很古老的一个游戏,别看这游戏极其简单,却蕴含着深刻的数学原理。下面我们来分析
    一下要如何才能够取胜。
    (一)巴什博奕(Bash Game):只有一堆n个物品,两个人轮流从这堆物品中取物,规定
    每次至少取一个,最多取m个。最后取光者得胜。
        显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后
    取者都能够一次拿走剩余的物品,后者取胜。因此我们发现了如何取胜的法则:如果n=(
    m+1)r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走k(≤m
    )个,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的取法,那
    么先取者肯定获胜。总之,要保持给对手留下(m+1)的倍数,就能最后获胜。
        这个游戏还可以有一种变相的玩法:两个人轮流报数,每次至少报一个,最多报十个
    ,谁能报到100者胜。
    (二)威佐夫博奕(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时
    从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。
        这种情况下是颇为复杂的。我们用(ak,bk)(ak ≤ bk ,k=0,1,2,...,n)表示两
    堆物品的数量并称其为局势,如果甲面对(0,0),那么甲已经输了,这种局势我们称为
    奇异局势。前几个奇异局势是:(0,0)、(1,2)、(3,5)、(4,7)、(6,10)、
    (8,13)、(9,15)、(11,18)、(12,20)。
        可以看出,a0=b0=0,ak是未在前面出现过的最小自然数,而 bk= ak + k,奇异局势有如
    下三条性质:
        1。任何自然数都包含在一个且仅有一个奇异局势中。
        由于ak是未在前面出现过的最小自然数,所以有ak > ak-1 ,而 bk= ak + k > ak-1
     + k-1 = bk-1 > ak-1 。所以性质1。成立。
        2。任意操作都可将奇异局势变为非奇异局势。
        事实上,若只改变奇异局势(ak,bk)的某一个分量,那么另一个分量不可能在其他
    奇异局势中,所以必然是非奇异局势。如果使(ak,bk)的两个分量同时减少,则由于其
    差不变,且不可能是其他奇异局势的差,因此也是非奇异局势。
        3。采用适当的方法,可以将非奇异局势变为奇异局势。
        假设面对的局势是(a,b),若 b = a,则同时从两堆中取走 a 个物体,就变为了奇
    异局势(0,0);如果a = ak ,b > bk,那么,取走b  - bk个物体,即变为奇异局势;
    如果 a = ak ,  b < bk ,则同时从两堆中拿走 ak - ab - ak个物体,变为奇异局势( a
    b - ak , ab - ak+ b - ak);如果a > ak ,b= ak + k,则从第一堆中拿走多余的数量a
     - ak 即可;如果a < ak ,b= ak + k,分两种情况,第一种,a=aj (j < k),从第二堆
    里面拿走 b - bj 即可;第二种,a=bj (j < k),从第二堆里面拿走 b - aj 即可。
        从如上性质可知,两个人如果都采用正确操作,那么面对非奇异局势,先拿者必胜;
    反之,则后拿者取胜。
        那么任给一个局势(a,b),怎样判断它是不是奇异局势呢?我们有如下公式:
                                 ak =[k(1+√5)/2],bk= ak + k  (k=0,1,2,...,
    n 方括号表示取整函数)
    奇妙的是其中出现了黄金分割数(1+√5)/2 = 1。618...,因此,由ak,bk组成的矩形近似
    为黄金矩形,由于2/(1+√5)=(√5-1)/2,可以先求出j=[a(√5-1)/2],若a=[j(1
    +√5)/2],那么a = aj,bj = aj + j,若不等于,那么a = aj+1,bj+1 = aj+1 + j +
    1,若都不是,那么就不是奇异局势。然后再按照上述法则进行,一定会遇到奇异局势。
    (三)尼姆博奕(Nimm Game):有三堆各若干个物品,两个人轮流从某一堆取任意多的物
    品,规定每次至少取一个,多者不限,最后取光者得胜。
        这种情况最有意思,它与二进制有密切关系,我们用(a,b,c)表示某种局势,首先
    (0,0,0)显然是奇异局势,无论谁面对奇异局势,都必然失败。第二种奇异局势是(0
    ,n,n),只要与对手拿走一样多的物品,最后都将导致(0,0,0)。仔细分析一下,(
    1,2,3)也是奇异局势,无论对手如何拿,接下来都可以变为(0,n,n)的情形。
        计算机算法里面有一种叫做按位模2加,也叫做异或的运算,我们用符号(+)表示这
    种运算,先看(1,2,3)的按位模2加的结果:
    1 =二进制01
    2 =二进制10
    3 =二进制11 (+)
    ———————
    0 =二进制00 (注意不进位)
        对于奇异局势(0,n,n)也一样,结果也是0。
        任何奇异局势(a,b,c)都有a(+)b(+)c =0。
    如果我们面对的是一个非奇异局势(a,b,c),要如何变为奇异局势呢?假设 a < b <
    c,我们只要将 c 变为 a(+)b,即可,因为有如下的运算结果: a(+)b(+)(a(+)b)=(
    a(+)a)(+)(b(+)b)=0(+)0=0。要将c 变为a(+)b,只要从 c中减去 c-(a(+)
    b)即可。
        例1。(14,21,39),14(+)21=27,39-27=12,所以从39中拿走12个物体即可达到
    奇异局势(14,21,27)。
        例2。(55,81,121),55(+)81=102,121-102=19,所以从121中拿走19个物品就
    形成了奇异局势(55,81,102)。
        例3。(29,45,58),29(+)45=48,58-48=10,从58中拿走10个,变为(29,45,
    48)。
        例4。我们来实际进行一盘比赛看看:
             甲:(7,8,9)->(1,8,9)奇异局势
             乙:(1,8,9)->(1,8,4)
             甲:(1,8,4)->(1,5,4)奇异局势
             乙:(1,5,4)->(1,4,4)
             甲:(1,4,4)->(0,4,4)奇异局势
             乙:(0,4,4)->(0,4,2)
             甲:(0.4,2)->(0,2,2)奇异局势
             乙:(0,2,2)->(0,2,1)
             甲:(0,2,1)->(0,1,1)奇异局势
             乙:(0,1,1)->(0,1,0)
             甲:(0,1,0)->(0,0,0)奇异局势
             甲胜。