![](https://habrastorage.org/files/c03/c82/975/c03c82975acd44caa357b60e28f1db65.jpg)
åãJavaãŸãã¯CïŒã®è¬çœªè ãããC / C ++ã®éçºã«ã€ããŠäœãèãããšãã§ããŸããïŒ äŒãããããšããã§ã¯ããã®èšèªã¯æ代é ãã§ããã誰ãããã«ã€ããŠæžããŠããªãã ãã ããåŸ ã¡æéãªããŸãã¯äœåŸ ã¡æéã®ãµãŒãã¹ãäœæããå¿ èŠãããå ŽåããŸãã¯å€§éã®ããŒã¿ãåŠçããããã®ããã«ããã¯ã®ã¡ã¢ãªãšå®è¡æéãç¯çŽããå¿ èŠãããå Žåã«ã®ã¿ããå€é¢šãªãC / C ++éçºè ã®å©ãã«ããã«é ŒããŸãã ãããã®äººãã¡ã¢ãªãæåã§ç®¡çããæ¹æ³ãç¥ã£ãŠããŠã1ã€ãŸãã¯å¥ã®é«ã¬ãã«ã®æäœã®ã¹ã¿ããã£ã³ã°ãããç¥ã£ãŠããããã§ãã ä»æ¥ãç§ãã¡ã®ä»äºã¯ããããã®äººã ã«äžæ©è¿ã¥ãããšã§ãã
ã¬ãŒã·ã³ã°ã«ãŒã®ãã³ãããã®äž
éåžžããããã¯ãŒã¯ã¢ããªã±ãŒã·ã§ã³ã®ããžãã¹ããžãã¯ã¯ãéçºèšèªãšããŠC ++ã䜿çšããããšã奜ãå Žæã§ã¯ãããŸããã éåžžãã¢ããªã±ãŒã·ã§ã³ã¯ã©ã€ã¢ã³ããšããŒã¿ããŒã¹ãµãŒããŒéã®ãããã¯ãŒã¯ã«ã¯ãé«ã¬ãã«ã®èšèªãéžæãããŸãã ããããé ããæ©ãããã¢ããªã±ãŒã·ã§ã³ã¯ãæ°ãããµãŒããŒãè³Œå ¥ãããããæé©åããæ¹ãå®äŸ¡ã«ãªããŸã§æé·ããŸãã ãã®å ŽåãC / C ++ã®ããžãã¹ããžãã¯ã®äžéšã®å®è£ ããCïŒãJavaãPythonãRubyããŸãã¯JavaScriptã®ç¢ºç«ãããããžãã¯ã«åã蟌ããšããé åããããŸãã ããã§ãããªãã¯ãããã楜ããé©ããåŸ ã£ãŠããŸãïŒC ++ã§ã¯ã倧éã®ããŒã¿ãå¹ççã«åŠçã§ããå¿ èŠããããŸãã JavaãŸãã¯CïŒã®ã¹ãã«ã¯ãC ++ã§åãã³ãŒãã«ã€ããŠèšè¿°ããããšãããšããã¹ãŠã®æé©åã®è©Šã¿ãããã«ç¡å¹ã«ããŸãã
äºå®ãnewã®äœ¿çšã¯å¯èœãªéãçµæžçã§ããå¿ èŠããããç¶æ³ã«ããŸãé©ããªãã³ã³ããã®äžåçãªäœ¿çšã¯ãå®éã«ã¯å®å šã«è«ççãªã³ãŒããå®å šã«äžé©åã«ããŸãã C ++ã®è³æ Œãååã§ãªãåŸæ¥å¡ã«ãã£ãŠãæé©åããå®è¡ãããåŸãå®è¡æéãã»ãŒåããŸãŸã§ããããããã«é·ããªãå¯èœæ§ããããŸãã 誰ããæãããããã ãããšåœŒãã¯èšã£ãããããã§ã¯ãã¹ãŠããã§ã«æ倧éã«æé©åãããŠããã 誰ããé«ã¬ãã«èšèªã®æ³åã絶ããã¹ããŒããååã«çŽåŸãããããšããŸãã ç§ãã¡ã®ä»äºã¯ãäŒç€Ÿã®ãéãç¡é§ã«ãªããªãããã«ããããšã§ãã ãã®ãããã³ãŒãã®éèŠãªã»ã¯ã·ã§ã³ã«C / C ++ãåã蟌ãããã®ãªãœãŒã¹ã®ã³ã¹ãã¯ç¡é§ã§ã¯ãªãã ãã§ãªããäœåºŠãå ±ãããŠããŸãã æãããããŠãã§ããªãã£ãããšèšãã®ã¯å°é家ã§ã¯ãªããäžå¯èœãæ±ãã人ã§ãã çµå±ã®ãšãããããã¯äžå¯èœã«æããã ãã§ããããã®ã¬ãã¹ã³ã§è€éã«ãªããã®ã¯äœããªãã§ãããã å¿ èŠãªã®ã¯ãC ++ã§ããŒã¿ãåŠçãããšãã«åœ¹ç«ã€ããã€ãã®éèŠãªããšãèŠããŠããããšã§ãã
æ éã«ããŒã«ãéžæããŸã
ã¹ã³ãããã€ã€ãŒãºã®åªããæ¬ãThe Effective Use of STLããèªãããšãã§ããªãã£ããªããç§ã¯ããã匷ããå§ãããŸãã C ++ã§ã©ã®ãããªã³ã³ãããå¿ èŠãã詳现ã«ç解ããŠããªããã°ãSTLã䜿çšããããšã¯éšã®äžã§ã¢ã¹ãã¡ã«ããä¿®çããããšã«äŒŒãŠããŸãã åºæ¬çãªãã³ããããã€ã玹ä»ããŸãããããŸããŸãªã³ã³ããã®ç®çãšã¡ãœããã®ããã€ã¹ãå®å šã«ç解ããããšãéèŠã§ãã
æåã«èŠããŠããã¹ãããšã¯ã `std :: vector`ã¯é åã§ã¯ãªããã¯ãã«ã§ãã åãã¿ã€ãã®èŠçŽ ã®åœ¢ã§ã¡ã¢ãªã®é£ç¶éšåãæ£ç¢ºã«ãã¯ãã«åããå¿ èŠãããå Žåã¯ããã®ã³ã³ããã䜿çšããŸãã å¶åŸ¡ãããŠããªããµã€ãºã§å®æçãªè¿œå ãšåé€ãå¿ èŠãªå Žåã `std :: vector`ã¯æçšã§ã¯ãããŸããã ãããåäœã®ã¢ã¯ã»ã¹ãšå®äŸ¡ãªãµã€ãºã®å¢å ã䌎ãé åãå¿ èŠãªå Žåã¯ã `std :: deque`ã®æ¹ãè¯ãèŠããŸãã 確ãã«ãååãªäºçŽã¡ã¢ãªããªãå Žåã¯ãæ°ããé£ç¶ïŒïŒïŒãããã¯ãå²ãåœãŠãããããŒã¿ã¯ `std :: vector`ãªããžã§ã¯ãã®å€ãã¡ã¢ãªããæ°ããèŠçŽ ããšã«è»¢éãããŸãã æå°éã®æéã§å€§éã®ããŒã¿ãåŠçããããšãæ€èšããŠãããããã¡ã¢ãªãæ¢åã®ãªããžã§ã¯ãã«åå²ãåœãŠããããšã¯ãCPUæéãè²»ãããããã®ã§ã¯ãããŸããã
2çªç®ã®åææ¡ä»¶ã¯ãäžæã®ããŒãšå€ã®æ¯ãæã€ã³ã³ãããæ éã«éžæããããšã§ãã ããã°ããŒã¿ã®å Žåãããããããã« `std :: unordered_map`ããã«ãããã§ããã ãå€æŽããªãããã«ããã®ãæãç°¡åã§ãã å®éã«ã¯ã `std :: unordered_map`ã®ããŒãååŸããããšã¯` std :: map`ãããã¯ããã«å¹æçã§ããããã倧éã®ããŒã¿ã«å¯ŸããŠãã¡ã¢ãªå ã«èšå€§ãªæ°ã®ããŒããæã€èµ€é»ããªãŒãæ§ç¯ããã³ç¶æããå¿ èŠã¯ãããŸããã ããããããŒãšå€ã®é¢ä¿ãé »ç¹ã«å€æŽãããå ŽåïŒé¢ä¿ãåé€ãããæ°ããé¢ä¿ãè¿œå ããããããéåžžã«éäžçã«è¡ãããŸãïŒã `std :: unordered_map`ã®å éšè¡šçŸãäœåºŠãåæ§ç¯ãããããã` std :: map`ã®ã¡ã³ããã³ã¹ãåãå ¥ããã»ããç°¡åã§ãã å®éã `std :: unordered_map`å ã§ã¯ãå®éã«ã¯ãå€ã®ãã§ãŒã³ã®é åã§ãããããŒãšå€ã®é¢ä¿ãé »ç¹ã«å€æŽããã»ã©ãå¹æã¯äœããªããŸãã ããã«é«éãªããŒæœåºã§ã¯ãããã§ããªããæãããšã¯ã§ããŸããïŒå€§ããªã¢ã¬ã€ãåæ§ç¯ããããšã¯åžžã«é«äŸ¡ã§ãã
3çªç®ã®éèŠãªãã€ã³ãã¯ããžãã¯ã§ãã æåã«æãå¹ççãªã¢ã«ãŽãªãºã ãèšè¿°ããŠãããããŒã¿ãæ©èœãããšãã«ããŒã¿ãä¿åããã®ã«è«ççã«é©åãªãã®ã確èªããŸãã åžžã«å¯äžã®æçœãªæ¹æ³ã§ã³ã³ãããéžæããããã«ããŠãã ããã äžæã®å€ã®ã»ãããå¿ èŠã§ã-ãstd :: setããååŸãããã£ãã«å€æŽãããªãèŸæžãå¿ èŠã§ã-æ°è»œã«ãstd :: unordered_mapãã䜿çšããŸããé åãå¿ èŠã§ããã®ãµã€ãºãäºåã«ããããŸãã-ãstd :: dequeããå¿ èŠã«ãªãå¯èœæ§ãé«ãã§ããé åã®ãµã€ãºãäºåã«ããã£ãŠããå Žåãéåžžã® `std :: vector`ãæ©èœããŸãã
4çªç®ã¯ããã©ãŒãã³ã¹æž¬å®ã§ãã ã³ã³ãããŸãã¯ã¢ã«ãŽãªãºã ã®éžæã«é¢ãã決å®ããé¡äŒŒã®ã³ã³ããã§ã©ã³ã¿ã€ã ããã¹ãããæ¯èŒåæã§åžžã«ç¢ºèªããå¿ èŠããããŸãã ãããã£ãŠããœãŒãããããstd :: vectorãããŒãšå€ã®ãã¢ã¯ããã®é¢ä¿ã䜿çšããŠæ§ç¯ãããè«ççã«é©åãªãstd :: mapããããåŠçãå¹ççã§ããããšãå€æããå ŽåããããŸãã
ããã°ã©ã ã³ãŒãã®ã€ããªãã®ãŒãã¥ãŒãäœæã§ããŸãããä¿¡é Œãã¹ãå¯äžã®æš©éã¯ãããã¡ã€ã©ãŒã§ãããããã¡ã€ã©ãŒã¯ããã®æ§æã®ããŸããŸãªããŒãžã§ã³ã®ã³ãŒãã®ã©ã³ã¿ã€ã ã枬å®ããŸãã
ããã¹ãè²»çš
ããã¹ããæ±ãéã«æåã«åŠã¶ã¹ãæãéèŠãªããšïŒ `std :: string`ã¯ãããã¹ããŸãã¯ãã®äžéšãä¿åããã³åŠçããå¯äžã®æ¹æ³ã§ã¯ãããŸããã éšåæååã®å Žåã倧ããªæååã®åéšåã®äžã«æ°çŸäžã®æ°ããã³ã³ãã `std :: string`ã眮ãå¿ èŠã¯ãããŸãã;åéšåæååã®å§ãŸããšçµããã瀺ãã®ã«ååã§ãã åãµãã¹ããªã³ã°ã«æ°ããé£ç¶ã¡ã¢ãªãããã¯ãæ§ç¯ãããœãŒã¹è¡ã«ä¿åãããŠããããã¹ãã®äžéšãã³ããŒãããããããœãŒã¹è¡ã§éå§/çµäºã€ãã¬ãŒã¿ãŒã®ãã¢ã§æ§é ãéå§ããæ¹ãé©åã§ãã
äŸïŒnullã§çµããæååãžã®ãã€ã³ã¿ãŒãšããŠè¡šãããããã¹ãå ã®ãã¹ãŠã®åèªãæ€çŽ¢ããŸãã ç°¡åã«ããããã«ãåèªãã»ãã³ãã³ã§åºåã£ãŠã¿ãŸãããã
template <typename word_type> void find_words(char const *text, std::deque<word_type>& result) { char const *start = text; char const *finish = text + std::strlen(text); while (start < finish) { char const* last = std::strchr(start, ';'); if (!last) last = finish; result.push_back(word_type(start, last)); start = last + 1; } }
`word_type`ãšããŠãæšæºã®` std :: string`ãšããœãŒã¹æååã®éšåæååã®å é ãšæ«å°Ÿãžã®ãã€ã³ã¿ãæ ŒçŽããç¬èªã®åã®äž¡æ¹ãè©ŠããŸãã
struct one_word { one_word(char const *begin, char const *end) : m_begin(begin), m_end(end) { } char const *m_begin, *m_end; };
åçŽãªæ¯èŒæž¬å®ã®çµæã `std :: string`ã³ã³ãããŒã§çµ¶å¯Ÿã«äžèŠãªäžéè¡ãçæããæéãç¡é§ã«ããªããšãã³ãŒãã®å®è¡ã15ã20åéããªããŸãã ã»ãšãã©ã®åèªãå ã ãstd :: stringãã§äºçŽãããŠãã16æåã®ãããã¡ãŒã«åãŸããªãå Žåããµãã¹ããªã³ã°ãä¿åããããã«æ°ããã¡ã¢ãªãããã¯ãåçã«å²ãåœãŠãå¿ èŠããããŸãã åæåäžã®ã¯ã©ã¹ `one_word`ã¯ãæåãžã®ãã€ã³ã¿ãŒåã®2ã€ã®ãã£ãŒã«ãã®ã¿ãåããŸããããã¯ããµãã¹ããªã³ã°ãééããã®ã«ååã§ãã
Boostã©ã€ãã©ãªã¯æé©åãç¹ã«ç¡èŠãããããçªç¶ãboost :: splitããŸãã¯ãboost :: regexãã䜿çšããããšã«æ±ºããå Žåãããããçš®é¡ã®äžèŠãªãã³ã»ã³ã¹ã®å€§èŠæš¡ãªæé»ã®äœæã§æååã解æãããšãã«ãããã¡ã€ã©ãŒãããã©ãŒãã³ã¹ã®äœäžãæ£ç¢ºã«ç€ºããšãã«ãã®æ±ºå®ãèŠããŠãããŠãã ããã
JSONãXMLããã¹ãŠãã¹ãŠ
ããã¹ããããã³ã«ã䜿çšããã«ã¯ãã§ããã ãæ éã«å¯ŸåŠããå¿ èŠããããŸãã åã®äŸã瀺ãããã«ãè£å©ãªããžã§ã¯ããäœæãããšãã®ããããªèª€èšç®ã¯ãäžèŠå®å šã«ç¡å®³ãªã³ãŒãã®ããã©ãŒãã³ã¹ãæãªãå¯èœæ§ããããŸãã
äžè¬çã«åãå ¥ããããŠãããããã³ã«ã®ããããã«ã€ããŠãã©ã€ãã©ãªãå€æ°ãããŸãã ãã ããåçŽãªçå®ãèŠããŠããå¿ èŠããããŸãã
äœããããŸãã ã©ãããã§ãXML / JSON / YAMLæ§é ãèªã¿åãå Žåãå®å šãªããªãŒãæ§ç¯ããããšã¯ã»ãšãã©ãããŸããã éåžžãåãã¿ã€ãã®äžé£ã®å€ãæœåºããããšã«ãªããŸãã
第äºã«ãã¿ã¹ã¯ã®ããã©ãŒãã³ã¹ãéèŠã§ããå Žåãè»èŒªãåçºæããããšã軜daããªãã§ãã ãããããªãã®ã±ãŒã¹ã¯éåžžã«ç¹æ®ã§ãããããbeatãããéãæŸæ£ããããšãæ£ãã決å®ã«ãªããŸãã
第äžïŒã·ãªã¢ã«åãããšãã¯ãã¹ã¿ãã¯äžã«ãããã¡ãçæããŠååŸããŠã¿ãŠãã ãã ã ãããäžå¯èœãªå Žåã¯ãäºåã«äºçŽåŒã³åºãã䜿çšããŠãstd :: stringãã«æžã蟌ã¿ãŸãã æåã« `std :: stringstream`ã䜿çšããŠRAMå šäœãæ£ããã次ã«ããããæååãåéããããã«ããã«çµæã«çµã¿èŸŒãããšãã§ãããã®ãäžç·ã«æ¥çãããšãã³ãŒããæå¹ã«ãªãããšã¯ãããŸããã
宿é¡ãšããŠã `std :: stringstream`ã䜿çšããŠãããã䜿çšããã«ãåãXMLã§å€§ããªããã¹ãæ§æãçæããããã©ãŒãã³ã¹ãæ¯èŒããŸãã æçåã®ç©ŽãããããããããŒãºã®åœ¢ã®RAMã«ã¯é床ããããŸããã
ããŒã¹ãå¿çããŸã
ããŒã¿ããŒã¹ãç §äŒãããšããã³ã³ãã€ã«æ®µéã§ã©ã®ã¿ã€ãã®å€ãè¿ããããã¯ããããŸããã ããæ£ç¢ºã«ã¯ãã¯ãšãªæååãäœæã§ããC ++åŽã®åçŽãªSQLã®ãããªORMã§ã©ããããããšãã§ããŸãããäž»ãªããšã¯ãã³ã³ãã€ã«æ®µéã§ã¯ãããŒã¿ããŒã¹ãå¿çã§äœãèšã£ãŠãããã»ãšãã©ããããŸããã
ãã®ç¹ã§ãåãPythonãRubyãããã³JavaScriptã®ãããªå±æ§ããªã³ã¶ãã©ã€ã§çæããåçã«åä»ããããèšèªã¯ãéçåä»ããåããã³ã³ãã€ã«èšèªãããæ確ãªå©ç¹ããããŸãã
ãã¡ããã `IntField`ã` FloatField`ãããã³ãã®ä»ã® `* Field`ã®ãããªããããçš®é¡ã®ã¿ã€ããã` BaseField`ã®ãããªå ±éã®ç¥å ã§å®è¡ãããªã³ã¯ããã³ãã€ã³ã¿ãŒã®ãã£ã¹ãã䜿çšããŠãã³ãŒãã®ãã¹ãŠã®ãã©ã³ãã«èŠããããšãã§ããŸãã ããã«ãããäžè¬ã«ããŒã¿ããŒã¹ããã®åäžã®å¿çãæçåãããå°ããªã¡ã¢ãªã»ã«ã«ããã·ã¥ãããŸãã
ãã ããã¢ã«ãããŒã®æåã® 3ã€ã® ã¬ãã¹ã³ãæãåºããšãC ++èšèªã®å¶éãç°¡åã«åé¿ããæ¶åå¯èœãªAPIãååŸã§ããŸãã æ®ã£ãŠããã®ã¯ãåã¬ã³ãŒãã®åãã£ãŒã«ãã«ã¡ã¢ãªãåçã«å²ãåœãŠãã³ã¹ããæå°éã«ããããšã§ãã ããã¯ããã»ã©é£ãããããŸããã
SQLã¯ãšãªã«å¿çããåŸæ¥ã®DBMSã¯ã衚圢åŒã®ããŒã¿ãæäŸããŸããã€ãŸããã³ã³ãã€ã«æ®µéã§ã¯ãªããå®è¡æ®µéã§ã¯ãããã®ã®ãåã¬ã³ãŒãã®åœ¢åŒãããããŸãã ã¬ã³ãŒãã®æ§é ã«ãããæåã«åèšã§ãã¹ãŠã®ãã£ãŒã«ãã®ãã¹ãŠã®ããŒã¿ã«ã¡ã¢ãªãå²ãåœãŠãããšãã§ããŸãã å°æ¥çã«ã¯ãå€ãè¯ããé 眮æ°ãããã¯ãæºåãããã¡ã¢ãªã»ã«ã«ãã£ãŠãã£ãŒã«ãå€ããœãŒãããã®ã«åœ¹ç«ã¡ãŸãã 次ã®ããã«ãªããŸãã
- ãªã¯ãšã¹ãã®ã¡ã¿ããŒã¿ãããã¯ãšãªçµæã®åãã£ãŒã«ãã®ããŒã¿åãåŠç¿ããŸãã ããŒã¿ããŒã¹åŽã®åã¿ã€ãã«ã¯ãããžãã¹ããžãã¯åŽã«ãåæ§ã®ã¿ã€ãããããŸãã ã¹ã«ã©ãŒããŒã¿ã¯åºå®ãµã€ãºã®ããŒã¿ââã§ããããããã«ã¡ã¢ãªãå²ãåœãŠãããšã¯ãããã¡ã«ã¹ããŒã¹ãæ®ãããšãæå³ããã³ã³ã¹ãã©ã¯ã¿ã¯å¿ èŠãããŸããã ããŒãã«è¿œå ã¡ã¢ãªãå²ãåœãŠãããŒã¿ã§ã¯ãããå°ãè€éã§ããããšãã°ããã¿ã€ããããã¹ãã®è¡šçŸãè¡šããstd :: stringãã§ãã ãããã `std :: string`èªäœã¯ç¹å®ã®ãµã€ãºãæã£ãŠãããããããŒã¿ããŒã¹å ã®ã©ã®ã¿ã€ãã®ãã£ãŒã«ãã«ã€ããŠããããžãã¹ããžãã¯åŽã®ã¿ã€ããšãµã€ãºãç¥ã£ãŠãããšèšããŸãã
- 次ã«ãã¬ã³ãŒããã£ãŒã«ãã®ã¿ã€ãã®ãµã€ãºãåçŽã«åèšããåã¬ã³ãŒãã®ããŒã¿ãããã¯ã®ãµã€ãºãååŸããŸãã ã¯ãšãªçµæå šäœã«ã¡ã¢ãªãå²ãåœãŠãããã«ããã¹ãŠã®ãã£ãŒã«ãã«äžåºŠã¡ã¢ãªãå²ãåœãŠãããšãã§ããŸãã ã¯ãšãªçµæã®ã¡ã¿ããŒã¿ãããã£ãŒã«ããèªã¿èŸŒãã çŽåŸã«ãã¡ã¢ãªã®ããŒãã«äžåºŠã ãç»ãããšãããããŸããã æäœã®è€éãã¯ããªã¯ãšã¹ãã®çµæãšããŠãã£ãŒã«ãã®æ°ã®åæ°ã«ãªããŸãïŒ1000åã®ãã£ãŒã«ãããªã¯ãšã¹ãããããšããŠãã1000Ã*çµæãšããŠã®ã¬ã³ãŒãæ°*ãããŸããªIField *ã«ã¡ã¢ãªãå²ãåœãŠããããã¯ããã«ç°¡åã§ãã
- ããŒã¿åŠçã®å©äŸ¿æ§ã®ããã«ãç¹å®ã®ã¯ã©ã¹ãã£ãŒã«ããäœæããå¿ èŠããããŸãã ããã¯ãC ++ Academyã®æåã® 2ã€ã®è¬çŸ©ããã®åçã«åæå®ãããããŒã¿ãå«ãã³ã³ãããŒã«ãªããŸãã å®éãããããã«å€ããããŸãããã¿ã€ãã¯ãªãã·ã§ã³ã§ä¿åãããŸããããã¯ã察å¿ããããŒã¿ã»ã«ã®ãªã¯ãšã¹ãã®çµæã®ã¿ã€ãããŸãã¯NULLã«å¯Ÿå¿ããŸãã
- ããŒã¿ããŒã¹ã«ä¿åãããŠããããŒã¿åã®å€§éšåã¯ããã¹ãã§ãããããããŒãã®ä»£ããã«çŽæ¥ããã£ãŒã«ããã¡ã¢ãªã«æ ŒçŽããããstd :: stringãã§ã¯ãªããããŒã¿ããŒã¹åŽã§å¶éããããµã€ãºã®å°ããªè¡ãã€ã³ã©ã€ã³åããããšã¯çã«ããªã£ãŠããŸãã ãã®å Žåãã¡ã¢ãªãå²ãåœãŠããšãã«æé©ãªæé©åãåŸãããŸããã `char m_text [SIZE]`ã¯ããèªäœã§ã¯äœãå®è¡ãããæååãšã¡ã¢ãªãæäœããpure sã®æ©èœã¯é©å¿ããªããããå¿ èŠãªã¡ãœããã®å®è£ ã«èŠããå¿ èŠããããŸãããŒã¿ããŒã¹ã
- äž»ãªããšã¯ãã¬ã³ãŒãå ã®åã¿ã€ãã®ã¡ã¢ãªãéžæããåŸã `newïŒ<where>ïŒTypeïŒ<parameters>ïŒ`ã³ã³ã¹ãã©ã¯ãã䜿çšããŠãããã®ãã£ãŒã«ããäœæããããšã§ãã
å®è£ ã§ã©ã®ããã«èŠãããã以äžã«ç€ºããŸãã ã¡ã€ã³ã¯ã©ã¹ã¯ãããŒã¿ããŒã¹ã§äœ¿çšããä»»æã®åããåçã«åæå®ããããã£ãŒã«ãã³ã³ãããŒã§ãã ã¹ã«ã©ãŒåãããã¹ãããŒã¿ãããã³NULLã®ã¿ãããå Žåã次ã®ããã«ãªããŸãã
class field { public: template <typename value_type> field(void* address, value_type const& value); template <typename value_type> field& operator = (value_type const& value); template <typename value_type> value_type get_as() const; bool is_null() const; protected: class data; private: data* m_data; }; class field::data {...}; template <typename value_type> class data_holder : public field::data { public: data_holder(); // NULL data_holder(value_type const& value); < > private: value_type m_value; }; template <typename value_type> field::field(void* address, value_type const& value) : m_data(new(address) data_holder(value)) { }
ã¯ãšãªã®çµæãšããŠãã£ãŒã«ããåé 眮ããã³åé€ããæäœããŸããªå Žåã¯ããããã¯å šäœã®ã¡ã¢ãªã倧èã«ãã¯ãã«åããŸãã çµæå ã®ããŒã¿ã䜿çšããŠã¿ã°ã²ãŒã ãç©æ¥µçã«ãã¬ã€ããå Žåã¯ãåã»ã«ã®ã¡ã¢ãªãåå¥ã«å²ãåœãŠãããã¡ã¢ãªãããã®é åãéžæããŸãã ãã®å ŽåããAcademy C ++ãã®2åç®ã®è¬çŸ©ã®ã¢ãã«ãããé©ããŠããŸãããã®å Žåããªããžã§ã¯ãã®å®è£ çšã®ã¡ã¢ãªãã¯ã©ã¹ããŒã¿ã«æ ŒçŽããå®è£ å ã«æ¢ã«ãããæ°ããé 眮ããä»ããŠåæåããŸãã std ::å質ãªããžã§ã¯ãã®deque`ãããã³ãã®ä»-ãªããžã§ã¯ãå ã§ã®ããã°ããŒã¿ã®äœ¿çšãå¶éããŸãã ã¬ã³ãŒãã¡ã¢ãªå ã®è¡ãã€ã³ã©ã€ã³åããããšã¯ã§ããªããªããŸããããã£ãŒã«ãã®ååšãšé åºã«ãã£ãŠç°¡åã«ãã¬ã€ããããšãã§ããŸããããã¯ãéãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ããä»ã®ããžãã¹ããžãã¯ããååŸããçµæãããã«åŠçãããããã·ããžãã¯ã«ãšã£ãŠéèŠã§ããã§ããã 次ã«ããã£ãŒã«ãã¿ã€ãèªäœãå°ãç°ãªããŸãã
class field { public: // template <typename value_type> field(value_type const& value); < > private: data* m_data; uint8_t m_buffer[MAX_FIELD_SIZE]; };
ããã§ãã¢ã«ãããŒã³ãŒã¹ã®åé ã§ãã€ãããã¯ã¿ã€ãã³ã°ã®ã¡ã«ããºã ã説æãã培åºæ§ãšã2çªç®ã®ã¬ãã¹ã³ã§ã¯ã©ã¹å ã«ä»¥åã¯æªç¥ã®ã¿ã€ãã®ããŒã¿ãé 眮ããå Žåã®ã¡ã¢ãªã®ç¯çŽã«ã€ããŠèª¬æããŸããã
ã©ã®ãã¹ãéžæããŠããã¬ã³ãŒãå šäœããŸãã¯ããžãã¹ããžãã¯åŽã®ã¯ãšãªçµæå šäœããŸãã¯åã¬ã³ãŒãã®ãã£ãŒã«ããããã®æè»ãªå¶åŸ¡ã®ããã®åäžã®ã¡ã¢ãªãããã¯ã¯ãåãã£ãŒã«ããžã®å€§éã®ã¡ã¢ãªå²ãåœãŠãããåªããŠããããã€ã³ã¿ã䜿çšããŠæäœããŸãåã®å®æ°ãã£ã¹ããè¡ãããã€ã³ã¿ãŒãã§ãŒã¹äžã
éãïŒ é²é³ããããŸãïŒ
ã©ã¡ãã®å Žåã§ããã¬ã³ãŒãã¯ã©ã¹ã¯æ¬¡ã®ããã«æ©èœããŸãã
- ãã£ãŒã«ãæ å ±ã®ã»ããã䜿çšããåæåã
- ã¡ã¿æ å ±ã«ããã¡ã¢ãªå²ãåœãŠã¯1åã®ã¿çºçããŸãã
- 次ã«ãã«ãŒãå ã®ã¬ã³ãŒããã£ãŒã«ãã®ãªã¹ãã«ãåŸç¶ã®åã¬ã³ãŒããã£ãŒã«ãã®å ±æã¡ã¢ãªã«å¯Ÿãããªãã»ãããèšå®ãããŸãã
- ãã£ãŒã«ãã«é¢ããæ å ±ã«å€ãããã«å«ãŸããŠããå Žåã¯ãå€ãšãšãã«ãã£ãŒã«ããããã«ç®çã®ã¢ãã¬ã¹ã«çŽæ¥åæåããŸãã
ã¬ã³ãŒãã®å®è£ ã¯ãã¬ã³ãŒãå šäœã«ã¢ããªã·ãã¯ããŒã¿ãããã¯ãããããåçã«åæå®ãããã³ã³ãã³ããæã€åãåã®äº€æå¯èœãªèŠçŽ ã®ã»ããã§ãããã«ãã£ãŠãå°ãç°ãªããŸãã åäžã®ã¡ã¢ãªãããã¯ã®èšé²å®è£ ãã©ã®ããã«èŠãããã®äŸã瀺ããŸãã
class record { public: record(query_result const& result, size_t row); // field field [const]& operator[](< int, char const* std::string const&>) [const]; private: std::vector<uint8_t> m_buffer; std::vector<field> m_fields; }; record::record(query_result const& result, size_t row) { size_t buffer_size = std::accumulate( result.types().begin(), result.types().end(), 0, [](size_t init, field::type type){ return init + type.size(); }); m_buffer.resize(buffer_size); m_fields.reserve(result.types().size()); for(size_t offset=0, index=0; index<result.types().size(); ++index) { m_fields.push_back(field(offset,result[row][index])); offset += result.type_of(index).size(); } }
æ倧å éã䜿çšããã¯ãšãªçµæå šäœã«å¯ŸããŠ1ã€ã®ã¡ã¢ãªãããã¯ã䜿çšããå Žåãæžã蟌ã¿ã³ãŒãã¯ãããã«å€æŽãããŸãã
class record { public: // record(void* address, query_result const& result, size_t row); < > private: std::vector<field> m_fields; < > };
æãéèŠãªæé©å
ã¯ãšãªçµæããããžãã¹ããžãã¯åŽã®ãã¬ãŒã³ããŒã·ã§ã³ãã£ãŒã«ãã«ãã£ãŒã«ããå±éããããšã¯ã¯ãŒã«ã§ãããéåžžã«é »ç¹ã«çµ¶å¯Ÿã«äžèŠã§ããããšãèŠããŠããããšãéèŠã§ãã ã¯ã©ã€ã¢ã³ãããŒã¿ããŒã¹APIããJSONãçŽæ¥çæããå¿ èŠãããå Žåãããããã«å€æ°ã® `field`ãªããžã§ã¯ããæã€` record`ãªããžã§ã¯ãã®æéãäœæããå¿ èŠã¯ãããŸããã æé©åãããŠããŠãããã®ã¢ã¯ã·ã§ã³ã¯äžèŠã§ãã ã¹ã¿ãã¯äžã«ãããã¡ãäœæããJSONãXMLãYAMLããŸãã¯ã¯ã©ã€ã¢ã³ããæåŸ ããå¥ã®åœ¢åŒã®åœ¢åŒã§ã¯ãšãªçµæãè¿œå ããŠéä¿¡ããŸãã
ããããäžéšã®ã³ãŒããè€éãªåŠçã®ããã«å éšåœ¢åŒã§ããŒã¿ã»ãããæ£ç¢ºã«åŠçããããšãæåŸ ããŠããå Žåã¯ãçããªãããã§äŸ¿å©ãªãã¬ãŒã³ããŒã·ã§ã³ãçæããå¿ èŠããããŸãã boolã®ãããªåçŽãªçããæåŸ ãããŠããå Žåãã€ãŸãããããhelloããŒã¹ããæ¥ããã©ãããæå³ããå Žåãtrueã«çããããã«æ§é [["hello"]]ãçæããå¿ èŠã¯ãŸã£ãããããŸããã
ã¢ã«ãŽãªãºã ã«è¿œå ã®ã¹ããããè¿œå ããªãã§ãã ãã-ãããæãéèŠãªæé©åã§ãã
äžæ» ãšæ°žä¹
åŠã¶å¿ èŠãããäž»ãªããšã¯ãCã®ããã«C ++ãããã»ã¹ã¡ã¢ãªãžã®çŽæ¥ã¢ã¯ã»ã¹ãæäŸããããšã§ãããŸããã¹ã¿ãã¯äžã®ã¡ã¢ãªãéèŠã§ããã次ã«ãäºåã«å²ãåœãŠããã䜿çšã®ããã«æºåããããããã¡å ã®ã¡ã¢ãªã§ãã JavaãCïŒããŸãã¯Pythonã¯ãC / C ++ã§æ£ããèšè¿°ãããããã°ã©ã ã®ããã©ãŒãã³ã¹ã«è¿ããã®ã§ã¯ãããŸããããŸãã«ãã¡ã¢ãªã䜿çšããäžé©åãªäœæ¥ããããã°ã©ããä¿è·ããããã§ãã ãããã³ã«ãã±ããçšã«ã¹ã¿ãã¯äžã«æ°ãããã€ãã®ã¡ã¢ãªãå²ãåœãŠããã€ã³ã¿ã§åãããããã¯ãŒã¯äžã®éä¿¡æ©èœãšããŠã¹ã¿ãã¯äžã®ãââããã¡ãžã®ãªã³ã¯ãäžããããšãã§ããŸãã ãã®ããã« `std :: vector <uint8_t>`ããããã¯ããå¿ èŠã¯ãããŸãããçŽç²ã§åçŽãªsã®ã¹ã¿ã€ã«ã® `uint8_t packet_buffer [MAX_PACKET_SIZE]`ã§ååã§ãã
C ++èšèªã¯ãCèšèªæ§é ã®äžã«äŸ¿å©ãªé«ã¬ãã«èšèªæ§é ãæ§ç¯ããæ©èœãæäŸããŸããããã䜿çšããå¿ èŠããããŸãã ãã¿ãŒã³ã¯èšããŸã§ããªããã³ã³ã¹ãã©ã¯ã¿ãšãã¹ãã©ã¯ã¿ã䜿çšãããäŸå€ãã¹ããŒããããšã¯çœªã§ãã ãã®ãããã³ãææããŠããå Žåãã¯ãããŒã¯è¯å¥œã«ãªããŸãããããã§ãªãå ŽåãããããªããïŒè¿æïŒåãJavaïŒã«èªåé»åã¬ã³ãžãããã®ã§ãã¯ãããŒãçŒããŠã¿ãŠãã ããã
C ++èšèªã¯ãé«ã¬ãã«èšèªã§å®è£ ãããã¢ã«ãŽãªãºã ã®æé©åããã³ãŒããããã¹ãŠãçµãåºãã®ã«æé©ã§ãã ãããè¡ãããã«ã `std :: map`ãå·¡åããè€éããç¥ãå¿ èŠã¯ãŸã£ãããããŸãã-æã ãåã«vectorã®vectorã®ä»£ããã«éåžžã®T **ã䜿çšããå¿ èŠããããŸãã ãŸãã¯ããããã¯ãŒã¯çµç±ã§éä¿¡ããããã«ãstd :: stringãã®ãµã€ãºãç¡æå³ã«çæãã代ããã«ãã¹ã¿ãã¯äžã®ãã¹ãŠãååŸããŠå®è¡ããŸãã
äž»ãªããšã¯ãé ãæããããŠãã³ãŒãã®åè¡ã§äœããããã«ã€ããŠå°ãèããããšã§ãã äœãç¹å¥ãªããšãè¡ãããŠããŸããïŒ çµå±ã®ãšãããç§ãã¡ãã³ãŒãã®é床ãæé©åããã®ã¯ã圫å»å®¶ã®ããã«äœåãªéšåãåãæšãŠãŠããããã§ãã é«åºŠãªæé©åã®æåããç¥ãããŸãïŒ
![ç»å](https://xakep.ru/wp-content/uploads/2015/04/cover_195_low-326x420.jpg)
Hacker MagazineïŒ195ã§æåã«çºè¡ãããŸããã
æçš¿è ïŒVladimir Qualab Kerimov ããªãŒãã£ã³ã°C ++éçºè ãParallels
ããã«ãŒã賌èªãã