1.从应用到源码理解STL反向迭代器
2.cè¯è¨ç¼ç¨
3.2. C++基础:Trivial/Standard layout/POD
4.STL 源码剖析:sort
5.做java程序员都要看哪些书
从应用到源码理解STL反向迭代器
在实际应用中,码解我们可能需要从序列容器(如vector)的码解尾部移除不满足特定条件的部分元素。这通常涉及从尾部开始的码解迭代操作。然而,码解容器成员函数erase不接受反向迭代器作为参数。码解因此,码解有哪些游戏源码的论坛我们需要将反向迭代器转换为普通迭代器。码解先来看看STL迭代器的码解分类和转换关系。
STL迭代器主要分为用途迭代器,码解它们之间存在转换关系,码解但不是码解所有迭代器类型都可以相互转换。转换关系需通过迭代器的码解构造函数定义,有些可以直接转换,码解有些则需调用特定方法。码解
特别地,码解反向迭代器到普通迭代器的转换可以通过调用反向迭代器的base()方法实现。但初版代码存在缺陷,未能按预期将元素正确删除。通过跟踪代码并参考cpp reference文档,我们发现base()方法返回的迭代器实际上比预期位置靠后一个元素。
为了修正这个问题,我们需要将通过base()方法得到的迭代器向前移动一个位置,以正确指向第一个符合移除条件的元素。修改代码后,可以确保元素按约定进行删除。设备的源码
在一般场景下,迭代器的使用主要涉及遍历访问和遍历修改元素值。对于删除和插入操作,可能需要将反向迭代器转换为普通迭代器。STL容器的erase和insert成员函数仅接受普通迭代器作为参数。
在执行插入操作时,直接使用base()将反向迭代器转换为普通迭代器,并传入insert函数,其语义是一致的。而在删除操作中,直接使用base()转换后的迭代器可能无法正确执行,因为反向迭代器和普通迭代器在终止位置上的处理存在差异。为了修正此问题,需要手动调整,确保迭代器的有效性。
对于反向迭代器,通过正确的反向迭代操作得到的迭代器,在不等于rend()返回的迭代器时,都是指向有效值的。因此,除了rend().base()-1操作可能导致问题外,其他转换通常都是安全的。
讨论end()迭代器的前移操作时,需要考虑是点菜app源码否能够安全地访问容器的尾端元素。对于随机访问迭代器,如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++引入了明确指定默认构造函数的方式。若已有构造函数,编译器将不再自动创建默认构造函数。电脑挂机源码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++,autosar源码分析不知道其他的编译器会不会有所不同,现阶段也不是很关心。
这个文章并不是析完之后的总结,而是边剖边写。不免有个人的猜测。而且由于本人英语极其差劲,大抵会犯一些憨憨错误。
源码部分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行业最新前景,这都对咱们新手有很大帮助。
不明白的地方我经常去百度知道问,也会去帮助别人解答。这对自己知识的理解都有好处。
祝你学习愉快
2024-11-06 11:01
2024-11-06 09:56
2024-11-06 09:30
2024-11-06 09:26
2024-11-06 09:17
2024-11-06 09:12