1.从应用到源码理解STL反向迭代器
2.cè¯è¨ç¼ç¨
3.2. C++基础:Trivial/Standard layout/POD
4.STL 源码剖析:sort
5.做java程序员都要看哪些书
从应用到源码理解STL反向迭代器
在实际应用中,码解我们可能需要从序列容器(如vector)的码解尾部移除不满足特定条件的部分元素。这通常涉及从尾部开始的码解迭代操作。然而,码解容器成员函数erase不接受反向迭代器作为参数。码解因此,码解urkeji 源码我们需要将反向迭代器转换为普通迭代器。码解先来看看STL迭代器的码解分类和转换关系。
STL迭代器主要分为用途迭代器,码解它们之间存在转换关系,码解但不是码解所有迭代器类型都可以相互转换。转换关系需通过迭代器的码解构造函数定义,有些可以直接转换,码解有些则需调用特定方法。码解
特别地,码解反向迭代器到普通迭代器的转换可以通过调用反向迭代器的base()方法实现。但初版代码存在缺陷,未能按预期将元素正确删除。通过跟踪代码并参考cpp reference文档,我们发现base()方法返回的迭代器实际上比预期位置靠后一个元素。
为了修正这个问题,我们需要将通过base()方法得到的迭代器向前移动一个位置,以正确指向第一个符合移除条件的元素。修改代码后,可以确保元素按约定进行删除。前段源码
在一般场景下,迭代器的使用主要涉及遍历访问和遍历修改元素值。对于删除和插入操作,可能需要将反向迭代器转换为普通迭代器。STL容器的erase和insert成员函数仅接受普通迭代器作为参数。
在执行插入操作时,直接使用base()将反向迭代器转换为普通迭代器,并传入insert函数,其语义是一致的。而在删除操作中,直接使用base()转换后的迭代器可能无法正确执行,因为反向迭代器和普通迭代器在终止位置上的处理存在差异。为了修正此问题,需要手动调整,确保迭代器的有效性。
对于反向迭代器,通过正确的反向迭代操作得到的迭代器,在不等于rend()返回的迭代器时,都是指向有效值的。因此,除了rend().base()-1操作可能导致问题外,其他转换通常都是安全的。
讨论end()迭代器的前移操作时,需要考虑是源码归林否能够安全地访问容器的尾端元素。对于随机访问迭代器,如vector容器,end()返回的迭代器可以进行前移操作,但需确保移动操作的合法性。对于双向访问迭代器如list,同样可以进行前移操作以访问尾端元素。
结束讨论前,还需要确认iterator的-1操作是否对指向容器尾端元素的迭代器有效。在vector容器中,通过end成员函数返回的迭代器通过-1操作可以得到指向尾端元素的普通迭代器。对于list容器,其end成员函数返回的迭代器也支持前移操作。
总结来说,支持向前移动操作的迭代器访问容器内元素的容器,其end成员函数通过前移操作可以得到一个指向容器尾端元素的迭代器。这符合双向迭代器的设定语义。通过反向迭代器的原理,我们也能验证end()函数返回的迭代器可以进行反向移动。
cè¯è¨ç¼ç¨
ç¨åºåãæ¨èC++ å¾ä¹¦ä¸äººè°
主æ人ï¼çèï¼éæï¼ï¼ãç¨åºåãæå¿ç¼è¾ï¼C-Viewæå
å 宾ï¼å岩ï¼æ¢¦éï¼,èæ³å ¬å¸æä¸è®¾å¤äºä¸é¨åºç¨å¼åå¤ä»»èï¼C-Viewæåãä¸ä¾¯æ·å çåè¯ãC++ Standard Libraryãä¸ä¹¦
éå°¹ï¼æ¶éï¼ï¼ä¸æµ·å¤©å®å ¬å¸CTOï¼å¨ãç¨åºåãè¿è½½æâèªç±ä¸ç¹è£çå½åº¦âç³»åæç«
éæï¼âå¦C++ç¨åªæ¬ä¹¦å ¥é¨âï¼è¿æ¯è¢«é®å¾æå¤çä¸ä¸ªé®é¢ãä½æ¯åªä¸æ¬ä¹¦æ¯æ好çå ¥é¨ä¹¦ï¼ä¼¼ä¹å¾é¾æ¾å°çæ¡ããC++ Primerã太åï¼ãEffective C++ã对读è è¦æ±æ¯è¾é«ï¼ãEssential C++ãå常常被æ¹è¯ä¸ºâå¤ªæµ âã
å ¶å®è¯´ç©¿äºï¼no silver bulletãæ³ä»ä¸æ¬ä¹¦å¦ä¼C++ï¼é£æ¯ä¸å¯è½çãææåé®æå¦ä½å¦C++ï¼æä¼å»ºè®®ä»å å»æ¾æ¬æ°æ®ç»æ书ï¼æéé¢çä¹ é¢å ¨é¨ç¨C++åä¸éï¼ç¶ååå»çãEffective C++ããmyanç»å¸¸è¯´âè¦å¨å¦ä¹ åæå »æå¥½ä¹ æ¯âï¼æ对æ¤é¢ä¸ä»¥ä¸ºç¶ã
个人认为ï¼ãEssential C++ãéåä½ææï¼ãC++ Primerãéåä½åè书ï¼ãEffective C++ãéåä½è¯¾å¤è¯»ç©ã
æ¶éï¼å¾åæå½åä¹°äºãC++ Primerããå 为ä»æ个人è§åº¦æ¥çï¼å®çåè½æç¨åºæ¬æ¯åãThe C++ Programming Languageãéåãå½ç¶å¯¹äºå ¥é¨æ¥è¯´ï¼å®è¿æ¯å¾ä¸éçãä½æ¯ãC++ Primerã太åï¼ä¸æ¥å¯¼è´ç书æå ¶ä¸æ¹ä¾¿ï¼äºæ¥ç³»ç»å¦ä¹ éè¦è±æ¯è¾é¿çæ¶é´ã对äºç®åè¿ä¸ªè¶æ¥è¶å¿«é¤åçæ¶ä»£æ¥è¯´ï¼çç¡®æå¾å¤ä¸éåçå°æ¹ï¼ä¸è¿å¯ä»¥ä½ä¸ºåå¦è çåè书ãç°å¨æ以ä¸åK3 CPUç代价æå®åç»äºå«äººï¼å¸ææé£ä½åäºè½å¤ä»ä¸å¾å°ä¸äºçå¤ã
å¦æå·²ç»å ·å¤äºCåºç¡ï¼æ建议çå½å ç书ï¼ä¾å¦é±è½çã C++大å¦æç¨ï¼ç¬¬äºçï¼ ãã(å¦æ没æCçåºç¡è¿æ¯çè°æµ©å¼ºçCè¯è¨)ãè¿æ¬ä¹¦å¯¹C讲å¾è¿ç®æ¯è¾æ¸ æ°ï¼æå¾å¤ä¹ é¢å¼å¾ä¸åï¼ç¹å«æ¯æåçstructåunion两个é¨åãå ¶ä¸çä¸äºç®æ³æ¯è¾ææ²åç¹çï¼æ¯å¦æ åé¾è¡¨çéåç®æ³ï¼ï¼è¯»è å¯ä»¥å°è¯ä¿®æ¹è¿äºä¾åï¼ä½ä¸ºæå对Cè¯è¨çä¸äºæ»ç»æµè¯ã
梦éï¼è¿ä¸ªé®é¢è®©ææ³èµ·åäºå¹´åçæ å½¢ãä»å¤©å¯¹äºC++æä¸ç¹è®¤è¯ç人ï¼å¤åæ¯ä»é£å å¹´å°±å¼å§å¦C++äºãé£æ¶æ ¹æ¬æ²¡æåçè§å¿µãä»ä¹¦åºéæ¾ä¸æ¬C++书ï¼å¦æççè¿ç®æç½ï¼å°±ä¹°ä¸æ¥ãæè®°å¾é£æ¶åå®å»¶é¿ãå¼ å½éã麦ä¸å¡ææç书é½åå°å¾é«çèµèªãæ个人ææ©çä¸æ¬C++书æ¯Greg Perryçä¸æ¬ä¹¦ï¼ä»å¤©æ³èµ·æ¥ï¼å ¶å®æ¯ä¸æ¬æçC++æå·çCè¯è¨æç¨ã对æä½ç¨æ大çä¸æ¬ä¹¦æ¯å½é²ç§æåºç社åºççä¸æ¬ä¹¦ï¼ä¹¦åè®°ä¸å¾äºï¼ä½è å«æ¯èè¬Â·å¸è±åã
éæï¼è¿è®°å¾ä»¥åæ¾æ¹è¯è¿ä¸æ¬C++书ï¼æ¯åèªåºçï¼æ´æ¬ä¹¦å°±æ²¡æåºç°è¿classå ³é®åãé£æ¬ä¹¦ï¼è¯´ç©¿äºå ¶å®åªæ¯ä»ç»äºCè¯è¨åiostreamåºçç¨æ³ï¼æ ¹æ¬ä¸è½ç®C++ãèå½æ¶æ常常æ¨èçä¸æ¬ä¹¦æ¯çµåç§æ大å¦å¼ æ¾æ¢ èå¸çC++æç¨ãé£æ¬ä¹¦ï¼ç´å°ä»å¤©æ¥çä¹æ²¡æ太大çé®é¢ï¼å¯ä¸ç缺æ¾å°±æ¯ç±äºå¹´ä»£ä¹ è¿ï¼è®¸å¤ä¸è¥¿å·²ç»è¿æ¶äºãè对äºä¸æ¬ææ¯ä¹¦ç±æ¥è¯´ï¼âè¿æ¶âæ¯æä¸å¯æ¥åçã
æ»ä½æ¥è¯´ï¼é£æ¶ä½¿ç¨C++ç人çæ¯å¨âç²äººæ¸è±¡âãä¸è¿è¿ä¹æ好å¤ï¼å°±æ¯å¯¹C++çå¾å¤ç»èè½ææ¸ æ¥ï¼ä»¥åçå°ç»å ¸å¥½ä¹¦æ¶æ¯è¾å®¹æç解ï¼å½ç¶åå¤å°±æ¯æ¦å¿µä¸æ¸ ï¼çè³é½ä¸ç¥éC++åVisual C++ãBorland C++å°åºæä»ä¹ä¸ä¸æ ·ã
梦éï¼æ´ä¸ªå¹´ä»£ï¼å ¶å®å¤§é¨å人对äºC++ç认è¯é½ä¼¼æ¯èéãä¸å¼å§æ¯çåäºBorland C++ï¼åæ¥æ¯çåäºVisual C++åMFCãæ以ä¸è¬æ¥è¯´ï¼æçBCåVCæå·ç书åå¾å¾å¥½ï¼äººä»¬è§å¾è¿å°±æ¯C++ãèææ¯è¾å¹¸è¿ï¼å¸è±åçé£æ¬ä¹¦è½ç¶ä»ç°å¨çç¼å æ¥çè°ä¸ä¸é«è¶ ï¼ä½åºæ¬è·¯åæ¯å¯¹çãå¯è½æ¯å 为å书æ¯ç»UNIXç¨åºåçå¹è®ææï¼æ以没æ让æä¸å¼å§å°±å½¢æâC++ == VC++âç认è¯ã
å ¶å®ä¸ç´å°å¹´ï¼æ们é£éæ计ç®æºçé½æ¯å¯Borland C++马é¦æ¯ç»çï¼å°äºVC 4.0åºæ¥ï¼ä¸ä¸åæ ¼å±å ¨åäºãå¹´VC5æ¨åºä¹åï¼ä¹¦åºéMFC书éºå¤©çå°ï¼å¦MFCç人ï¼å¤´æ¬å¾é½æ¯å«äººé«ä¸äºãä¸è¿ç°å¨çæ¥ï¼é£æ¶å大é¨åçMFC书é½æ¯ä¸æµè´§è²ãææ¾ç»æä¸æ®µæ¶é´è®¤ä¸ºï¼é£ä¸æ¹ç¨åºåä¸é´æä¸å°è¢«è¯¯å¯¼äºãæ ¹æ¬åå å°±æ¯ç¸å¯¹çå°éã
éæï¼æè§å¾ä¸æ¬ä¹¦çä»·å¼æ两æ¹é¢ï¼ç¬¬ä¸ï¼æç»ä½ å®ç¨çææ¯ï¼ç¬¬äºï¼ä¿ä½¿ä½ å»æèã对äºä¸æ¬ä»ç»VCï¼æè 说MFCï¼ä½¿ç¨æ¹æ³ç书ï¼ææ ¹æ¬ä¸å¸æå®è½ä¿ä½¿ææä»ä¹æèï¼æ以æå°±ä¸å®è¦æ±å®å¨ææ¯ä¸ç²¾çæ±ç²¾å®ç¾æ çãæåå¼å§ç¨VCçæ¶åï¼ä¹°ç第ä¸æ¬ä¹¦å°±æ¯æ½ç±æ°èå¸ç¿»è¯çãVCææ¯å å¹ãï¼ç¬¬åçï¼ï¼æ²¡æåå°é£äºâä¸æµè´§è²âç误导ï¼åºè¯¥è¯´æ¯å¾å¹¸è¿çã
梦éï¼å¹´æºæ¢°å·¥ä¸åºç社å¼å§åºçâ计ç®æºç§å¦ä¸ä¹¦âï¼å ¶ä¸çãThinking in C++ã第ä¸çåå°äºå¹¿æ³ç欢è¿ãå ¶å®æä¸ç´ä¸è®¤ä¸ºè¿æ¬ä¹¦å¾åºè²ï¼è½ç¶æ¿è¿ä¸æ¬¡å¤§å¥ãç¶èæ们é½å¾æ¿è®¤ï¼è¿æ¬ä¹¦å¨C++书ç±é¢åé第ä¸æ¬¡å»ºç«äºåçè§å¿µï¼å¾å¤åå¦è å¼å§ç¥éï¼ä¸æ¯é便买åªä¸æ¬é½ä¸æ ·çãåå¾åå°±æ¯å¹´çã æ·±å ¥æµ åºMFCï¼ç¬¬äºçï¼ ã第äºçï¼ä»¥å侯å çå¨ãç¨åºåãä¸å表çé£ä¸ç¯ãC++/OOP大系ãï¼å ä¸æ´ä¸ªå¤§ç¯å¢çååï¼åçè§å¿µæ·±å ¥äººå¿ï¼C++书ç±å¸åºç»äºå¼å§éæ¸ä¸ä¸çåæ¥ã
åæ³å¾äºï¼æçæè§æ¯ï¼é£ä¸ªéè¦ææå ¢å ¢éæ©å ¥é¨ä¹¦çæ¶ä»£å·²ç»è¿å»ï¼ä»å¤©çC++åå¦è ï¼å¤§å¯ä»¥æ¾å¿å°ä¹°å£ç¢å¥½ãèªå·±è¯»èµ·æ¥æ路顺ç ç书ï¼å ¥é¨ä¸åæ¯å¤ªå¤§çé®é¢ãè¿æä¸äºç¨åºåå·²ç»å¦äºå å¹´C++ï¼ä½çå°ä»å¤©åºççä¸äºæ°ä¹¦ï¼æè§æ¯è¾éçï¼è¿ä¹ä¸æ¯ä»ä¹é®é¢ã侯å çç»å¸¸è¯´âå¡èµ°è¿å¿ çä¸è¶³è¿¹âï¼æè°â走弯路âï¼æªå¿ ä¸æ¯ä¸ä»¶å¥½äºã
è³äºå ·ä½çæ¨è表ï¼å°±ä¸å¥½ä¸æ¦è论äºãæ»ä¹å¨æçå°è±¡éï¼ãEssential C++ãããC++ Primerããé±è½ææçC++æç¨ï¼é½ä¸éãçè³æ人ä¸ä¸æ¥å°±çBjarne StroustrupçãThe C++ Programming Languageãï¼åªè¦ä»å欢ï¼ä¹æ²¡ä»ä¹ä¸å¯ä»¥ã
éæï¼æåæä½ çè§ç¹ãä¸ç®¡æä¹è¯´ï¼ç¼ç¨æ¯é¨å®è·µæ§é常强çå¦é®ãè¦æ³å¯¹C++对象模åææ·±å ¥çäºè§£ï¼æ好çåæ³å°±æ¯åä¸ä¸²ç¨åºå»çç»æï¼è¦æ³å¦ä¼OOPï¼ä¹åªè½ä»é¡¹ç®ä¸å¦ã对äºåå¦è ï¼æ好çå¦ä¹ æ¹æ³å°±æ¯ä¸åå°åç¨åºï¼åçæ£æç¨çç¨åºï¼åå°æé®é¢çæ¶åå°±å»æ¥ä¹¦ï¼äºæ¯èªç¶å°±ä¼ç¥éåªæ¬ä¹¦å¥½åªæ¬ä¹¦ä¸å¥½ãä¸è¿æ们çæè²å¶åº¦è½ä¸è½è®©å¤§å¦éçå¦ç们æè¿æ ·çå¦ä¹ æºä¼ï¼æ表示æçã
以æçç»éªï¼å¦C++æ两个é¨æ§ï¼å ¥é¨å使ç¨ãå®å ¨çä¸æC++ï¼è¿æ¯ä¸ä¸ªé¨æ§ï¼ä½æ¯åªè¦æä¸æ¬åéçå ¥é¨ä¹¦ï¼å¾å¿«å°±è½è·¨è¿ãè¦æ³çæ£ç¨ä¸C++ï¼å´ä¸æ¯ä»¶å¾å®¹æçäºæ ãå°¤å ¶å¯¹äºå¦çæ¥è¯´ï¼æ¥è§¦å°çä¸è¥¿å¤æ¯âç©å ·âï¼å¾é¾æå®æçæºä¼ãæ以ç»å¸¸çè§æ人é®âC++å°åºè½åä»ä¹âï¼è¿æ¯C++å¦ä¹ ä¸ä¸ä¸ªæ¯è¾éº»ç¦çé®é¢ãæ们é½æ¯åäºç¸å½é¿æ¶é´çC++ç¨åºä¹åæçå°ä¸äºçæ£ç»å ¸ç书ï¼ä¹æ£æ¯å 为走äºç¸å½é¿ç弯路ä¹åæç¥éè¿äºä¹¦çç»å ¸ä¹æå¨ãæè°å¼¯è·¯ï¼ææ³ä¹æ¯ä¸ç§å¿ é¡»ç积累ãå°±ç®ä¸å¼å§å°±çãEssential C++ãåãC++ Primerãï¼æ²¡æ两ä¸å¹´çæ¶é´ææè¿æ¯é¾ææå¾ã
æ¶éï¼æ两å¥ååæéççè¯ï¼ä¸æ¯æ大å¦çCè¯è¨èå¸è¯´çâåç¨åºä¸å¦è¯´æ¯æç¨åºâï¼å¦ä¸å¥æ¯ä¸ç½å说çâ好ç设计æ¥èªåé´ï¼å¤©æç设计æ¥èªå½çªâã对äºæè¿ä¸ªçæ§æ¹å¤ä¸»ä¹è æ¥è¯´ï¼è¿ä¸¤å¥è¯çç¡®ä¸å¤ªéåãä½æ¯æ 论ä»åªä¸ªè§åº¦æ¥è®²ï¼å¯¹äºåå¦è æ¥è¯´ï¼å½çªå¤§å¸çä½åæ¯éåæåçæå¿«æ·å¾ã
æ个人认为ï¼å¯¹äºC++çåå¦è æ¥è¯´ï¼é¦å è¦ç¡®å®èªå·±ä¸ä¸é¢åå 主è¦ä½¿ç¨çç¹æ§çæ¹åãå 为C++çç¹æ§å¦æ¤ä¼å¤ï¼åå¦è æ³è´ªå¤åºæ¬æ¯ä¸å¯è½æåçãC++çç¼ç¨èå¼åºæ¬å¯ä»¥å为ADT+PPãGPåOOä¸ä¸ªæ¹åã对äºADT+PPèå¼æ¥è¯´ï¼åå¦è ç主è¦é®é¢ä¸æ¯å¦ä¹ C++ï¼èæ¯å¦ä¹ Cç使ç¨ã对äºè¿æ ·çåå¦è ï¼å½å çå æ¬ä¹¦è¿æ¯åå¾æ¯è¾æ¸ æ¥ï¼ç¬¦åä¸å½äººçä¹ æ¯ï¼æ¯å¦è°æµ©å¼ºçãCè¯è¨æç¨ããé±è½çãC++è¯è¨å¤§å¦æç¨ããè¿ä¸¤æ¬ä¹¦æé¦æ¨ç¬¬ä¸æ¬ï¼å 为è¿ä¸æ¬ææ½å¿ç 究äºä¸å¹´ï¼è¿æ¬ä¹¦å½ä¸å¾å¤ç¨åºæ¯å¯ä»¥å½çªçï¼èä¸å¯ä»¥å¯¹è¿äºç¨åºè¿è¡å å·¥åæåãæ¯å¦ç»æè¿ä¸ç« ä¸ï¼å®æç»åºçç¨structæ¥å®ç°é¾è¡¨ãäºåæ çç®æ³æ¯ç¸å½è¹©èçãå¦ä¹ ADT+PPçåå¦è å°è¿æ¬ä¹¦æ£æ©é以åå¯ä»¥å°è¯ä¿®æ¹è¿ä¸¤ä¸ªç¨åºãå¦å¤è¿æ¬ä¹¦ç第äºçç¨å¾®æ¶åäºä¸äºå ³äºâç±»âçå 容ãå¦ä¹ ADT+PPçåå¦è ï¼å¯ä»¥ä¸è¢«OOä¸çä¸äºä¸æç¹æ§æ°ä¹±èªå·±çæè·¯ï¼å¯¹äºç±»å±æ¬¡æå¹³ãæ 继æ¿ãæ å¤æçç¨åºç¼åæ¯æå¾å¤§å¥½å¤çã
éæï¼ä½ 好象æ¯è¾æ¨å´å½å ææåç书ãç°å¨ç¤¾ä¼ä¸æç§ä¸å¥½çé£æ°ï¼ä¸æ§å°±æ§ä¸å¤©ï¼ä¸è´¬å°±è´¬ä¸å°ãå°±å¥½è±¡å¯¹å¾ è°ææç书ï¼åå å¹´æ¯å¥ä¸ºç»å ¸ï¼è¿å å¹´åæå¾å¤äººä½¿å²æ¹è¯ãå¦C++æ´æ¯æç¹âå´æ´åªå¤âï¼æ»æ¯è§å¾åå¦å°±åºè¯¥çãEssential C++ããæçè¿ç§è§ç¹ä¹æ¯çé¢çã
æ¶éï¼å½ç¶ãEssential C++ãä¹å¼å¾ççãä½æ¯æ个人è§å¾è¿æ¬ä¹¦æ²¡æè°æµ©å¼ºçãCè¯è¨æç¨ãæ¥å¾å¥½ã主è¦åå æ¯ï¼ç¬¬ä¸ï¼C++çææç¹æ§é½ç¹å°äºï¼ä½æ¯ä¸æ·±ï¼çäºä»¥åä¼ä¸å¿äºæ没ææ¹åï¼ç¬¬äºï¼å¯ä»¥æè¢åé´çä¾å太å°ããCè¯è¨æç¨ãä¸æå¾å¤æ趣çé®é¢ï¼æ¯å¦ç´ååæ¡ãæ±è¯ºå¡ççï¼è¿äºä¾å对äºååæ¶åC/C++è¯è¨ç¼ç¨ç人æ¥è¯´æ¯å¦ä¹ ç¼ç¨å¾å¥½çä¾åããEssential C++ãåªè½æ¯å两æ¬ä¹¦çé以åï¼ä½ä¸ºå¦ä¹ C++ç¹æ§çä¸ä¸ªè¿æ¸¡æ§ç书ç±ã让读è çæ£é¢ç¥å°ä»ä¹æ¯C++çç¼ç¨ãåCç¼ç¨çä¸åç¹å¨åªéã
éæï¼æåç°ä¸ä¸ªå¾æ趣çç°è±¡ï¼åå¦è å¾å¾å欢é®âåªæ¬ä¹¦æ¯è¾å¥½âï¼è¿è®©æå¾æ¯ä¸è§£ãè¿æç¹åä¸ä¸ªåå¦æ篮çç人é®âçæ²»é åç§æ¯è°æ¯è¾å害âãå½ç¶ç§æ¯æ´å害ä¸äºãä½å¦æä½ æ¯æ³å¦æ篮çï¼è¿ä¸¤ä¸ªäººé½é常é常æèµæ ¼æä½ ï¼ä½ è·è°å¦é½è½å¦å¾å¾å¼ºââå ³é®ä¸æ¯å¨äºä½ éåªä¸ªèå¸ï¼èæ¯å¨äºä½ èªå·±ç¨å¤å°å夫å»å¦ã
éæï¼åå°åæ¥è¯é¢ãå¦ä¼äºC++çè¯æ³ï¼è½çæC++代ç ä¹åï¼å¿ é¡»æäºä¹¦æ¥æ导è¿é¶ï¼æè å«æç¹è¿·æ´¥ï¼ãæè§å¾ã设计模å¼ãå¾å¥½ï¼è½å¤è®©è¯»è çå°ä¸äºç²¾å¦çç¨æ³ãä¸è¿æ£å¦æç»å¸¸è¯´çï¼æ¨¡å¼å¸¦æ¥ç麻ç¦å好å¤ä¸æ ·å¤ï¼çè³éº»ç¦è¿è¦æ´å¤ãèä¸ï¼C++æ¬èº«çé®é¢ä½¿å¾å¨C++ä¸ä½¿ç¨GoF模å¼æå 麻ç¦ã
梦éï¼ãDesign Patternsãè¿æ¬ä¹¦ç»å¯¹æ¯ä¸å¯ä»¥æ²¡æçï¼èä¸ä¸è±æçé½ä¸å¯å°ãæåæçä¸æçï¼è¯´å®è¯çä¸æï¼ä½æ¯ä¹ä¸è§å¾äººå®¶ç¿»è¯å¾ä¸å¥½ï¼æ以就æ³ï¼å¤§æ¦æ¯åæå°±å¾é¾æï¼å ä¸èªå·±æ°´å¹³æéãäºæ¯æ»æ¯æ³çåæ¾å æ¬patternsç书æ¥çãåæ¥æ¾å°å æ¬ä¹¦ï¼å£ç¢è¿ä¸éï¼ä¸è¿æ°´å¹³é«ä¸ï¼ä¸æ¯å°±åºæ¥äºï¼è¿æ¯é£æ¬ãDesign Patternsãæç»å ¸ï¼æèçãè±æçåºæ¥ä¹åï¼ä¸¤ä¸ªçæ¬å¯¹ç §çï¼æç½å¤äºãç°å¨è§å¾ï¼å ¶å®å°±è®¾è®¡æ¨¡å¼æ¥è®²ï¼æè¿æ¬çæç½äºå°±å¾ä¸éäºï¼ä¸ç¨åè±è´¹å¾å¤å¿ææ¾å ¶ä»ç书ãæç°å¨çå éå§ç»å¤¹çè¿æ¬ä¹¦ï¼é身æºå¸¦ï¼æå¤æ æ£ã
è³äºè¯´è®¾è®¡æ¨¡å¼çå¯ä½ç¨ï¼åå¯è½å¸¦æ¥çå¼ç«¯ï¼æçä½ä¼ä¹æºå¤ãä¸è¿æ¯è¿æ ·ï¼æ们æ³ä¸æ³ï¼ç©¶ç«ä»ä¹æ åµä¸è®¾è®¡æ¨¡å¼å¯ä»¥ç¨å¾å¾å¥½å¢ï¼ä¸ç§æ¯æç»éªä¸°å¯ç人å¼å¯¼ï¼æ¯å¦è¦æ¯Robert Martin带éï¼ä½ å¨æ个å°æ¹ç¨éäºè®¾è®¡æ¨¡å¼ï¼ä»å°±ä¼æåºæ¥ï¼è¯´è¿éä¸å¯¹ï¼å°æ¥ä¼äº§çä»ä¹æ ·çå¼ç«¯ã对äºä»æ¥è¯´ï¼ä¸°å¯çå®è·µç»éªè¶³ä»¥æ¯æä»è¿è¡âé¢æµåâ设计ãä½æ¯å¤§é¨å人没è¿ä¸ªè½åï¼å æ¤æ们åªå¥½èµ°ç¬¬äºæ¡è·¯å第ä¸æ¡è·¯ï¼å°±æ¯âè¯æ¢åâ设计åâéæåâ设计ãéå°ä¸ä¸ªé®é¢ï¼ä½ è§å¾ç¨æç§æ¨¡å¼æºåéçï¼å°±å¤§èå°ç¨äºï¼æåæ¯ç§¯ç´¯ç»éªï¼åç°ä¸å¥½ï¼åºäºé®é¢äºï¼åªå¥½æ¹åæ¥ï¼é£ä¹æ¯ç§¯ç´¯æè®ãè¿å«åâè¯æ¢åâãè³äºéæï¼åºè¯¥ç®æ¯ææç»ç»ãæåçæé«çå·¥ç¨åæ¹æ³ãå æé®é¢âquick and dirtyâå°è§£å³äºï¼ææçæç¤é½æ´é²åºæ¥ï¼ç¶ååæ ¹æ®å®é æ åµéç¨åéç模å¼ä¼å设计ãç°å¨XPåUPé½é«åº¦éè§refactoryï¼UPå¨ElaborationåConstructioné¶æ®µé½é¼å±æ½åºä¸é¨çiterationsè¿è¡éæãæ以说å¦æç»ç»å¿«éç软件å¼åï¼å½ç¶æ¯è¾å¾åäºè¿æ¡è·¯ââææåçåã
éæï¼è®²å°éæï¼æ顺便说说ãRefactoringãè¿æ¬ä¹¦çå½±åãä»å·¥ç¨æ¬èº«çè§åº¦æ¥è¯´ï¼ä½ æè°çâéæå设计âæ¯æ²¡æä»ä¹é®é¢çãä½ä¸å½çå¼åè ï¼ä¹å æ¬æå¨å ï¼å¾å¾æ¯è¾å²å¨ï¼æ¯è¾å®¹æç¸ä¿¡é¶å¼¹çåå¨ãæ¾ç»æé£ä¹ä¸æ®µæ¶é´ï¼æå¨Javaä¸å°è¯è¿äºéæçæ¹æ³ä¹åï¼åæ¿å°C++ä¸å»å°è¯ãç»æåç°ï¼å¨Javaä¸é度é常快çéæè¿ç¨ï¼å°C++ä¸å°±è¢«åæ ¢äºãç©¶å ¶åå ï¼å°±æ¯å 为C++åJavaç约ææ¡ä»¶ä¸åãæ¿çJavaä¸æåçæ¡ä¾ç´æ¥å¥C++ï¼ä¸å¤±è´¥ææªã
æ以ï¼æå¿ é¡»è¯´ï¼ãRefactoringãè¿æ¬ä¹¦å¾æä»·å¼ãä½å¯¹äºC++ç¨åºåæ¥è¯´ï¼å®çä»·å¼æ¯è®©ä½ æèï¼æèè¿ç§æ¹æ³çå¯è¡æ§ãå¦æä¸ä¸ªC++ç¨åºå没ææç®è¿ç§»å°Javaï¼é£ä¹æå¿ é¡»åè¯ä»ï¼ãRefactoringãè¿æ¬ä¹¦ä¸æ¯è®©ä½ ç §çå®ç¨çï¼çè³ä¸æ¯è®©ä½ å»ç¸ä¿¡å®çã对äºC++ç¨åºåï¼ãRefactoringãå ¨ä¹¦å¯ä»¥æ¾å¿ç¸ä¿¡çåªæç¬¬ç« ï¼å ¶ä»çé¨åï¼é½å¿ é¡»é常谨æ å°å¯¹å¾ ã
梦éï¼æè¿è¦å°±âè¯æ¢åâçæ¹æ³å¤è¯´ä¸¤å¥ï¼æè§å¾å¯¹äºä¸ªäººåå±æ¥è®²ï¼âè¯æ¢âä¹æ¯å¿ ä¸å¯å°çï¼æå¢ä¸å¯æï¼é«æ°´å¹³ç人ä¸é½æ¯æåºæ¥çåï¼ä½ 失败äºä¸æ¬¡ï¼å°±ç¥éè¿ä¸ªæ¨¡å¼æä»ä¹æ½å¨çé®é¢ï¼ä¸æ¬¡åç¨ï¼å°±ä¼å¤çå æ¥ï¼åä¸æ£ä¼¼çãæçå¤äºï¼è·¯æ°å°±åºæ¥äºã
æä¸ç¥éä½ ä»¬æ¯å¦æè¿ä¸ªæè§ï¼ç¨éäºæ¨¡å¼ï¼åäºäºï¼ååè¿å¤´å»ç¿»ç¿»ãDesign Patternsãï¼çå°äººå®¶æ©å°±æåºæ¥è¿ä¸ªé®é¢ï¼ä¸è¿å°±æ¯é£ä¹å å¥è¯ï¼åæ¥çä¸å»å¹²å·´å·´çï¼ç°å¨è§å¾å¥å¥é½è®²å°å¿åä¸ï¼GoFç形象马ä¸å°±é«å¤§èµ·æ¥ï¼è¿å¸¦çå ç¯ï¼æè§æ¯æ¢å ´å¥åææã
éæï¼ç°å¨å头æ¥çï¼ææ´æ¬£èµmyanæ¨èç»æçãDesigning Object-Oriented C++ Applications Using Booch Methodããè¿æ¬ä¹¦è½å¤å¸®å©C++ç¨åºåçæ¸ æè·¯å¹å »ä¹ æ¯ï¼å¯æå½å 没æå¼è¿ãç¸æ¯åæ¥åä¸å³æµåçUMLç³»å书ç±ï¼æè§å¾è¿æ¬ä¹¦å¯¹äºé¢å对象çééç²¾è¾ç¬å°ï¼è³ä»æªæè½åºå ¶å³è ã
梦éï¼åææ们两人é½è¯´å°Robert Martinï¼ä»å¯æ¯æçæ¦æ ·ãé£æ¬å¹´çãDesigning Object Oriented C++ Applicationãï¼æè§å¾æ¯æ¯ä¸ä¸ªC++软件工ç¨å¸é½åºè¯¥åå¤ç 读ç书ãå¯æä¸ä» å½å 没æå¼è¿ï¼å¨å½å¤çåæ°ä¹ä¸å¤§ãå¦æä½ è§å¾é¢å对象çé£äºéçä½ å¥½åé½æç½ï¼å¯å°±æ¯ä¸éå°å®é é®é¢å°±ä½¿ä¸ä¸å²ï¼é£è¿æ¬ä¹¦å°±æ¯ä½ çæ佳导å¸ã
æå°çæ¸ æè·¯ï¼è¿æä¸æ¬ä¹¦ä¸å¾ä¸æï¼å°±æ¯Andrew KoenigçãRuminations On C++ããæ¯ä¸ªäººé½åºè¯¥é®èªå·±ï¼æå¦äºè¿ä¹å¤å¹´çC++ï¼ç©¶ç«ä»ä¹æ¯C++æåºæ¬ç设计ç念ï¼éå°é®é¢æ第ä¸ä¸ªç´è§æ¯ä»ä¹ï¼ç¬¬ä¸ä¸ªè¯æ¢åç解å³æ¹æ¡åºè¯¥å ·æé£äºç¹ç¹ï¼å¦æä½ ä¸è½ç»åºæç¡®ççæ¡ï¼å°±åºè¯¥è®¤çå°å»è¯»è¿æ¬ä¹¦ï¼è¯»å®äºä½ å°±æäºâ主å¿éª¨âã
éæï¼æä¸å¥è¯ï¼è°è°âæ¨è书âçé®é¢ãå ¥é¨ä¹¦åºæ¬ä¸æ¯æ¾ä¹åæµ·èçåçï¼æ以æ¨èçæä¹ä¹ä¸å¤§ãèå ¥é¨åçåå±æ¹åï¼æ¯ä¸ªäººä¸åï¼è¿ä¸ªæ¶åå°±éè¦âé«äººâçæç¹ã举个ä¾åï¼æå¦C++çæ¶åï¼myanè¿ä¸è®¤è¯æï¼æ以ä¹æ²¡æç»ææ¨è书ï¼æè¿æ¯å¦è¿æ¥äºï¼æ以å³ä½¿ä½ å½æ¶åææ¨èäºãEssential C++ãæè ãC++ Primerãï¼æä¹ä¸ä¼å¤ªæè°¢ä½ ï¼ä½å¨æ认çç 究OOçæ¶åï¼ä½ æ¨èRobert Martiné£æ¬ä¹¦ç»æï¼å¯¹æ帮å©å°±ç¹å«å¤§ï¼èä¸æä»å«çå°æ¹ä¹å¾é¾æ¾å°ç±»ä¼¼çæ¨èï¼æ以æå°±å¾æè°¢ä½ ã
ä¸ä¸ªç¨åºåï¼å¿ é¡»æframeworkçæè¯ï¼è¦å¦ä¼ç¨frameworkï¼è¿è¦ä¸»å¨å»åæframeworkï¼å¨è¿æ¹é¢ï¼ãDesign Patternsãè½æä¸å®ç帮å©ï¼ãä½æ¯ï¼çæ£é«è´¨éãææ°åçframeworkç书ææä¹å°±åªæé对MFCçãä»è¿ä¸ªè§åº¦æ¥è¯´ï¼MFC纵æåè¬ä¸æ¯ï¼C++ç¨åºåé½é常æå¿ è¦å å»ç¨å®ãçæå®ãç 究å®ï¼çè³åå©ãæ·±å ¥æµ åºMFCãè¿æ ·ç书æ¥åæå®ãä¸ç¶ï¼å¾é¾æframeworkçæè¯åæè§ã
å½ç¶ï¼å¦ä¸ä¸ªframeworkä¹å¾å¥½ï¼é£å°±æ¯STLãä¸ç®¡ç¨ä¸ç¨MFCãSTLï¼å¯¹è¿ä¸¤ä¸ªä¸è¥¿çææ¡åç解é½æ¯ææ帮å©çãæè¿æåå¨çãæ·±å ¥æµ åºMFCãï¼è½ç¶å·²ç»ä¸ç¨MFCç¼ç¨äºï¼ä½å¸®å©æ¯ä¸å®æçã
梦éï¼MFCåSTLæ¹é¢ï¼æè¿æ¯æ¯è¾æ¨å´ä¾¯å çç两æ¬ä¹¦ãæ·±å ¥æµ åºMFCãåãSTLæºç 解æãã
ãæ·±å ¥æµ åºMFCãè¿æ¬ä¹¦ï¼åæ°èªç¶æ¯å¤§å¾ä¸å¾äºï¼ä¸è¿ä¹æä¸å°äººæ¹è¯ãå ¶å®ä¹¦ä¹æ²¡æåå ¨åç¾çï¼æ¹è¯å½ç¶æ¯å°ä¸äºçï¼ä¸è¿æçæ¶åæçå°æ人è¯è®ºè¿æ¬ä¹¦ï¼æå®è·Inside VCç¸æ¯ï¼ççæ¯ç头ä¸å¯¹é©¬å´ã
ä½ åæå ¶å®è¯´å¾å¾å¯¹ï¼ç¨åºååºè¯¥æä¸ç¹frameworkæè¯ãèè¿æ¬ãæ·±å ¥æµ åºMFCãä¸å ¶è¯´æ¯å¨è®²MFCç¼ç¨ï¼ä¸å¦è¯´éç¯æ¯å¨æ¿MFC为ä¾åæApplication Frameworkçæ¶æåèç»ãæ以æ è®ºä½ å¯¹äºMFCæ¬èº«æ¯ä»ä¹æ度ï¼è¿æ¬ä¹¦å¯¹æ¯ä¸ä¸ªC++ç¨åºåé½æå¾å¤§ççå¤ã
éæï¼æ¯çããVCææ¯å å¹ãä¼åè¯ä½ âDYNAMIC_CREATEè¿ä¸ªå®æä¹ç¨âï¼ãæ·±å ¥æµ åºMFCãååè¯ä½ âDYNAMIC_CREATEè¿ä¸ªå®æ¯æä¹å®ç°çâãæ以ï¼å¦æä½ åªéè¦å¨VCä¸åä¸äºå°åºç¨ç¨åºï¼ãæ·±å ¥æµ åºMFCãçä»·å¼å¹¶ä¸å¤ªå¤§ï¼ä½æ¯ï¼å¦æä½ éè¦è®¾è®¡ä¸ä¸ªç¨å¾®å¤§ä¸ç¹çä¸è¥¿ï¼ä¸ä¸å®æ¯frameworkï¼ï¼MFCç设计ææ³å°±ä¼ææ帮å©ã
梦éï¼å¦å¤ï¼æè§å¾å¯¹äºMFCä¹åºè¯¥æä¸ä¸ªå ¬å çè¯ä»·ãè¿å»æ¯å¹æ§å¾å¤©ä¸æå°ä¸æ ï¼ä¹¦åºééºå¤©çå°é½æ¯MFCç书ï¼æå¾å¤§å®¶åªç¥æMFCï¼ä¸ç¥æC++ï¼çè³ç´å°ç°å¨è¿æ人é®ï¼âææ¯å¦MFCå¢ï¼è¿æ¯å¦C++ï¼VC++æ¯ä¸æ¯æ¯C++æ´é«çº§çè¯è¨ï¼âMFCæäºä¸å°ç¥åï¼é»ç¢äºäººä»¬çè§çº¿ãæ以å¾æå®ä»ç¥åä¸æä¸æ¥ãè¿å°±æ¯è¿å»ä¸ä¸¤å¹´æå¾å¤äººï¼å æ¬æå¨å æ¹è¯MFCçä¸ä¸ªç®çãå¯æ¯ç°å¨å¤§å®¶è§éå¼éäºï¼.NETä¹åºæ¥äºï¼MFCä¸åæ¯ç¥åäºï¼å°æ°äººå°±å¼å§ä»¥è´¬æMFC为ä¹äºãæè§å¾è¿ç§æ度æ¯ä¸å¯¹çã
ä»ä¹å«å¥½çæ¡æ¶ï¼æè§å¾å¨åå å¹´çæ¶é´è½å¤è±¡MFCè¿æ ·ä¿æ稳å®å¹¶ä¸ä¸æè¿æ¥çæ¡æ¶å°±æ¯å¥½çæ¡æ¶ãå¯è½æ们å¨ä¸äºå ·ä½ç设计é®é¢ä¸æä¸åçæ³ï¼è§å¾âè¿ä¸ªå°æ¹è¿ä¹è®¾è®¡ä¸æ¯æ´æ¼äº®åï¼âå¾å¤æ¶åæ¯çï¼ä½æ¯è¿ä¸éè¦ï¼éè¦çæ¯MFCæç稳å®ãæåå å¹´çæåç»éªï¼è¿æ¯æäºä¸èµ·çä¸è¥¿ã
å¦å¤ä¸ç¹ï¼MFCä¸é´å æ¬çå¦ä¹ Win APIç¼ç¨çæä½³èµæãè¿æ¯é¤äºå ¶frameworkæ¹é¢ä¹å¤çå¦ä¸ä¸ªäº®ç¹ãæç°å¨ä½¿ç¨Win APIå¼åï¼ä½æ¯ç»å¸¸åèMFCçæºä»£ç ï¼æ¶è·å¾å¤§ã
éæï¼STLæ¹é¢ï¼æ对äºåæå®çæºä»£ç å ´è¶£å¹¶ä¸å¤§ï¼æ¯ç«éé¢æºä»£ç å¤æ¯ç®æ³é®é¢ãæ以ï¼ãSTLæºç åæãæä¹åªæ¯é便翻翻就æä¹é«éäºãæè§å¾è¿æ¬ä¹¦ç¨æ¥å计ç®æºç³»çæ°æ®ç»æåç®æ³ææä¸éï¼ä¸ç¥éæ没æèå¸ä¹æè¿æ ·åã
对äºSTLï¼æçæ度ä¸åé½æ¯âåºç¨è³ä¸âãä¸è¿ï¼æä¸ç´è®¤ä¸ºSGI STLæ¬èº«å°±æ¯ä¸æ¬ç²¾å½©ç书ï¼ä¸æ¬æ°æ®ç»æåç®æ³çç»å ¸åè书ï¼åæ¶ä¹æ¯æ³åææ¯çåè书ãæ³ç¥éä¸ä¸ªç®æ³æ¯å¦ä½å®ç°çï¼ççSTLæºä»£ç å°±è¡ï¼æ³ç¥éå¦ä½ä½¿ç¨type traitsï¼STLæºä»£ç éé¢ä¹æä¾åãçå«äººåç书ï¼æ»è§å¾éçä¸å±çº±ï¼æç¹æ ä¸å°çå¤çæè§ãSGI STLç代ç åå¾é常æ¼äº®ï¼ä¸ä¸ªC++ç¨åºåå¦æä¸ççè¿æ¬ä¹¦ï¼å®å¨æ¯å¯æã
梦éï¼è³äºSTLï¼é¤äºãSTLæºç 解æãä¹å¤ï¼æ举贤ä¸é¿äº²ï¼å¼ºçæ¨è侯å çä¸æåè¯çé£æ¬ãThe C++ Standard Libraryããè¿æ¬ä¹¦è´¨éä¹é«æ¯æ éæççãæç°å¨æ边常å¤æ¤ä¹¦ï¼éæ¶æ¥é ï¼å¯¹æ帮å©å¾å¤§ã
éæï¼C++åJavaç¸æ¯ï¼æ大çä¼å¿å°±æ¯å®æ²¡æä¸ä¸ªä¸é¨çå ¬å¸æ¥ç®¡å®ï¼æ大çå¼±ç¹ä¹æ¯å®æ²¡æä¸ä¸ªä¸é¨çå ¬å¸æ¥ç®¡å®ãJavaç¨åºåå¨å¦ä¼ç®åçè¯æ³ä¹åï¼ç«å»è¿å ¥SUNæä¾çframeworkï¼ä¸è¾¹ç¨è¿ä¸ªç°æçframeworkåå®é å¼åï¼ä¸è¾¹å¨å¼åè¿ç¨ä¸ç»§ç»å¦ä¹ Javaä¸äºå¹½æ·±çç¹æ§ãèè¿ä¸ªæ¶åï¼C++ç¨åºåææè¿å¨é®âVCåBCBåªä¸ªå¥½âå¢ãè¿æ çæ¯æµªè´¹æ¶é´ã
梦éï¼åæä½ è¯´JavaåC++çä¼å£ï¼è¿ä¸ªè¯é¢å·²ç»æäºæ们è¿ä¸ªå¹´ä»£æ°¸ä¸æ¶å¤±ç声波äºãæä¹ä¸æ³åè°è¿ä¸ªãä¸è¿æä¸ç¹æå¾è¯´æ¸ æ¥ï¼ç°å¨æ们å¾å¤ç¨C++ç人åäºä¸å°è¦å¤´ï¼æ¢è¿èåå»ççJavaï¼è§å¾å®çæ¯å¤ªå¯ç±äºï¼è¿ç§å°è±¡æ¯ä¸åç¡®çãå¦å¤ï¼Javaä¹ä¸ç®åï¼èä¸ä¼è¶æ¥è¶åºå¤§å¤æãå¨å¾å¤åºåï¼Javaè¿ä¸å ·æç«äºåãè³äºå°æ¥å¦ä½ï¼æçæäºJavaç±å¥½è ä¹è¿åä¹è§äºï¼ä¼¼ä¹è®¡ç®æºç§å¦çå å年解å³ä¸äºçé®é¢é½å¯ä»¥åçJavaçä¸é£è§£å³æï¼ææ没é£ä¹å®¹æã
éæï¼é£å½ç¶ãæå次强è°ï¼No Silver Bulletã读书å¾éè¦ï¼ä½å¤äººè¯´âè¡ä¸éè·¯ï¼è¯»ä¸å·ä¹¦âï¼è¿æ¯æâè¡è·¯âæ¾å¨â读书âåé¢ãå°¤å ¶å¯¹äºææ¯ä¹¦ç±ï¼å¦æå®ä¸è½å¸®æ解å³é®é¢ãä¸è½ç»æ带æ¥é常å®é çå©çï¼é£ä¹ææ¯ä¸ä¼å»è¯»å®çãæ¶é说å¾å¯¹ï¼æ们è¿ä¸ªç¤¾ä¼å¾å¿«é¤ï¼æ们è¿ä¸ªè¡ä¸å°¤å ¶å¾å¿«é¤ï¼æ们ä¹åªè½åªåéåºå®ã
2. C++基础:Trivial/Standard layout/POD
在深入学习《STL源码剖析》时,对trivial/standard layout/POD这几个概念有了深入理解。以下是它们的关键要点:1. C++编译器自动生成的函数
新定义类型的构造函数会影响编译器的行为。C++引入了明确指定默认构造函数的方式。若已有构造函数,编译器将不再自动创建默认构造函数。box源码2.1 Trivial类型
一个类型被称为trivial,当满足以下条件:没有用户自定义的构造函数、析构函数、拷贝构造函数、赋值运算符或静态成员。例如:// 示例1: trivial
struct SimpleType { } __attribute__((trivial));
// 示例2: non-trivial
struct ComplexType {
int data;
};
3. Standard layout类型
标准布局类型保持与C语言兼容的内存布局,允许用户定义构造函数,但不支持C++的额外特性。例如:// 示例1: standard layout
class StandardClass {
public:
int data;
};
// 示例2: non-standard layout (可能使用虚函数或内部继承等)
class NonStandardClass { };
4. POD类型
POD(Plain Old Data)是既trivial又standard layout的类型。它们的特性包括简单、没有复杂成员函数,但C++后,推荐使用std::is_trivial和std::is_standard_layout来判断。// 示例1: POD
struct PODClass : public SimpleType {
// 省略其他可能的成员
};
以上是关于C++中trivial/standard layout/POD概念的总结,这些在编写高效、可移植的代码时至关重要。STL 源码剖析:sort
我大抵是太闲了。
更好的阅读体验。
sort 作为最常用的 STL 之一,大多数人对于其了解仅限于快速排序。
听说其内部实现还包括插入排序和堆排序,于是很好奇,决定通过源代码一探究竟。
个人习惯使用 DEV-C++,源码生意不知道其他的编译器会不会有所不同,现阶段也不是很关心。
这个文章并不是析完之后的总结,而是边剖边写。不免有个人的猜测。而且由于本人英语极其差劲,大抵会犯一些憨憨错误。
源码部分sort
首先,在 Dev 中输入以下代码:
然后按住 ctrl,鼠标左键sort,就可以跳转到头文件 stl_algo.h,并可以看到这个:
注释、模板和函数参数不再解释,我们需要关注的是函数体。
但是,中间那一段没看懂……
点进去,是一堆看不懂的#define。
查了一下,感觉这东西不是我这个菜鸡能掌握的。
有兴趣的 戳这里。
那么接下来,就应该去到函数__sort 来一探究竟了。
__sort
通过同样的方法,继续在stl_algo.h 里找到 __sort 的源代码。
同样,只看函数体部分。
一般来说,sort(a,a+n) 是对于区间 [公式] 进行排序,所以排序的前提是 __first != __last。
如果能排序,那么通过两种方式:
一部分一部分的看。
__introsort_loop
最上边注释的翻译:这是排序例程的帮助程序函数。
在传参时,除了首尾迭代器和排序方式,还传了一个std::__lg(__last - __first) * 2,对应 __depth_limit。
while 表示,当区间长度太小时,不进行排序。
_S_threshold 是一个由 enum 定义的数,好像是叫枚举类型。
当__depth_limit 为 [公式] 时,也就是迭代次数较多时,不使用 __introsort_loop,而是使用 __partial_sort(部分排序)。
然后通过__unguarded_partition_pivot,得到一个奇怪的位置(这个函数的翻译是无防护分区枢轴)。
然后递归处理这个奇怪的位置到末位置,再更新末位置,继续循环。
鉴于本人比较好奇无防护分区枢轴是什么,于是先看的__unguarded_partition_pivot。
__unguarded_partition_pivot
首先,找到了中间点。
然后__move_median_to_first(把中间的数移到第一位)。
最后返回__unguarded_partition。
__move_median_to_first
这里的中间数,并不是数列的中间数,而是三个迭代器的中间值。
这三个迭代器分别指向:第二个数,中间的数,最后一个数。
至于为什么取中间的数,暂时还不是很清楚。
`__unguarded_partition`
传参传来的序列第二位到最后。
看着看着,我好像悟了。
这里应该就是实现快速排序的部分。
上边的__move_median_to_first 是为了防止特殊数据卡 [公式] 。经过移动的话,第一个位置就不会是最小值,放在左半序列的数也就不会为 [公式] 。
这样的话,__unguarded_partition 就是快排的主体。
那么,接下来该去看部分排序了。
__partial_sort
这里浅显的理解为堆排序,至于具体实现,在stl_heap.h 里,不属于我们的讨论范围。
(绝对不是因为我懒。)
这样的话,__introsort_loop 就结束了。下一步就要回到 __sort。
__final_insertion_sort
其中某常量为enum { _S_threshold = };。
其中实现的函数有两个:
__insertion_sort
其中的__comp 依然按照默认排序方式 < 来理解。
_GLIBCXX_MOVE_BACKWARD3
进入到_GLIBCXX_MOVE_BACKWARD3,是一个神奇的 #define:
其上就是move_backward:
上边的注释翻译为:
__unguarded_linear_insert
翻译为“无防护线性插入”,应该是指直接插入吧。
当__last 的值比前边元素的值小的时候,就一直进行交换,最后把 __last 放到对应的位置。
__unguarded_insertion_sort
就是直接对区间的每个元素进行插入。
总结
到这里,sort 的源代码就剖完了(除了堆的那部分)。
虽然没怎么看懂,但也理解了,sort 的源码是在快排的基础上,通过堆排序和插入排序来维护时间复杂度的稳定,不至于退化为 [公式] 。
鬼知道我写这么多是为了干嘛……
做java程序员都要看哪些书
我就是去年刚毕业的 ,买了好多书,开始买的是java圣经--《java编程思想》但是不适合初学者,因为是外文翻译过来的,初学者很难懂,但它确实经典。后来我挑了很多书,我选中了《由浅入深学java》李志刚写的,电子工业出版社。我主要看中了里面不但有讲解,还有小练习,练习还有答案,这个对初学者很好。我用的技术是jsp+oracle。所以还买了一本数据库书《从入门到精通oracle》中国水利水电出版社,钱慎一,张素智写的。没深看,就学习基本的数据库添加、修改、删除语句。看了这两本书,我还是对我整个工程结构不明白,我有买了本《java web轻量级开发全体验》邓子云系的,电子工业出版社。这本书让我对框架有了清楚的了解还介绍用eclipse软件如何开发,我觉得非常值得你一看。
书是必须看的,此外我还经常去百度文库搜索我遇到的新鲜的技术术语,百度文库里我也学到了不少技术,js、spring、ssh、ibatis啊这些东西你不可能样样都买书,所以从网上看一样。没事我还经常去csdn网站,了解咱们IT行业最新前景,这都对咱们新手有很大帮助。
不明白的地方我经常去百度知道问,也会去帮助别人解答。这对自己知识的理解都有好处。
祝你学习愉快