
C ++ã®ãã³ãã¬ãŒãã®äœæè
ã¯ãäžé£ã®ç 究éçºã®åºç€ãç¯ããŸãããC++ãã³ãã¬ãŒãèšèªã¯
ãã¥ãŒãªã³ã°å®å
š ãã€ãŸãã¡ã¿ããã°ã©ã ïŒã³ã³ãã€ã«æ®µéã§åäœããããã«èšèšãããããã°ã©ã ïŒã§ãããC ++ã¯
èšç®å¯èœãªãã¹ãŠãèšç®ã§ããããšãå€æããŸããã å®éã«ã¯ãäžè¬åãããããŒã¿æ§é ãšã¢ã«ãŽãªãºã ãèšè¿°ããããã«ããã³ãã¬ãŒãã®åãæããã䜿çšãããŸããSTLïŒ
æšæºãã³ãã¬ãŒãã©ã€ãã©ãª ïŒã¯çããäŸã§ãã
ãã ãã
variadic
ãã³ãã¬ãŒããtype_traitsã©ã€ãã©ãªãã¿ãã«ãããã³
constexpr
åããC ++ 11ã®ç»å Žã«ãã
constexpr
ã¡ã¿ããã°ã©ãã³ã°ã¯ãã䟿å©ã§èŠèŠçã«ãªããç¹å®ã®ã³ã³ãã€ã©ãŒãŸãã¯è€éãªãã«ãã¹ããŒãªãŒã®æ¡åŒµã䜿çšããŠã®ã¿å®è£
ã§ããå€ãã®ã¢ã€ãã¢ã®å®è£
ãžã®éãéãããŸãããã¯ãã
ãã®èšäºã§ã¯ãã³ã³ãã€ã«ææ€çŽ¢çšã®ãã€ããªããªãŒã®å®è£
ãã€ãŸãã¿ãã«ã®è«ççãªãæ¡åŒµãã§ããããŒã¿æ§é ãéçºããŸãã ãã€ããªããªãŒããã³ãã¬ãŒããšããŠå®è£
ããã¡ã¿ããã°ã©ãã³ã°ãå®è·µããŸããã¢ã«ãŽãªãºã ãC ++ãã³ãã¬ãŒãèšèªã«ç§»æ€ããã ãã§ãªããååž°çã«ç§»æ€ããŸãã
å
容
çè«ã®ããã
æåã«ãããŒã¿æ§é ãšã¢ã«ãŽãªãºã ã«é¢ããããã€ãã®å®çŸ©ãšæŠå¿µãæãåºããŸãããã èªè
ãã°ã©ãçè«ã®åºç€ã«ç²ŸéããŠããå Žåãããã³/ãŸãã¯äºåæšãšãã®æºåæ¹æ³ãæ³åããŠããå Žåã¯ããã®ã»ã¯ã·ã§ã³ãã¹ãããããŠå®è£
ã®è©³çŽ°ã«çŽæ¥é²ãããšãã§ããŸãã
å®çŸ©ãªã©ïŒããªãŒããªãŒïŒå°çšã«ãŒãã®ãªãããªãŒïŒãŸãã¯åãªã
ããªãŒã¯ãé埪ç°ç¡åã°ã©ãã§ãã
ã«ãŒããæã€ããªãŒ -
ã«ãŒã ïŒã«ãŒãïŒãšåŒã°ããã1ã€ã®é ç¹ãéžæãããŠããããªãŒããªãŒã
ããŒã -ã«ãŒããæã€ããªãŒã®ããŒãã
芪ããŒããŸãã¯ããŒãXã®
芪㯠ãã«ãŒãRãããã®ããŒãXãžã®ãã¹äžã§Xã«å
è¡ããæåŸã®ããŒãã§ãããã®å ŽåãããŒãXã¯èšè¿°ããã芪ããŒãYã®
åãšåŒã°ããŸããããªãŒã®ã«ãŒãã«ã¯èŠªããããŸããã
ãªãŒãã¯ãåããŒããæããªãããŒãã§ãã
å
éšããŒãã¯ããªãŒãã§ã¯ãªãããŒãã§ãã
ããŒã X
ã®æ¬¡æ°ã¯ããã®ããŒãXã®åããŒãã®æ°ã§ãã
ããŒã X
ã®æ·±ãã¯ãã«ãŒãRãããã®ããŒãXãŸã§ã®ãã¹ã®é·ãã§ãã
ããŒãã®é«ã ïŒé«ãïŒ-ããŒãããã·ãŒããŸã§ã®æãåçŽãªïŒãªã¿ãŒã³ãªãïŒäžåããã¹ã®é·ãã
ããªãŒã®é«ã-ãã®ããªãŒã®ã«ãŒãã®é«ãã
é åºä»ããããããªãŒã¯ãåããŒãã®åããŒããé åºä»ããããŠããã«ãŒããæã€
ããªãŒã§ãïŒã€ãŸããåããŒãã®ã»ããã®1ãã
kãŸã§ã®èªç¶æ°ã®ã»ãããžã®ãããã³ã°ãæå®ãããŸãïŒ
kã¯ãã®ããŒãã®åããŒãã®ç·æ°ã§ãïŒã ç°¡åã«èšãã°ãååããŒãã«ã¯ãfirstãããsecondãã...ãã
k- thããšããååãä»ããããŸãã
ãã€ããªããªãŒã¯ïŒ
ååž°çã« ïŒç©ºã®ã»ããïŒããŒããå«ãŸãªãïŒã§ããããããŒãã®3ã€ã®äºãã«çŽ ãªã»ããã§æ§æãã
ãŸã ã
ã«ãŒãããŒã ã
å·ŠãµãããªãŒãšåŒã°ãããã€ããªããªãŒã
å³ãµãããªãŒãšåŒã°ãããã€ããªããªãŒã§ãã ãããã£ãŠããã€ããªããªãŒã¯ãåããŒãã®æ¬¡æ°ãæ倧2ã§ããå·Šãããã³/ãŸãã¯ãå³ãã®åããŒããæã€é åºä»ããããããªãŒã§ãã
å®å
šãªäºåæšã¯ãåããŒããèã§ãããã2ã®ã¹ãä¹ãæã€äºåæšã§ãã 次æ°1ã®åããŒãã«ãããŒã®åã·ãŒããè¿œå ããããšã«ããããã€ããªããå®å
šãªãã€ããªããªãŒãååŸã§ããŸãã
ãã€ããªæ€çŽ¢ããªãŒã¯ããã€ããªããªãŒãéããŠå®è£
ãããé¢é£ããŒã¿æ§é ã§ããããã®åããŒãã¯ã
ããŒãšé¢é£ããŒã¿ãå·Šå³ã®ãµãããªãŒãžã®ãªã³ã¯ãããã³èŠªããŒããžã®ãªã³ã¯ãå«ããªããžã§ã¯ãã§è¡šãããšãã§ããŸãã äºåæ¢çŽ¢æšã®ããŒã¯äºåæ¢çŽ¢æšã®
ç¹æ§ãæºãã
ãŸã ïŒ
XãããŒãã§ãããããŒãYãXã®å·ŠåŽã®ãµãããªãŒã«ããå Žåã Y.keyâ€X.key ã ããŒãYãXã®å³åŽã®ãµãããªãŒã«ããå Žåã X.keyâ€Y.key ã
ããŒãæ¯èŒãïŒæšç§»çãªé åºé¢ä¿ãããŒå€ã®ã»ããã§æå®ãããŠãããã€ãŸããããåçŽã«ãããå°ãªããæäœïŒãããŒã®ç䟡æ§ã«ã€ããŠè©±ãããšãã§ãããšç解ãããŠããŸãã äžè¬æ§ã倱ãããšã®ãªãå®è£
ã§ã¯ãé¢ä¿ã«åºã¥ããŠæ§ç¯ãããæäœã<ããšã==ãã®ã¿ã䜿çšããŠãå³å¯ãªé åºäžçåŒã§åäœããŸã
x=y LeftrightarrowïŒïŒx<yïŒ\ïŒ\ïŒ\ïŒïŒïŒy<xïŒ
ããªãŒãã©ããŒãµã«-ããŒãã®ãªã¹ãã圢æããé åºã¯ãã©ããŒãµã«ã®ã¿ã€ãã«ãã£ãŠæ±ºãŸããŸãã
ãŠã©ãŒã ã¢ããïŒã¿ãã«æäœãšæ°å€ãã¯ã©ã¹ã«å€ãã
ååž°çãªèéã«çã£åããé£ã³èŸŒã¿ãå±±æ¬åŒ§ã®æŽåã楜ããåã«ãã¡ã¿ãã¡ã³ã¯ã·ã§ã³ã®äœæãç·Žç¿ããŸãã 次ã«ãã¿ãã«
é£çµé¢æ°ãšãæ¢åã®ã¿ãã«ã«
åã
è¿œå ããé¢æ°ãå¿
èŠã§ãã
template <class U, class V> struct tuple_concat; template <class Tuple, class T> struct tuple_push;
åæäœã«ã€ããŠïŒãã¡ããããé£çµãããã¿ã€ãã³ã³ããããžã®ãè¿œå ãã®è©±ã¯ãããŸããã ããã¯ãã³ã³ãã€ã«æéã®äžçã®äžè¬çãã€éèŠãªæ©èœã§ãã
ç¹å®ã®åïŒã¯ã©ã¹ïŒãå€æŽããããšã¯ãã§ã«äžå¯èœã§ãããå¿
èŠãªããããã£ãæã€æ°ããïŒãŸãã¯æ¢åã®åãéžæããïŒåãå®çŸ©ããããšã¯å¯èœã§ãã
C ++ 11æšæºã§ã¯ã䟿å©ãªã¡ã¿é¢æ°ã®ã³ã¬ã¯ã·ã§ã³ãå«ã
type_traits
ããããŒãã¡ã€ã«ïŒã¿ã€ããµããŒãã©ã€ãã©ãªã®äžéšãšããŠïŒãå°å
¥ãããŠããŸãã ãããã¯ãã¹ãŠæ§é ã®ãã³ãã¬ãŒãã§ãããã€ã³ã¹ã¿ã³ã¹ååŸãç¹å®ã®ã¿ã€ãã®
type
ãŸãã¯æ°å€å®æ°
value
ãããŒã«ã«ã§å®çŸ©ã
value
ïŒãŸãã¯ã
std::enable_if
ã䜿çšããŠãªãŒããŒããŒããç¡å¹ã«ããå Žåã¯äœãããŸããïŒã ã¡ã¿ãã¡ã³ã¯ã·ã§ã³ãèšèšãããšããåãååãé å®ããŸãã
æåã®é¢æ°ã¯ãã³ãã¬ãŒãåŒæ°ãšããŠ2ã€ã®ã¿ãã«ãåãåãã2çªç®ã®é¢æ°ã¯ã¿ãã«ãšã¿ãã«ã«è¿œå ãããåãåãå
¥ããŸãã äžé©åãªåãåŒæ°ãšããŠçœ®ãæããïŒããšãã°ã
int
ãš
float
ãé£çµããããšããå ŽåïŒã¯ç¡æå³ãªæäœã§ããããããããã®æ§é ã®åºæ¬çãªãã³ãã¬ãŒãã¯å®çŸ©ãããŠãããïŒããã«ããä»»æã®åã®ã€ã³ã¹ã¿ã³ã¹åãé²æ¢ãããŸãïŒããã¹ãŠã®æçšãªäœæ¥ã¯
éšåçãªç¹æ®åã§è¡ãããŸãïŒ
template <template <class...> class T, class... Alist, class... Blist> struct tuple_concat<T<Alist...>, T<Blist...>> { using type = T<Alist..., Blist...>; }; template <template <class...> class Tuple, class... Args, class T> struct tuple_push<Tuple<Args...>,T> { using type = Tuple<Args..., T>; };
人éã®èšèªå°éåé
tuple_concat
ãžã®ããããã®ç¿»èš³ïŒ
2ã€ã®ã¯ã©ã¹ããã³ãã¬ãŒãåŒæ°ãšããŠæ©èœããåãã¯ã©ã¹ãã³ãã¬ãŒãïŒ T
ïŒãå¯å€æ°ã®åŒæ°ã§ã€ã³ã¹ã¿ã³ã¹åããçµæã§ããããããããã©ã¡ãŒã¿ãŒããã¯Alist
ããã³Blist
ã§ã€ã³ã¹ã¿ã³ã¹åãããå Žåã type
ãšã€ãªã¢ã¹ãã€ã³ã¹ã¿ã³ã¹åãšããŠããŒã«ã«ã«å®çŸ©ããŸãåŒæ°ãªã¹ããé£çµããåãã¯ã©ã¹ãã³ãã¬ãŒãT
ããŒãžã§ã³ãã€ãŸã T<Alist..., Blist...>
ãçšèªã«ã€ããŠïŒããã«ãã®èšäºã§ã¯ããã¡ã¿é¢æ°æ§é ãã³ãã¬ãŒãã®ã€ã³ã¹ã¿ã³ã¹åãïŒããæ£ç¢ºã§è³¢æãªïŒããã³ãã¡ã¿é¢æ°åŒã³åºããïŒããçãæ確ãªïŒãšããæŠå¿µããã°ãã°èå¥ãããŸãããæ¬è³ªçã«ã¯åãããšãæå³ããŸãïŒãããã°ã©ã ã®ãã®æç¹ã§ãæ§é ã¯ãã¹ãŠã®çµæãæã€ãã³ãã¬ãŒãããçæãããŸãçµæïŒãµã€ãºãååŸãããšã€ãªã¢ã¹ãšã¯ã©ã¹ãå
éšã§å®çŸ©ããããªã©ã ãªã©ãã
ããã¯äžåã«èãããŸãããå®éã«ã¯ãã¹ãŠãèŠãç®ãããåçŽã§ãïŒåãã¿ã€ãã®2ã€ã®ã¿ãã«ïŒããšãã°ã2ã€ã®
std::tuple
ïŒã§
tuple_concat
ã
tuple_concat
ããšãããšãå
¥åã¿ãã«ãžã®åŒæ°ã®ãã¹ãããããªã¹ããæã€åãã¿ãã«ã®ã¿ã€ããæ§é å
ã§æ±ºå®ãããŸã ä»ã®ã€ã³ã¹ã¿ã³ã¹åã®è©Šã¿ã¯ãåã«ã³ã³ãã€ã«ã§ããŸããïŒã³ã³ãã€ã©ãŒã¯äžèšã§å®çŸ©ãããéšåçãªç¹æ®åã®åãæšæž¬ã§ãããå
±éãã³ãã¬ãŒãã®ã€ã³ã¹ã¿ã³ã¹åã¯æ¬äœããªãããäžå¯èœã§ãïŒã äŸïŒ
using t1 = std::tuple<char,int>; using t2 = std::tuple<float,double>; using t3 = std::tuple<char,int,float,double>; using conc = typename tuple_concat<t1,t2>::type;
äžèšã«ç
§ãããŠã
tuple_push
ç¹æ®åã®æ€èšã¯é£ãããªã
tuple_push
ã§ãã ããã«ã䟿å®äžã察å¿ãã
ãã³ãã¬ãŒããšã€ãªã¢ã¹ãå®çŸ©ã
ãŸã ã
template <typename U, typename V> using tuple_concat_t = typename tuple_concat<U,V>::type; template <typename Tuple, typename T> using tuple_push_t = typename tuple_push<Tuple,T>::type;
ãã®äŸ¿å©ãªæ©èœã¯ãC ++ 11æšæºã®èšèªã«ç»å ŽããŸãããããšãã°ã
typename tuple_concat<t1,t2>::type
代ããã«
type
ã«ã¢ã¯ã»ã¹ããŠ
typename tuple_concat<t1,t2>::type
ã®ã¿ãèšè¿°ã§ããŸãã
é£çµã«ã€ããŠïŒæšæºtuple
ããããŒã«ã¯ãåŒæ°ãšããŠæž¡ãããæªå®çŸ©ã®std::tuple
ã®æ°ãé£çµããŠã¿ãã«ãæ§ç¯ããïŒéã¡ã¿ïŒé¢æ°tuple_cat()
ã®å®çŸ©ãå«ãŸããŸãã 泚ææ·±ãèªè
ã¯ãçµæã¿ã€ãdecltype(tuple_cat(...))
åºåããããšã§tuple_concat
ãããç°¡åã«å®è£
ã§ããããšã«æ°ä»ããããããŸããããæåã«ãäžèšã§ååŸããå®è£
ã¯ã¿ãã«std::tuple
ã¿ã€ãã«éå®ãããã次ã«ãããè€éãªã¿ã€ãã®ç®è¡æŒç®ã«åŸã
ã«æ²¡å
¥ããããã®æºåéåã
æåŸã®æºåïŒããžãã¹ã®ããã§ã¯ãªã
ããããã°ã®
éã®ããã«ãæŽæ°
ãåã«å€æããæ¹æ³ãåŠã³
ãŸã ïŒããªãŒã®ããŒãã«äœããä¿åããå¿
èŠããããŸãããŸããéåžžã®æ°åãä¿åãããããç°¡åã§äŸ¿å©ãªã®ã¯äœã§ããïŒ ãã ããããªãŒã¯åçŽã§ã¯ãªããåïŒããã³ã³ã³ãã€ã«æéïŒããããããæ°å€ã¯è€éã§ãªããã°ãªããŸããã å®éãå®è£
ã¯éåžžã«ã·ã³ãã«ã§æåã§ãã
äž¡æ¹ã®å®çŸ©ã®æå³ã¯åãã§ããç°ãªãæ°å€åŒæ°ã䜿çšããŠãã³ãã¬ãŒããã€ã³ã¹ã¿ã³ã¹åãããšãããŸããŸãªã¿ã€ãã®å®çŸ©ã«ãªããŸãïŒ
num_t<0>
ã
num_t<13>
ã
num_t<42>
ãªã©ã 䟿å®äžããã®æ§é ã«éçãªæ°å€valueãä»äžã
value
ãããã«ãããåæšè«ã«é Œããã«ïŒ
some_num_type::value
ã¢ã¯ã»ã¹ããŠïŒãã³ãã¬ãŒãåŒæ°ããæ瀺çã«æ°å€ãååŸã§ããŸãã
ãã€ããªæ€çŽ¢ããªãŒ
ãã€ããªæ€çŽ¢ããªãŒã®ååž°çãªå®çŸ©ã¯ããã³ãã¬ãŒãã®åœ¢ã§çŽæ¥å®è£
ããã®ã«äŸ¿å©ã§ãã ç°¡ç¥åãããå®çŸ©
ããªãŒïŒNIL | [ããªãŒãããŒã¿ãããªãŒ]
ãããªãŒã¯ç©ºã®ã»ããããŸãã¯ããªãŒïŒããããå·ŠãµãããªãŒïŒãããŒã¿ãããªãŒïŒããããå³ãµãããªãŒïŒã®3ã€ã®èŠçŽ ã®ã»ããããšèšãæããããšãã§ããŸãã
ããã«ããã§ã«è¿°ã¹ãããã«ããã€ããªæ€çŽ¢ããªãŒã§ã¯ãããªãŒã®ããŒãã«æ ŒçŽãããŠããå€ã®ã»ããã®é åºé¢ä¿ãæå®ããå¿
èŠããããŸãïŒäœããã®æ¹æ³ã§ããŒããæ¯èŒããã³é åºä»ãã§ãããã€ãŸãæäœããå°ãªããå¿
èŠããããŸãïŒã æšæºçãªã¢ãããŒãã¯ãããŒãããŒã¿ã
ããŒãš
å€ã«åå²ããããš
ã§ã ïŒããŒãæ¯èŒããå€ãä¿åããã ãã§ãïŒããå®è£
ã§ã¯ãäžè¬æ§ã倱ãããšãªãæ§é ãåçŽåããããã«ãããŒãããŒã¿ãåäžã®ã¿ã€ããšèŠãªããé åºé¢ä¿ãèšå®ããããã«ãç¹å¥ãªã¿ã€ãã®
Comp
ïŒ
ã³ã³ãã¬ãŒã¿ ã圌ã«ã€ããŠã®è©³çŽ°ã¯åŸã§ïŒã
ããã§ãããŒãã«æ ŒçŽãããŠããåã®ã»ããã§é åºé¢ä¿ãæå®ãããŠãããšããäºå®ã«ããããããããããããªãŒèªäœã«å±æ§ä»ãããŠããã®ããªãŒã®åã®äžéšãšããŠæ ŒçŽãããšäŸ¿å©ã§ãïŒç©ºã§ãªãããªãŒã®æ€çŽ¢ãæ¿å
¥ãããã³ãã©ããŒã¹ã®ã¡ã¿æ©èœãåŒã³åºãå Žåãè¿œå ã®ã³ã³ãã¬ãŒã¿ãŒã¯äžèŠã§ã
ç¶èŠªãšåäŸã«ã€ããŠïŒæ³šææ·±ãèªè
ã¯ãæ瀺ãããæ§é ã«ã¯ãã»ãšãã©ã®ã¢ã«ãŽãªãºã ã®å®è£
ã«ãšã£ãŠéèŠãªèŠçŽ ã1ã€æ¬ ããŠãããšããäºå®ã«æ³šæãæãã§ãããïŒèŠªããŒããžã®ãªã³ã¯ïŒãã®å Žåã芪ããªãŒã®ã¿ã€ãã®ãšã€ãªã¢ã¹ïŒã ããã«æ°ã¥ãããã®äžæ£ãä¿®æ£ããããšãããšãèªè
ã¯é
ããæ©ããææã«é¥ãããã®å Žå
ã¯ä»®åã®åšæçãªäŸåæ§ãããããšã«æ°ã¥ããŸãã
ç¶æ³èªäœã¯é倧ã§ã¯ãªãã宣èšãšåå®çŸ©ã®åé¢ãšãã圢ã§åé¿çããããŸãã
template<...> struct one { struct two; using three = one<two, ...>; struct two : one<three, ...> {}; };
泚ïŒãã®ãããªæ§é ã¯ãææ°ã®gccããã³clangã«ãã£ãŠã³ã³ãã€ã«ããã³ã€ã³ã¹ã¿ã³ã¹åãããããšãå®éšçã«èŠã€ãããŸãããããã®ãããªç°åžžãªãã³ãã¬ãŒãã®å®£èšã®æšæºãžã®å³å¯ãªæºæ ããŸã 確èªããŠããŸããã
ãã ããå®éã«ã¯ããã®ãããªãšã³ãã£ãã£ãæäœããŠäœæããããšã¯éåžžã«å°é£ã§ãã 芪èŠçŽ ãžã®éæ¹åãªã³ã¯ã¯èå³æ·±ãå¹æããããããŸããå®éããåçŽã«æ¥ç¶ãããããªãŒãã¯å®éã®ã°ã©ãïŒããããïŒïŒã«å€ãããŸããããã¯ãå€æŽãå ãããšã
ãäžåºŠã«ããå®å
šã« ïŒæ²ããïŒã€ã³ã¹ã¿ã³ã¹åããå¿
èŠããããŸãã ãã®ç¶æ³ã®ããæ·±ãåæã¯ããã®èšäºã®ç¯å²ãè¶
ããŠãããC ++ã§ã®ã¡ã¿ããã°ã©ãã³ã°ã®å¯èœæ§ã調æ»ããããã®ç§ã®ãããªãèšç»ã®1ã€ã§ãã
ããã¯ãããªãŒãå®è£
ããã³è¡šçŸããå¯äžã®æ¹æ³ã§ã¯ãããŸããïŒããšãã°ãããŒããã¿ãã«ã«æ ŒçŽããŠã€ã³ããã¯ã¹ãä»ããããšãã§ããŸãïŒããããããã®ãããªèšè¿°ã¯ãããªãŒäœæ¥ã¢ã«ãŽãªãºã ã®çŽæ¥é©çšã«ãšã£ãŠããèŠèŠçã§äŸ¿å©ã§ãã
泚æé¢ä¿
Comp
æ§é ã«ã¯ãã¡ã¿é¢æ°ã®åã®æ¯èŒïŒã€ãŸããããå°ãããçããæäœãã¿ãŒã³ïŒãå«ãŸããŠããå¿
èŠããããŸãã
sizeof
åïŒãã¹ãŠã®å®å
šãªåã«å¯ŸããŠå®çŸ©ãããŠããå¯äžã®æ°å€ç¹æ§ïŒã«åºã¥ããŠããã®ãããªæ¯èŒã®äŸãèšè¿°ããŸãããã
struct sizeof_comp { template <typename U, typename V> struct lt : std::integral_constant<bool, (sizeof(U) < sizeof(V))> {};
ããã§ã¯ãã¹ãŠãéæã§ããå¿
èŠããããŸããlt-åã®ã¡ã¿é¢æ°ã¯ãå°ãªãããeq-ã¡ã¿é¢æ°ã¯ãçãããã æ°å€ã®ã¿ã€ãã決å®ããããã«åã«ç€ºããã¢ãããŒãã䜿çšãããŸã
std::integral_constant
inherit_constantããã®ç¶æ¿ã¯ãã€ã³ã¹ã¿ã³ã¹åããã
lt
ããã³
eq
éçãªããŒã«å€ãäžããŸãã
å®éã«ã¯ãç¹å®ã®ã¿ã€ãã®ç¹å®ã®ããªãŒã«ããã®ã¿ã¹ã¯ã«åºæã®ã³ã³ãã¬ãŒã¿ãæäŸããå¿
èŠããããŸãã ããšãã°ãåè¿°ã®ãæ°å€åãã®ã¯ã©ã¹ã®æ¯èŒãèšè¿°ããŸãã
struct num_comp { template <typename U, typename V> struct lt : std::integral_constant<bool, (U::value < V::value)> {}; template <typename U, typename V> struct eq : std::integral_constant<bool, (U::value == V::value)> {}; };
ãã®ãããªã³ã³ãã¬ãŒã¿ã¯ãäžè¬çã«èšãã°ãæ®éçã§ãããéçãª
value
ãå«ãä»»æã®åãæ¯èŒã§ã
value
ã
CRTPãä»ããã³ã³ãã¬ãŒã¿çæã«ã€ããŠïŒçè«ã»ã¯ã·ã§ã³ã®ååã§ãæäœã¯ãå°ãªãããäžè¬çã«èšã£ãŠãæäœããçããããšçŽæçã«å€æããã®ã«ååã§ãããšè¿°ã¹ãŸããã CRTPïŒ
äžæè°ãªç¹°ãè¿ããã³ãã¬ãŒããã¿ãŒã³ ïŒã«äŒŒãã¢ãããŒãã䜿çšããŠãæäœïŒã¡ã¿é¢æ°ïŒããå°ãªããã³ã³ãã¬ãŒã¿ãŒã®ã¿ã«åºã¥ããŠå®å
šãªã³ã³ãã¬ãŒã¿ãŒã決å®ããŸãã
å®çŸ©ã®ãµã€ãºãå°ãããªããæ°åŠçãªèæ¯ãçŸããŸãããå®ç§ã§ã¯ãããŸãããïŒ
ããã§ãæ瀺çã«ãæã§ãæåã®ã¿ã€ãããªãŒãå®çŸ©ããããã®ãã¹ãŠãã§ããŸããã
using t1 = node< num_t<5>, node< num_t<3>, leaf<num_t<2>>, leaf<num_t<4>> >, node< num_t<7>, NIL, leaf<num_t<8>> > >;
泚ïŒä»¥äžãäŸã§ã¯ã num_comp
ããã©ã«ãã§æé»çã«æå®ãããŠããŸãããã³ãã¬ãŒãåŒæ°ã®ãªã¹ãã§ã®æ瀺çãªæ瀺ã¯çç¥ãããŠããŸãã äžè¬ã«ã insert
æäœãéçºããåŸããã®æ¹æ³ã§ããªãŒãæ§ç¯ããå¿
èŠã¯ãããŸããïŒæ瀺çãªå®çŸ©ïŒã
説æããããªãŒãå³ã«ç€ºããŸãã
ã³ã³ãã€ã«æã®ãããã°ã«ã€ããŠïŒå®çŸ©ããã¯ã©ã¹ãæå³ãããã®ãæ£ç¢ºã«èšè¿°ããŠããããšãã©ã®ããã«ç¢ºèªããŸããïŒ
è°è«ãšç 究ã®ããã®ãã®å¥åã®èå³æ·±ããããã¯ã¯ãã¡ã¿ããã°ã©ã ã®ãããã°ã§ãã åŒã³åºãã¹ã¿ãã¯ãå€æ°ãããŸããŸãã
printf/std::cout
ã¯ãããŸããã ã³ã³ãã€ã©ãšã©ãŒã¡ãã»ãŒãžå
ã«äººéãèªã¿åããæšå®åãåºåã§ããææ³ããããŸãããååãšããŠãããã¯çæãããæ§é ããã§ãã¯ããã®ã«ããªã圹ç«ã€æ©èœã§ãïŒããšãã°ãããªãŒãå€æŽããåŸïŒã
åã«èª€ã£ãããã°ã©ã ã®å Žåã¯ããã«ãã¡ã¬ãã€ãã®ãšã©ãŒã¡ãã»ãŒãžã®åé¡ã«è§ŠããŸããïŒç·Žç¿åŸãããã¯åé¡ã§ã¯ãªããªããŸããã»ãšãã©ã®å Žåãã€ã³ã¹ã¿ã³ã¹åã®æåã®ãšã©ãŒã®ã¿ããããªããšã©ãŒã®ã«ã¹ã±ãŒãã«ã€ãªããããã§ãã
ããããé説çã«èããããããããŸããããããã°ã©ã ãæ£åžžã«ã³ã³ãã€ã«ããããã©ãã§ããããïŒ ããã§ãèè
ã¯ãããã°æ¹æ³ã®éžæã«ãããŠãã§ã«èªç±ã§ãã
type_traits
å®çŸ©ãããŠãããããªã¡ã¿é¢æ°ã®çµæã®åã¯ã
typeid(t).name()
ãšããŠåçŽã«
type_traits
ã§ããŸãïŒC ++ 11以éãåæ³çã«RTTIãã¹ãã€ã§ããŸãïŒã åçŽãªããŒã¿æ§é ã¯ãæ«å°Ÿååž°ãåããç¹å¥ãªã¡ã¿é¢æ°ã䜿çšããŠç»é¢ã«è¡šç€ºã§ããŸããè€éãªæ§é ã®å Žåãæ§é èªäœã®æäœãšãããªã³ã¿ãŒãã®è€éããåçã«ããå¿
èŠããããŸãã
ããªãŒã©ã€ãã©ãªã«ã¯ãã®ãããªããªã³ã¿ãšãã®äœ¿çšäŸãå«ãŸããŠãããèªè
ã¯èšäºã®æåŸã«ããgithubãžã®ãªã³ã¯ã§ãããã«æ
£ããããšãã§ããŸãã ããšãã°ãäžèšã®äŸã®å°å·ãããããªãŒïŒ
/-{2}
/-{3}-<
\-{4}
-{5} --- <
\-{7}-\
\-{8}
身é·
äºåæšã®é«ããèšç®ããããã®ååž°é¢æ°ãèŠãŠã¿ãŸãããïŒ
///å
¥åïŒT-ããªãŒãåºåïŒh-é«ã
é«ãïŒTïŒïŒ
IF T == NIL
çµè«0
ãã®ä»
åºå1 +æ倧ïŒé«ãïŒT.LEFTïŒãé«ãïŒT.RIGHTïŒïŒ
圌女ã¯çŸããã ãã®é¢æ°ãC ++ã«ç§»æ€ããŠç§»æ€ããã ãã§ãã
泚ïŒèšç®ãããããªãŒã®é«ãã¯ãæ°åŠçãªå®çŸ©ããã1倧ãããªããŸãïŒç©ºã®ã»ããã®é«ãã¯å®çŸ©ãããŠããŸããïŒã , 1 , height
.
ã³ãŒãã¯éåžžã«ç°¡åã§ãïŒheight
空ã®ã»ããã§åŒã³åºããšã察å¿ããstaticãå«ãç¹æ®åãã€ã³ã¹ã¿ã³ã¹åãããŸãvalue = 0
ãããã§ãªãå Žåãã€ã³ã¹ã¿ã³ã¹åã®ã«ã¹ã±ãŒãã¯ãNIL
ååž°ãåæ¢ãã空ã®ãµãããªãŒïŒã€ãŸããåããµãããªãŒïŒã«åºäŒããŸã§ç¶ããŸããããã¯ãC ++ãã³ãã¬ãŒããä»ããŠååž°é¢æ°ãå®è£
ããéã®ç¹åŸŽçãªæ©èœã§ããååž°bottomãç¹æ®åããå¿
èŠããããŸããç¹æ®åããæç¹ã§äžèšã®é¢æ°ãååŸã§ããªãTree::LT
å ŽåTree
空ã®ãµãããªãŒãšçãããªããŸãNIL
ïŒãäžèšã®ã³ãŒãã¯é¢æ°ã䜿çšããŠããŸãmax
ãããã¯ããå¿
èŠãããconstexpr
ãã·ã³ãã«ã§ããç¥ãããŠããå®è£
ã®äŸïŒãŸãã¯ã¡ã¿æ©èœããããŠå°ãå€æŽãããåŒã³åºããŸãïŒïŒ template <typename T> constexpr T max(T a, T b) { return a < b ? b : a; }
æåŸã«ãé¢æ°ã䜿çšããŸãheight
ïŒ static_assert(height<t1>::value == 3, "")
é¢æ°ã®ãè€éããã«ã€ããŠè©±ããŸããããnåã®ã€ã³ã¹ã¿ã³ã¹åãheight
å¿
èŠã§ããnã¯ããªãŒããŒãã®æ°ã§ããã€ã³ã¹ã¿ã³ã¹åã®æ·±ãã¯h-ã€ãŸã æšã®é«ãããã以äžã«è€éã§ããªãããã«ããã®ã§ããïŒïŒ, , , : (!), - , . , : , constexpr
- variadic- .
: , gcc-5.4 « » ( ) 900 . , ( ). , height
gcc, > 900. O - ( ), .
, C++14 ( std::integer_sequence
): N 0..N-1, , . , , ( , 30- 9000- ).
, (.. ) : . ( , ..), , â , â API , , â ( « 24 »!).
ãã€ãã¹äžå¿ïŒã€ã³ãªãŒããŒãã©ããŒãµã«ïŒ
åé¿çã¯ãç¹å®ã®æ¹æ³ã§ããŒãïŒãŸãã¯ããŒãããã®ããŒã¿ïŒã®ãªã¹ããäœæããããšã§ããããã¯ãå®éã«éèŠãªçšèªã®åé¡ã§ãïŒãäžå€®ïŒå¯Ÿç§°ïŒãã©ããŒãµã«ã¯ãå·Šå³ã®ãµãããªãŒã®å¯Ÿå¿ãããã©ããŒãµã«ã®çµæã®éã§ããªãŒã®ã«ãŒããçºçãããã©ããŒãµã«ã§ããäžç·ã«äºåæ¢çŽ¢æšã®ç¹æ§ã¯ãããã¯ãäºåæ¢çŽ¢æšã®åšããäžå¿ã«ãæã
ãçæããããšãèšããŸãïŒãäžå¹³çã«ããçè«ãåç
§ïŒãããŒãã®ãœãŒãããããªã¹ãã¯ãŒã«ã- ïŒä»¥åã«å®çŸ©ãããããªãŒã®ãã©ããŒã¹ã¯æ¬¡ã®ããã«ãªããŸããååž°çãªåé¿ã¢ã«ãŽãªãºã ã¯éåžžã«ç°¡åã§ãã ///å
¥åïŒT-ããªãŒãåºåïŒw-ããŒãã®ããŒã¿ãé çªã«ãã©ããŒã¹ãããªã¹ã
é åºïŒTïŒïŒ
IF T == NIL
çµè«{}
ãã®ä»
åºåé ïŒT.LEFTïŒ+ {T.KEY} + INORDERïŒT.RIGHTïŒ
ãã®å Žåã®æäœã+ãã¯ããªã¹ãã®é£çµãæå³ããŸããã¯ããã¿ãã«ã¯ã³ã³ãã€ã«æã«åãªã¹ãã§ãããããã¿ãã«ãé£çµããããã«äœ¿çšãããã®ã§ãããããŠåã³-ã³ãŒããååŸããŠèšè¿°ããŸãã
ãã®å Žåãæ確ã«ããããã ãã«ãããŒã«ã«private
ãšã€ãªã¢ã¹ã䜿çšããŸããããã¹ãŠã®ãšã€ãªã¢ã¹ãçžäºã«çœ®ãæããŠãã©ã³ãã ã«çæãããè¡ã®åŸã«ã¹ã¿ããã£ã³ã°ãé£èªåããããšãã§ããã€ã³ãã³ãã§ãããä¿åãããŸãããããããç§ãã¡ã¯äººã
ã®ããã«åªåããŸãããïŒé¢æ°ã®è€éãwalk
ã¯OïŒnïŒã€ã³ã¹ã¿ã³ã¹åã§ããããã§ãnã¯ããªãŒããŒãã®æ°ã§ãïŒOè¡šèšã¯ç°¡ç¥åã«äœ¿çšãããŸããæ£ç¢ºãªã«ãŠã³ãã§ã¯ãé£çµãèæ
®ããŠçŽ3nã®ã¡ã¿é¢æ°åŒã³åºããè¡ãããŸãïŒãæ©èœããããšãããã®nice tuple_concat
ãštuple_push
1ã€ã®ã€ã³ã¹ã¿ã³ã¹åã®ããã«èªåã®ä»äºãè¡ã£ãŠã圌ãã¯ååž°çã§ã¯ãããŸããã®ã§ãïŒã¿ã€ãã®å¯èœæ§ã®æ€éã«äŒŽãparameter pack
ããïŒãäŸã®ããã«ãã€ã³ã¹ã¿ã³ã¹åã®æ·±ãã¯hã«height
çãã -æšã®é«ããã³ãŒãã®å¯èªæ§ã«ã€ããŠïŒ: , , .
: , , , . , : « ». , : , .
æ€çŽ¢ãã
ããŒæ€çŽ¢ã¯ãå€å
žçãªãã€ããªæ€çŽ¢ããªãŒã®äž»ãªæäœã§ãïŒååã¯ããèªäœãè¡šããŠããŸãïŒãããŒãšããŒã¿ãåé¢ããªãããšã«æ±ºããã®ã§ãå°å
¥ãããæ¯èŒåšã䜿çšããŠããŒããæ¯èŒãComp
ãŸããååž°çæ€çŽ¢ã¢ã«ãŽãªãºã ïŒ ///å
¥åïŒT-ããªãŒãk-ããŒã¿ã€ãã
///åºåïŒN-æ¯èŒã«é¢ããŠã¿ã€ãk` == kãå«ãããŒã
æ€çŽ¢ïŒTãkïŒïŒ
T == NILãŸãã¯k == T.KEYã®å Žå
çµè«T
ãã®ä»
IF k <T.KEY
åºåæ€çŽ¢ïŒT.LEFTãkïŒ
ãã®ä»
çµè«ã®æ€çŽ¢ïŒT.RIGHTãkïŒ
å®è£
ã¯ã以åã«éçºãããå®è£
ã«äŒŒãŠããŸãã
ããã¯ããå°ãè€éã«èŠããŸãããå¶ç¶ã§ã¯ãããŸããïŒãŸããã¢ã«ãŽãªãºã èªäœãããå€ãã®ãã©ã³ãïŒããå€ãã®æ¯èŒãšæ¡ä»¶ïŒãå«ãã§ããŸãã次ã«ãå
ã«å®çŸ©ããé åºé¢ä¿ãé©çšããããã«åºã¥ããŠãå·ŠãŸãã¯å³ãµãããªãŒã詳现ã«æ³šæããŠãã ããïŒ- åãæ¯èŒãââãã«ã¯ãããªãŒã®ã«ãŒãããã³ã³ãã¬ãŒã¿ã䜿çšããŸãïŒ
Tree::comp
è«ççã§ãïŒé åºé¢ä¿ã¯ãããªãŒã®æ§ç¯æ¹æ³ãšåŸç¶ã®æäœïŒæ€çŽ¢ãå«ãïŒã®äž¡æ¹ã決å®ãããããã³ã³ãã¬ãŒã¿ã®ãšã€ãªã¢ã¹ãããªãŒãã³ãã¬ãŒãïŒnode<>
ïŒå
ã«çŽæ¥é
眮ããã®ã䟿å©ã§ããã - ã¢ã¯ã»ã¹ããã«ã¯ãã³ãã¬ãŒãäŸåãã³ãã¬ãŒãåŒæ°ãïŒ
Tree::comp::eq<...>
ãšTree::comp::lt<...>
ïŒã¯ãããŒã¯ãŒãã䜿çšããå¿
èŠããããŸãtemplate
ã std::conditional
â , ( ?: ). â . , â .
ãã®ãããªã€ã³ããªã¡ã³ããŒã·ã§ã³ã®è€ésearch
å床- OïŒnïŒã®ã€ã³ã¹ã¿ã³ã¹ãæ·±ã- æéïŒæšã®é«ãïŒã ããããŠïŒããšé©ããèªè
ã¯ãæ€çŽ¢ã®å¯Ÿæ°çè€éããªã©ã¯ã©ãã ããïŒããšå«ã¶ãšãç³ã暪ã«é£ãã§std::conditional
ãæŒç®åãšã®æ ¹æ¬çãªéããæããã«ãªããŸããïŒ ::äžé
æŒç®åã¯è©äŸ¡ãããªãåŒãè©äŸ¡ããŸãããã®çµæïŒããšãã°ãè¯å¿ã§ãæŒç®åã®æåã®åŒæ°ã§ãã®ãã€ã³ã¿ãŒããã§ãã¯ãããšãã«ç Žæ£ããã2ã€ã®åŒã®ããããã§nullãã€ã³ã¿ãŒãéåç
§ã§ããŸãïŒãstd::conditional
ãŸãããã¹ãŠã®3ã€ã®åŒæ°ãã€ã³ã¹ã¿ã³ã¹åããçç±ã¯äžã€ã ãã§ããïŒéåžžã®ã¡ã¿é¢æ°ãªã©ïŒããstd::conditional
ååž°ãåæ¢ããã®ã«ååã§ã¯ãªããååž°ã®åºãç¹æ®åããå¿
èŠããããŸããçŽæ¥ã®çµæã¯ãæ ¹ããèãŸã§ããªãŒå
šäœããã£ããã£ããäœåãªã€ã³ã¹ã¿ã³ã¹åã§ããç¹å¥ãªãœãŒãµãªãŒã§ã¯ãå¥ã®ã¬ãã«ã®éæ¥åãè¿œå ããŠãæªç¥ã®ããŒãããŸã£ãããªããµãããªãŒã®ãã¹ã«æ²¿ã£ãã€ã³ã¹ã¿ã³ã¹åã®ååž°ã®åã¹ãããã§ããªããã«ãïŒãã®ã¬ãã«ã®éæ¥åã«ç¹åããæãäœæããããšã«ããïŒãããããOïŒhïŒã®å€§åãªè€éããéæã§ããŸãç§ã®æèŠã§ã¯ãããã¯ããæ·±ãç 究ã®ããã®ã¿ã¹ã¯ã§ããããã®å Žåã¯ææå°æ©ãªæé©åã«ãªããŸããã¢ããªã±ãŒã·ã§ã³ã®äŸïŒäœ¿çšããããšã€ãªã¢ã¹ãã³ãã¬ãŒããä»ã®äŸã«ã€ããŠã¯ãªããžããªãåç
§ïŒïŒ using found3 = search_t<NIL, num_t<0>, num_comp>;
ããã¯å¥åŠã«æãããããããŸããïŒç§ãã¡ã¯ãå®éã«åŒæ°ãšããŠæ¢ã«æå®ãããŠããã¿ã€ãã®ããŒããæ¢ããŠããŸã-ãªãã§ããïŒå®éãããã«ã¯çããããšã¯äœããããŸãã- æ¯èŒã®èŠ³ç¹ããåŒæ°ã«çããåãæ¢ããŠããŸãã STLã¯ïŒæšstd::map
ïŒãã®ããŒãã«æ ŒçŽãããŠãããã¢ïŒstd::pair
ïŒãåã³äžå¯Ÿã®ç¬¬äžéšæããããšèããããŠããããŒå®éã«ã¯ãæ¯èŒã«é¢äžããŸããããªãŒã«åããã®ãä¿åããæ¯èŒåšã«ãã¢ã®æåã®ã¿ã€ãã®ãã¢ãstd::pair
æ¯èŒãããã ãã§ååã§ãComp
-ãããŠãå€å
žçãªé£æ³ïŒã¡ã¿ïŒã³ã³ãããååŸããŸãïŒèšäºã®æåŸã§ãã®èãã«æ»ããŸããæ¿å
¥
ã¡ã¿æ©èœã®å©ããåããŠããªãŒãæ§ç¯ããæ¹æ³ãåŠã¶ãšãã§ãïŒä»¥åãšåãããã«ãæã§ããªãŒãæãããšã¯ãã¹ãŠå®äºããŠããŸãããïŒïŒãååž°æ¿å
¥ã¢ã«ãŽãªãºã ã¯ãæ°ããããªãŒãäœæããŸãã ///å
¥åïŒT-ããªãŒãk-æ¿å
¥ããããŒã¿ã€ãã
///åºåïŒT '-èŠçŽ ãæ¿å
¥ãããæ°ããããªãŒ
INSERTïŒTãkïŒïŒ
IF T == NIL
çµè«{NILãkãNIL}
ãã®ä»
IF k <T.KEY
çµè«{æ¿å
¥ïŒT.LEFTãkïŒãT.KEYãT.RIGHT}
ãã®ä»
çµè«{T.LEFTãT.KEYãINSERTïŒT.RIGHTãkïŒ}
圌ã®ä»äºã説æããŸãããïŒæ¿å
¥ãçºçããããªãŒã空ã®å Žåãæ¿å
¥ãããèŠçŽ ã¯æ°ããããªãŒ{NILãkãNIL}ãäœæããŸãããã®èŠçŽ ãæã€ã·ãŒãïŒååž°äžéšïŒãããªãŒã空ã§ãªãå Žåã空ã®ããªãŒã«ååž°çã«å€±æãïŒã€ãŸããå·ŠãŸãã¯å³ã®ãµãããªãŒã空ã«ãªããŸã§ïŒãæåŸã«ãã®ãµãããªãŒã§åãã·ãŒã{NILãkãNIL}ã圢æããå¿
èŠããããŸãNILãæ°ããå·ŠãŸãã¯å³ã®ãµãããªãŒã®åœ¢ã§ããã³ã°ãããéäžãåã®äžçã§ã¯ãæ¢åã®åãå€æŽããããšã¯ã§ããŸããããæ°ããåãäœæããããšã¯ã§ããŸã-ããã¯ååž°ã®ãã¹ãŠã®ã¹ãããã§çºçããŸããå®è£
ïŒ
template <typename Tree, typename T, typename Comp = typename Tree::comp> struct insert;
空ã®ããªãŒã«èŠçŽ ãè¿œå ããã«ã¯ãã³ã³ãã¬ãŒã¿ãŒãæ瀺çã«æå®ããå¿
èŠããããŸãComp
ãããªãŒã空ã§ãªãå Žåãã³ã³ãã¬ãŒã¿ã¯ããã©ã«ãã§ãã®ããªãŒã®ã«ãŒãããååŸãããŸã*ããã®æ¿å
¥ã®è€éãã¯æ¬¡ã®ãšããã§ããOïŒnïŒã€ã³ã¹ã¿ã³ã¹åïŒnã¯æ¢åã®ããŒãã®æ°ïŒãååž°ã®æ·±ãã¯hïŒhã¯ããªãŒã®é«ãïŒã§ããæ瀺çãªäœ¿çšäŸïŒ using t2 = leaf<num_t<5>, num_comp>; using t3 = insert_t<t2, num_t<3>>; using t4 = insert_t<t3, num_t<7>>; static_assert(height<t4>::value == 2, "");
ã©ã€ãã©ãªã«ã¯ã¡ã¿insert_tuple
ã¿ã€ãã®å®è£
ããããããã«ãããã¿ã€ãã®ã¿ãã«ãããã«ããªãŒã«å
¥ããããšãã§ããŸãïŒãã³ãããã®äžã§ã¯insert
ãã¿ãã«ã®åãªãååž°ã§ãïŒã using t6 = insert_tuple_t<NIL, std::tuple< num_t<5>, num_t<7>, num_t<3>, num_t<4>, num_t<2>, num_t<8> >, num_comp>; static_assert(std::is_same<t1, t6>::value, "");
ãã€ãã¹å¹
ïŒå¹
åªå
ãã©ããŒãµã«ïŒ
äºåæšã®å¹
ã暪æããïŒãŸãã¯ã°ã©ãçè«ããå¹
ãæ¢çŽ¢ããïŒãšãããŒãã®ãªã¹ãããã¬ãã«ãé ã«è¡šç€ºãããŸããæåã«ã«ãŒãã次ã«æ·±ã1ã®ããŒãã次ã«æ·±ã2ã®ããŒããªã©ã衚瀺ãããŸãããã®ãããªãã€ãã¹ã®ã¢ã«ãŽãªãºã ã¯ãã¹ã¿ãã¯ã§ã¯ãªãããŒãã®ãã¥ãŒã䜿çšããŠããã«åºåãããããååž°çã«ãå€æãããããšã¯å°é£ã§ãããã¿ãã¬ã®äžã§ãèå³ã®ããèªè
ã¯åé¿çãèŠã€ããã§ããããããã§ã¯ãå¹
ãã¯ããŒã«ããããšã§ã解æããããããªãŒããã¯ããŒã«çµæã®ã¿ãã«ããèŠçŽ ã®ãŸã£ããåãã·ãŒã±ã³ã·ã£ã«æ¿å
¥ã«ã¢ã»ã³ãã«ã§ãããšããæçšãªäºå®ã®ã¿ã«æ³šç®ããŸãããã®å³ã¯ããã¹ãããªãŒã®å¹
ã®åšããæ©ããŠããŸããååž°çãªå¹
ã®ãŠã©ãŒã¯ïŒ: 0 h . :
/// : T - , l - ,
/// : t -
COLLECT_LEVEL(T,l):
T == NIL
{}
l == 0
{T.KEY}
COLLECT_LEVEL(T.LEFT,l-1) + COLLECT_LEVEL(T.RIGHT,l-1)
. ,
O(nh) - (, ,
collect_level
).
åãå€ãïŒ
ããŒãã®åé€ã¯éèŠãªã¿ã¹ã¯ã§ããå€å
žçãªã¢ãããŒãã§ã¯ã3ã€ã®ã±ãŒã¹ïŒåããŒãã®æ°ã«ããïŒãèæ
®ãããåŸç¶ããŒããšèŠªããŒãã®æŠå¿µãã¢ã«ãŽãªãºã ã§äœ¿çšãããŸãã芪ããŒããžã®ããã¯ãªã³ã¯ããªãå ŽåïŒãç¶èŠªãšåäŸã«ã€ããŠãã®ãã¿ãã¬åç
§ïŒãã¢ã«ãŽãªãºã ãå¹æçã«å®è£
ããã®ã¯åé¡ã§ããããªãŒãç»ãåæäœã«ã¯OïŒnïŒã®è€éãããããŸãããã®ãããªåé€ã®åçŽãªå®è£
ã¯ãã€ã³ã¹ã¿ã³ã¹ã®æ°ã®ç¹ã§ãçµã¿åããã®ççºããåŒãèµ·ãããŸãïŒè€éãã¯OïŒn nïŒä»è¿ã§ãïŒãããŒããåé€ããããã®ã¡ã¿é¢æ°ã®éçºã¯ãã©ã€ãã©ãªãæ¹åããããã®ãããªãèšç»ã®äžéšã§ããèšäºã®æåŸã«ããUPD2ãåç
§ããŠãã ãããç³èŸŒã¿
æ¯ãåžã£ãŠãæåŸã«è³ªåã«æ³šæãæããŸãããããªããã€ããªã³ã³ãã€ã«æã®æ€çŽ¢ããªãŒãå¿
èŠãªã®ã§ããããïŒ3ã€ã®çãããããŸãïŒé建èšçïŒ*ãããªãŒãã¹ã®ããåç*ãçç¥ããŸããæããïŒ...ç 究ã«èå³ã®ãã人åã æ§æçïŒãã®æ§é ã®å¯èœãªã¢ããªã±ãŒã·ã§ã³ã®äŸã次ã«ç€ºããŸãã- : , . «» . â ( â O(n 2 ) ), â .
- runtime : , -.
std::tuple
â . , runtime , , ( std::get
std::tuple
).
- compile-time:
std::map
( std::set
) â , (, ) ( â , ..), compile-time, runtime . : , , . : ?
- : « », . , , , .
:«Modern C++ Design: Generic Programming and Design Patterns Applied» ( « ++» , . ) : « ». static_assert
, C++11, ( , policy ), STL, C++98 (« ») ( , , , ).
, : compile-time â , ( , ), ( «», , - ).
ç· ããããã«ãããªãŒã®éçºãšèšäºã®å·çã«ã€ãªãã£ãã¿ã¹ã¯ã«ã€ããŠãå°ãã話ããããšæããŸããæ£èŠè¡šçŸãDFAïŒæ±ºå®è«çæéç¶æ
æ©æ¢°ïŒã«çŽæ¥å€æããããã®ã¢ã«ãŽãªãºã ãããã€ãããããããèªèããŸãããã®ããã€ãã¯ããããã æ§æããªãŒããã®æ§è³ªäžããäœããªãããã€ããªã§ãããããã£ãŠãã³ã³ãã€ã«ææ€çŽ¢ã®ãã€ããªããªãŒã¯ãïŒã³ã³ãã€ã«ããã³DFAã®ãã©ããã³ãŒãã«å±éã§ããåã蟌ã¿åŸã®ïŒæ£èŠè¡šçŸã®ã³ã³ãã€ã«æããŒãµãŒã®äžå¯æ¬ ãªéšåïŒããã³å®è£
ã®ããã®åãªãèå³æ·±ãæ§é ïŒã§ãããããã¯å¥ã®ãããžã§ã¯ãã®äžéšã«ãªããŸããããã§äœïŒ
ããããïŒå¬..., (, , ) . â , (, - ), std
- ( â tutorial ). , .
!
æåŠ
- , ., , ., , ., , . : = Introduction to Algorithms. â 2-. â .: , 2005. â 1296 .
- . ++: = Modern C++ Design: Generic Programming and Design Patterns Applied. â . .: , 2008. â 336 . â (++ in Depth).
- ., . ++. «C++ In-Depth» = C++ Coding Standards: 101 Rules, Guidelines and Best Practices (C++ In-Depth). â .: «», 2014. â 224 .
- . C++ , . «C++ In-Depth» = Discovering Modern C++: A Concise Introduction for Scientists and Engineers (C++ In-Depth). â .: «», 2016. â 512 .
â
ãªããžããªUPDïŒstd::conditional:izvolov std::conditional
.
search
O(h) :
template <typename Node, typename T, typename Comp> struct search { using type = typename std::conditional< Comp::template eq<T, typename Node::type>::value, Node, typename search<typename std::conditional< Comp::template lt<T, typename Node::type>::value, typename Node::LT, typename Node::RT >::type, T, Comp>::type >::type; };
(+
insert
) .
UPD2ïŒremove insert search O(h):,
insert
search
remove
O(h) (
insert
).
SFINAE +
decltype
( , .
).
remove
:
template <typename Tree, typename T> struct remove { private: enum : bool { is_less = Tree::comp::template lt<T, typename Tree::type>::value }; enum : bool { is_equal = Tree::comp::template eq<T, typename Tree::type>::value }; enum : size_t { children = children_amount<Tree>::value }; using key = typename min_node_t< typename std::conditional< is_equal && children == 2, typename Tree::RT, leaf<typename Tree::type, typename Tree::comp> >::type >::type; using recursive_call = typename remove< typename std::conditional< is_less, typename Tree::LT, typename std::conditional< !is_equal || children == 2, typename Tree::RT, NIL >::type >::type, typename std::conditional< is_equal, key, T >::type >::type; static typename Tree::RT root_dispatcher(...); template <typename Bush> static typename std::enable_if< sizeof(typename Bush::LT::type), typename Bush::LT >::type root_dispatcher(Bush&&); public: using type = typename std::conditional< is_equal && (children < 2), decltype(root_dispatcher(std::declval<Tree>())), node< key, typename std::conditional< is_less, recursive_call, typename Tree::LT >::type, typename std::conditional< !is_less, recursive_call, typename Tree::RT >::type, typename Tree::comp > >::type; };
, , . , , , ,
.