Anda di halaman 1dari 29

C++ for C Programmers at Cursera

Module 1: C++ as a Better C


//esutilizadoparacomentarios,reemplazandogeneralmenteelusode/*y*/ iostreamcomolalibreradeI/O Sedesalientaelusode.henladefinicindelaslibreras LaslibrerasestndardeCsiguenexistiendoycomienzanconunacseguidodelnombre estndarcomocstdliboctime Secreaelconceptodenamespacesusenamespacestdcomounmtododelograr encapsulacin.Laencapsulacinfacilitadebugearelcdigoenformaaisladayluegoreutilizarlo enotrosmdulos. Useconstenlugardemacrospermiteladefinicindetiposyqueelcompiladorpuedaverificar laexpresinconlasreglasdellenguajeenlugardeutilizarunreemplazotextual,porejemplo puedeverificarqueseutiliceeltipocorrectoyquelavariabledefinidacomoconstantenointente sermodificadaenesescopeocontexto.constesunadecoracindeladeclaracin. Usarconstlomsposible,porejemploenparmetrosquenosonmodificados,yaqueadems depermitiralcompiladorencontrarerrores,enalgunoscasospermiterealizaroptimizaciones. DelamismaformainlinesirveparadefinirpequeostrozosdecdigoquegeneralmenteenC sondefinidoscomomacros,loquesirveparafacilitarlaidentificacindeerroresde programacin. Dentrodelalibreraestndarsedefinenlosstreamcinycout.Enlasintaxisstd::coutlos::es elscoperesolutionoperator. Losoperadoressesobrecarganosonoverloaded,loquesignificaqueselepuededarun nuevosignificado.EnC++sepuedensobrecargarfuncionesyoperadores. Sepuedendefinirvariablesencualquierlugardelbloque,nosolamentealinicio,estopermite realizarlasdefinicioneslomscercaposiblededondeseusa,locualesunaventaja especialmenteencdigoslargos.Sielcdigoescorto,ansiguesiendocostumbrecolocarlas definicionesalprincipioycomentarlas. Lainstruccinsrand(time(NULL))inicializalafuncinquegeneranmerosalazar,ylafuncin intrand(void)devuelveunnmeroentre0yRAND_MAX.Aldividirelresultadopor RAND_MAXcomodoblesseobtieneunaprobabilidadentre0.0y1.0.Ambasfuncionesestnen

lalibrera<cstdlib>. Elmanejodelamemoriaheapsehaceconmalloc()yfree().EnC++estasfuncionesson reemplazadasporlaspalabrasclavenewydeleteloscualesimplementanseguridaddetipos. Paraborrararrayslasintaxisesdelete[]var Esposibledefinirvariablesenelbloquedeinicializacindeunainstruccinfor().Esusado bsicamenteparadefinirlasvariablesqueiteranenellazo. Sibienesposibleutilizarlosmtodosantiguosdecastcomo(nuevotipo)expresin,C++ definenuevosmtodosdecambiareltipoquesonmsseguros.Unodeelloses static_cast<nuevotipo>(expresin) AendlselollamamanipuladordeI/Oqueespecificacambiaralaprximalneaenun ostream. EnClosparmetrossonsolopasadosporvalor,esdecirquesehaceunacopiadelos valoresquesepasanalafuncinycualquiercambioenlosparmetrosdentrodelafuncinse pierdenalsalirdelamisma. int*idebeserleidocomoiesunpunteroaunint.Siluegoseencuentraconlaexpresin*i= 1enesecasoel*esunadereferencia,loquedebeleersecomoelintapuntadopori. Dadalaexpresini=&menestecadoel&mdebeleersecomoladireccindem C++incluyeunaformadepasarlosparmetrosporreferencia.Lasintaxisesint&iydebe serledocomolareferenciadelinti.Cambiosdeestosvaloresdentrolafuncinafectanel valordelosparmetrosalsalirdelamisma. Elpasajedeparmetrosporreferenciaesmseficienteyaquenonecesitarealizarlacopiade losvaloresenvariableslocalesalafuncin. Esposibledefinirfuncionesconelmismonombre(sobrecarga)siempreycuandotengan distintafirmaosignaturequesedefinecomolostiposycantidaddeargumentos. Unasugerenciaparacrearuntemplateescrearunafuncinparauntipodeterminadoy debugearlaparaasegurarsequehaceloquetienequehacer,yluegoanteponeraladefinicin delafuncintemplate<classT>yreemplazareltipoespecficoporT. Lasfuncionescontiposdeterminadostienenprioridadsobrelostemplates,loquehaceposible hacerfuncionesespecializadasquerequieranuncdigoespecialparadeterminadotipode parmetro,ydejareltemplateparaelresto. Esposibletambinutilizarsobrecargadefuncionesyalaveztemplates.Stringsseparadospor whitespcessonautomticamenteconcatenadosporelcompilador.

boolywchar_tsontiposnuevosquenoexistanenC. C++tambientieneeloperandosizeof()quedevuelvelacantidaddebytesqueocupaun determinadotipo. Enlalibrera"limits"deC++sedefineeltemplatenumeric_limits<T>quepermitesaberel valormximoquesepuedealmacenarenuntipo.Porejemplo"numeric_limits<double>::max()" Sesuguiereutilizarlostiposintydoublequesuelenserlosmseficientesencada implementacin. C++tienelaposibilidaddedefinirreferencias,identificadoresquesoncomosinnimosdeotros. Porejemploenlasiguientesdeclaracionsintnint&nn=nnynnapuntanalmismolugar, referencianelmismocontenido,peronosonexplcitamentepunteros.Estaeslabasedel pasajedeparmetrosporreferencia. Enlalibreraassertseencuentradefinidalafuncionvoidassert(expresion)Silaexpresion esfalsalaejecucinseparamostrandounerror.Paracancelarlosassertsedebedefinirla marcroNDEBUG.

Module 2: C++: Basics of Generics and Classes


Esposibleasignarunvalorpordefaultaunparmetro,loscualesdebensercolocadosalfinal delalistadeparmetros,ynoesnecesariopasarunvalorparaesosparmetrosanoserque sedeseecambiarelvalorpordefault. Silosvaloresdeunparmetronovanasermodificadosdentrodelafuncin,esrecomendable definirloscomoconst.Elusodeconstparadefinirparmetrossirveparadocumentarelcdigo yparapermitirlealcompiladorrealizarloschequeosconvenientes. Nosesueledefinircomoconstalosparmetrosquesonllamadosporvalor. Esposibledefinirtemplatesconmsdeunaclaseconlasiguientesintaxistemplate<classT1, classT2>aunqueengeneralnosenecesitamsqueunaclaseypuededarlugaraerrores, porlotantohayqueusarloconcuidado. EnlateoradegrafosseutilizalaletraKparaindicargrafoscontodoslosposiblesvnculos entrenodos.PorejemploK4defineungrafode4nodosconlas6relacionesposiblesentre ellos. Lacantidaddevnculossalientesquetieneunnodoseidentificancomogrados(degrees).Para todografocompletoK<n>,lacantidaddegradosdetodoslosnodosesn1. Haydosestructurasdedatostpicaspararepresentargrafos,unaeslamatrizdeconexiones (connectivitymatrix)ylaotraeslarepresentacindelistadebordes(edgelistrepresentation).

Lamatrizdeconexionesesgeneralmentemejor(utilizamenosmemoriayresultaenalgoritmos mseficiente)engrafosdensos(conmuchosgradospornodo),perolamayoradelos problemasdelavidarealserepresentanengrafosnodensosoescasos(sparse). Suelenclasificarselosgrafoscomodirigidos,nodirigidosytambinpuedeindicarseunpeso(o costo)paracadauninentrevrtices.Enlosgrafosnodirigidos(undirectedgraph)losbordes (edges)notienenorientacin,adiferenciadelosgrafosdirigidos(directedgraph)formadospor paresordenadosindicandoelvrticedeorigenyeldedestino.Losgrafosdirigidospueden pensarsecomocaminosdeunasolamano,mientrasquelosnodirigidoscomorutasdedoble mano. ElalgoritmodecaminomscortodeDijkstraesparagrafosconpesosencadaarista(los cualesnopuedensernegativos)enelcualsedefineunnododeorigenyotrodedestino. Enestealgoritmosemantienendosconjuntos.Unconjuntocerrado(closedset)conlos caminosmscortosencontradoshastaelmomentoyotroconjuntoabierto(openset)con todoslosnodosquesepuedenalcanzar. SepuedeencontrarmsinformacinenestelinkdeWikipedia. Unadelasformasdedefinirtiposesconenum.Porejemplolasiguientesexpresindefineel tipocolor:typedefenumcolor{RED,WHITE,GREEN}color.Sibiensepuedendefinircomo constantesindependientes,enumtienelaventajadeagruparlascomosifueranuntipo extendido. Enestecasoenumcolor{RED,WHITE,GREEN}esuntipoycontypedefsedefineacolor comounsinnimodeesetipo.Sinousramostypedeflasiguienteexpresinenumcolor {RED,WHITE,GREEN}colordefineunavariablecolordeltipoenumcolor{RED,WHITE, GREEN}. Unodelossecretosdeunabuenaprogramacinorientadaaobjetosesdefinirtiposque parezcannativosenellenguaje. Lasobrecargadeoperadoressirveparaquelostipossecomportenmsnaturalmente.En ciertaformaescomodefinirunafuncin,ylasobrecargaesusadadependedelafirmadel operador(lacantidadytiposdeparmetrosusados). Unodelosoperadorestpicamentesobrecargadoes<<porejemplosegnelsiguientecdigo: ostream&operator<<(ostream&out,daysd){.returnout}dondeoperator<< representaraelequivalentealnombredelafuncin. EnCpodemosdefinirunpuntoconlasintaxistypedefstructpoint{doublex,y}point.En cambioenC++podemosdefinirunpuntoconlasintaxisclasspoint{public:doublex,y}y nonecesitamoselusodetypedefyaqueelnombredelaclaseesalavezelnombredeltipo. EnC++structesprcticamenteigualaclassdondetodoslosmiembrosymtodosson

pblicos. Normalmentelosdatosenbruto(datamembers)deunaclasesonprivados,ysedefinen funcionespblicas(methods)paraoperarsobreesosdatos.Generalmenteselosllama accessorsmethodsymutatorsmethods. Losmtodosconstructorstienenelmismonombrequelaclase.Puedentenerdistintafirma deparmetros,perocuandonotieneargumentos(esdecirquesfirmaesvoid)selollama defaultconstructor. Dentrodeladefinicindeunaclase,thisesunpunteroquereferenciaaalmismoobjeto.

Module 3: C++ and OO; Lists


Losmtodosconstructoressirvenparadeclarar,reservarmemoriaeinicializar.Enla inicializacinpuedenllevaracabounaconversindetipos.Estasetapassehacen automticamenteentiposnativoscomoeninti=3.Losmtodostambinsirvenpara garantizarqueelobjetoseinicializaconvaloreslgicamentecorrectos. Enelsiguienteejemploseutilizanparmetrosconvalorespordefaultparadefinirtresposibles firmasenelconstructor,unodeloscualeseselconstructorpordefaultportenerlafirma(void). Ademssedefineunalistadeinicializacin:point(x=0.0,y=0.0):x(x),y(y){}Laslistasde inicializacinsonsoloposibledeusarenconstructores. Ladiferenciaentrelosconstructorespoint(){x=y=0}ypoint():x(0.0),y(0.0){}esqueenel primercasoseasignanvaloresaxey,encambioenelsegundoxeysoninicializadoscon valores.Porejemploconlalistadeinicializacinsepuedeninicializarmiembrosdefinidoscomo constantes,alosqueseraimposiblehacerunaasignacin. Cuandosedeclaraunavariabledeunaclasesellamaunconstructor,porejemploenla declaracinpointpsellamaalconstructordefault. Avecesensedefinenlosparmetrosdeloscontructoresconelmismonombrequelos miembros.Enesoscasossetienequeusarelpunterothis,porejemplothis>x=xpara diferenciarlos.Aunquesesugiereelusodelalistadeinicializacin. Lalistadeinicializacintienelaforma:miembro(expresin),dondelaexpresinpuedeser simplementeunargumentodelconstructor. Laexpresinint*p=newint(9)reservamemoriaparaunsoloenteroyloinicializaconelvalor 9.Nodebeconfundirseconchar*s=newint[9]elcualdefineunarrayde9enterossin inicializar.Elprimeroseliberacondeletepyelsegundocondelete[]s Cadavezqueunobjetoutilizarecursosdelsistema(comoarchivos)oreservamemoriaconla

instruccinnew,debedefinirseunmiembrodestructorparaliberaresosrecursos.Soloes posibledefinirunsolomtododestructorsinargumentosparacadaclaseytienelasintaxis ~point(){}elcualcomienzaconelcaracter~ytambintieneelmismonombrequelaclase. Cuandosedefineunmtodofueradeladeclaracindelaclase,sedebeutilizarladefinicinde sopeconlasintaxisnombredelaclaseseguidocon::,ejemplopoint::metodo(){} Engrafosgeneradosalazar,apesardetenerunadensidadbaja,sielgrafotienemsnodos, esmuchomsprobabledeencontraruncaminoentredosnodos. Durantelaclaseexplicaelsiguientecdigo:


/ / c r e a e n l a h e a p u n a r r a y 2 D d e b o o l s b o o l * * g r a p h s r a n d ( t i m e ( 0 ) ) g r a p h = n e w b o o l * [ s i z e ] f o r ( i n t i = 0 i < s i z e i + + ) g r a p h [ i ] = n e w b o o l [ s i z e ] c o n s t i n t D E N S I T Y = 0 . 1 9 / / c o n D E N S I T Y = 0 s e o b t i e n e u n g r a f o d e s c o n e c t a d o , c o n D E N S I T Y = 1 s e l o g r a u n g r a f o c o m p l e t o . f o r ( i n t i = 0 i < s i z e i + + ) f o r ( i n t j = 0 i < s i z e i + + ) i f ( i = = j ) g r a p h [ i ] [ j ] = f a l s e / / n o l o o p s e l s e g r a p h [ i ] [ j ] = g r a p h [ j ] [ i ] = ( p r o b ( ) < D E N S I T Y ) / / a l g o r i t m o " b r e a d t h f i r s t s e a r c h " o " b u s q u e d a e n a n c h u r a " b o o l i s _ c o n n e c t e d ( b o o l * g r a p h [ ] , i n t s i z e ) / / u t i l i z a r l o p a r a d e s c a r t a r l o s g r a f o s d e s c o n e c t a d o s e n e l e j e r c i c i o 2 . { i n t o l d _ s i z e , c _ s i z e = 0 / / c _ s i z e e s e l t a m a o d e l c o n j u n t o c e r r a d o . b o o l * c l o s e = n e w b o o l [ s i z e ] b o o l * o p e n = n e w b o o l [ s i z e ] f o r ( i n t i = 0 i < s i z e i + + ) o p e n [ i ] = c l o s e [ i ] = f a l s e o p e n [ 0 ] = t r u e w h i l e ( c _ s i z e < s i z e ) { f o r ( i n t i = 0 i < s i z e i + + ) { o l d _ s i z e = c _ s i z e / / a d d t o c l o s e i f ( o p e n [ i ] & & ( c l o s e [ i ] = = f a l s e ) ) { c l o s e [ i ] = t r u e c _ s i z e + + } / / a d d t o o p e n

f o r ( i n t j = 0 j < s i z e j + + ) { o p e n [ j ] = o p e n [ j ] | | g r a p h [ i ] [ j ] } i f ( c _ s i z e = = s i z e ) r e t u r n t r u e / / c o n n e c t e d i f ( o l d _ s i z e = = c _ s i z e ) r e t u r n f a l s e / / u n c o n n e c t e d } }

EnC++11enlugarde0est(olamacroNULLcomoconvensin)definidonullptrlocual permiteuncontrolmssegurosdetipos. Escomnagregarunconstructordecopia(copyconstructor).Siporejemplosiestuviramos definiendolaclaselist,lasintaxisdelconstructordecopiaseralist(constlist&lst) Esimportantediferenciarlacopiaprofundavscopiasuperficial(otambinllamadacopiade referencia).Elusodeunayotradependebsicamentesiloquesenecesitaesunacopia independientedelaoriginal,afindemodificaragustosucontenidoono.Elprimercaso requeriraunacopiaprofunda,lacualesmscostosaanivelderecursos. Enelcursoserecomiendausarelprogramavalgridparadetectarmemoryleaks. EnlalibreradetiposestndaroSTL,ungrupodeclasessonllamadoscontenedores,donde laclasevectoreslamsimportante.Enelcursoserecomiendafuertementeusarlaclase vectorenlugardearraybsicodeC,conelcualesmuchomsfacilcometererroresenel manejodendicesoreservadememoria. OtraclasedelaSTLeslist,lacualesdoblelinkedlacualsepuedenavegar bidireccionalmente. Elvectoresmstilcuandosetienequeaccederacualquierelementoalazar,ylistesms eficientecuandosenecesitaconstantementeestaragregandoyeliminandoelementos.

rbol de expansin mnima o MST (Minimum Spanning Tree)


UnMSTesunconjuntodebordesentrevrticesqueconectantodoslosvrticesyquenotiene bucles.Unbuclepuedeformarseentremuchosvrtices. Sielgrafotienetiene'n'vrtices,elrboltiene'n1'bordes. C++11incluyeclasesdeenumeracino'enumclasses'.Porejemplo'enumclassColor{RED, GREEN,BLUE}'y'enumclassTraffic{RED,YELLOW,GREEN}'elColor::RED!= Traffic::RED.LasintaxisesenumclassIdentifier:Integral_Type{enumeratorlist}

HaygrafosquenotienenMST,comoporejemploenelcasoqueunvrticeestdesconectado. Cualquieralgoritmodebetenerestasituacinencuenta,porejemplodevolviendounnmero negativo. ElalgoritmodeJarnikPrimcomienzaconunvrticeyrepetidamenteunelosbordesdemenor pesoqueconectanalrbol(desdecualquiervrticedelrbol)conunvrticequenopertenece alrbol(estaltimacondicingarantizanoseformenbucles).Acadapaso,elrbollqueseva formandoesunMSTentrelosvrticesquesevayanprocesando. Sienungrafohayformaquedesdeunvrticessellegueacualquierotrovrtice,entonceshay unST,ylaexistenciadeunST,implicaqueexisteunMST. Podramosllamarconjuntoabierto(openset)alosvrticesannoconectadosalrboly conjuntocerrado(closedset)alosquepertenecenalrbol.Laideadelalgoritmoesbuscarel vrticedelconjuntoabiertoqueestmscercadecualquieradelosnodosdelconjunto cerrado. Elconjuntoabiertosepuedeimplementarcomounalistaconprioridad,deformadeelegir siempreelvrticequetengaelmenorpesodeborde. Enelcasodequehayamsdeunbordeconelmismovalor,sepuedeelegircualquieradelos dos,yelcostodelosMSTvaaserelmismo,aunquelatopologadelrbolensseadistinta.Es decirelMSTnoesnico,perosielcostomnimo. ElpseudocodigodelalgoritmodePrimsepuedeencontrarenelsiguientelinkdewikipedia. ElalgoritmodeKruskalconsisteenordenartodoslosbordesposiblesdeungrafodemenora mayor,eirtomndolosaodescartndoloscuandoconformanunbucle.Elpseudocodigodel algoritmodeKruskalsepuedeencontrarenelsiguientelinkdeWikipedia. Sedefinecomoalgoritmocodiciosoovoraz(oGreedyAlgorithmentrelosqueseencuentran losalgoritmosdePrimyKruskal)esaquelque,pararesolverundeterminadoproblema,sigue unaheursticaconsistenteenelegirlaopcinptimaencadapasolocalconlaesperanzade llegaraunasolucingeneralptima.Enalgunoscasosestosalgoritmosnoencuentranla solucinptimadelproblema,peromuchasvecesselosemplea,porqueporsueficiencia encuentranunasolucinaceptable. Unodelosprincipiosdeprogramacinorientadaaobjetosesquelostiposdefinidosporel usuario,seanindistinguiblesdelostiposnativosdelidioma. Agregandoexplicitaladefinicindeunconstructor(odesdeC+11)aunoperadorde conversin,seimpidelaconversinimplcitadetiposounainicializacinporcopiayobligael usodestatic_cast.Porejemplodaraunerrorsihacemosa=bsiafueraunpuntoybun entero,aunsiexistieraunconstructordeltipopuntoquetuvieraunnicoenterocomo parmetroonlasintaxispoint::point(int){}

Porelcontrario,sihacemosb=a,esimposibledefinirunconstructordeconversinparaun tipoenteroquepermitaconvertirunpuntoenunentero.C++permitedefinirunoperadorde conversinconlasintaxispoint::operatorint(){...}loquepermitiraconvertirunpuntoaun int.Sinembargonoesrecomendadoanoserqueseasemnticamentenaturallaconversinde tipos(esdecirquetengaunsentidoclaro). Paraelegirlafuncinaejecutar,elcompiladorprimerobuscalafuncincuyafirmacohincida exactamenteconlosparmetrosusados,sinolaencuentrausalaspromocionesestandard (comodeintadouble).Luegousalasconversionesdetipoestandard(comoporejemplodeint ashort)ycomosiguientecriteriousalasconversionesdefinidasporelusuario. Lalibreradetemplatesestndar(oSTL)sebasaenContenedores,IteradoresyAlgoritmos. Lasclasesvector,list,set,dictymapsonejemplosdecontenedores.vectorylistsonloque llamamoscontenedoressecuenciales(loqueimplicaquesuselementossepuedenacceder conunndice).Porotrolado,porejemploaset,dictymapselosllamacontenedores asociativosylaformadeaccedergeneralmenteesconunaclavequenospermiteaccederal contenido. Loscontenedoressepuedenexpandiramedidaqueesnecesario. Lositeradoressonalgosimilarapunterosperogeneralizadosyconfuncionesestandarizadas. Haycuatrotipodeiteradores:forward,backward,randomyaccess.Unadelasventajasdelos iteradoresesquenopermitenleerelementosfueradelrangodelarray,queeseltpicoerrorque generaunerrorsegmentfault. Losalgoritmos(comoporejemplosortopermute)sepuedenaplicaramltiplesclases. PorejemplolaprogramacinconestilotpicodeC:
f o r ( i n t i = 0 i < 1 0 0 i + + ) { . . . }

esreemplazadaenelestilodeC++porelusodeiteradores:
f o r ( v e c t o r < i n t > : : i t e r a t o r p = v . b e g i n ( ) p ! = v . e n d p + + ) { . . . }

asuvezenC++11sesugierereemplazarpor:
f o r ( a u t o p = v . b e g i n ( ) p ! = v . e n d p + + ) { . . . }

Enelprimercdigoseaccedeacadaelementoconv[i],encambioenlaversinconiteradores debeusarse'*p'. Lapalabraclaveautoesusadoparadeclarareltipodeducidodelcontexto.autosepuedeusar enotroscontextoscomoporejemplo'autoi=3',aunqueesmuytilensituacionescomo 'autoc=d'dondedesdeuntipocomplejo,eliminatenerqueretipeareltipo. Algunosmtodoscomunesson:


v . s i z e ( ) / / g e t c u r r e n t s i z e v . r e s i z e ( i n t s i z e )

Constuctores:
v e c t o r < T > v / / s e c u e n c i a v a c a . v e c t o r < T > v ( n ) / / c r e a u n v e c t o r c o n n e l e m e n t o s y l l a m a a l c o n s t r u c t o r T ( ) p a r a c a d a e l e m e n t o . v e c t o r < T > v ( n , v a l o r > / / V a l u e d e t i p o T o c o n v e r t i b l e a T y e l v a l o r q u e s e a s i g n a a c a d a e l e m e n t o .

Paramanipulararchivosusarlalibrerafstream.Porejemploifstreamifp("data",ios::in)crea lavariableifp(punteroaunarchivodeingresodedatos)parasulectura.Lavariableifptieneel mtodoeof() UnanuevafuncionalidaddeC++11eselforpararangos.Lasintaxises'for(declaracion: expresin){...}'.Porejemplofor(doubled:data)sum+=d Elrangoesimplcitodeprincipioafin. Dentrodelaexpresindeunforsepuedenusarunarray,uncontenedordesecuenciaoun string. Porejemplofor(auto&element:data)element=element+2//alponercomoreferenciase puedecambiarelvalordecadaelemento. Hay5categorasdeiteradores(demssimpleamscomplejo): input:Sololectura,unasolapasada.Permiterecorrerloselementosunoporunoydebetener eloperador++yeloperador*dedereferenciadefinidosyeloperador>.Lositeradorestambin debendefinidos==y!=.Porejemploeselrequerimientodelafuncin'find'unelementoenuna lista. output:Soloescritura,unasolapasada forward:Lecturayescritura,multipasadaenunasoladireccin.Untpicoalgoritmoqueusa estetipodeiteradoresreplace. bidirectional:Multipasadaenambasdirecciones.Esteiteradordebeimplementareloperador. Untpicoalgoritmoqueusaestetipodeiteradoresreverse. random:accedeacualquierelemento,esindexable.Estetipodeoperadorpermiteaccedera cualquierelementoenuntiempofijo.Necesitatenerdefinidoslosoperadoresdecomparacin pormayor,menoreigualdad.Generalmenteseimplementaconaritmticadedireccionesde memoria,comoloseraunarrayenC,conunadireccinbaseyunoffsetteniendoencuentael tamaoenbytesdecadaelemento.Untpicoalgoritmoqueusaestetipodeiteradoressort. Cuandosedesignaunalgoritmosedebepensarlaversinmseficientedelalgoritmoqueusa laversinmssimpledeiterador. Lalibrera'numeric'contienealgoritmoscomo'accumulate(input_it_begin,input_it_end,

start_value)'.Estealgoritmoutilizauniteradortipoinput.

C++ 11 Standard; Containers, Iterators and Algorithms


LosalgoritmosdelaSTLsepuedenclasificarenalgoritmosquenocambianlasecuencia(Find yCount),losquecambianlasecuencia(Copy,RandomyShuggle),losrelacionadosalorden deloselementos(SortyMerge)ylosalgoritmosnumricos(Accumulate,Innerproduct). Algunasdelasnuevaslibrerasson: <regex>:Expresionesregulares <thread>:Programacinparalela(multicore,multiprosesador) <unordered_map>:MapabasadoenHash <array>:Arreglodelongitudfija.Tienemuchassimilitudesconvector. <forward_list>:Listadevnculossimplesenunasoladireccin. Porejemploelalgoritmoreplaceesunalgoritmoquecambiaelcontenidodeuncontenedor reemplazandolasocurrenciasdeunvalorxporotroy.Estealgoritmotienelasiguientefirma yutilizaiteradoresdeltipoforward:
t e m p l a t e < c l a s s T > v o i d r e p l a c e ( F o r w a r d I t e r a t o r f i r s t , F o r w a r d I t e r a t o r l a s t , c o n s t T & x , c o n s t T & y ) f i r s t sesueledefinirconx.begin()yl a s t condx.end().

Porejemploestaesunafuncinqueusaiteredoresdeltipoforwardyreemplazacadaelemento deuncontenedorporsucuadrado:
t e m p l a t e < t y p e n a m e F o r w a r d I t e r a t o r > v o i d s q u a r e ( F o r w a r d I t e r a t o r f i r s t , F o r w a r d I t e r a t o r l a s t ) { f o r ( f i r s t ! = l a s t f i r s t + + ) * f i r s t = ( * f i r s t ) * ( * f i r s t ) }

HayunalgoritmoenlaSTLllamadorandom_shuffle()quemezclaalazarelcontenidodeun contenedor. Unaformainteresantederecorrerenuncontenedorunadeterminadacantidaddeelementos conuniteradordesdeundeterminadoelementopuedeser:


i n t i = 0 f o r ( a u t o p = x . b e g i n ( ) i < 5 p + + ) y [ i + + ] = * p

Conestecdigocopiamos5elementosdeuncontenedoraotrocomenzandodesdelaposicin deuniterador. Porejemploelalgoritmoreplaceesunalgoritmoquecambiaelcontenidodeuncontenedor reemplazandolasocurrenciasdeunvalorxporotroy.Estealgoritmotienelasiguientefirma yutilizaiteradoresdeltipoforward:


t e m p l a t e < c l a s s B i d i r e c t i o n a l I t e r a t o r > v o i d r e v e r s e ( B i d i r e c t i o n a l I t e r a t o r f i r s t , B i d i r e c t i o n a l I t e r a t o r l a s t

Eliteradorx.end()apuntamsalldelfinaldelcontenedor.Porlotantolosalgoritmosque necesitanaccederalltimoelementodelcontenedorcomienzandecrementandoelpuntero. Enlalibrera<cstddef>seencuentradefinidoeltipoptrdiff_telcualseutilizaparaalmacenar diferenciaentrepunterosenaritmticadedirecciones. EldiseodelaSTLestbasadoenlosprincipiosdeeficiencia(esunadelasrazonesdeserde C,cercadelmetalysacarelmayorjugoposiblealhardware),paramtrico(conelusode templates,lostipossonparmetrosypermiteutilizarelmismocdigobajodistintas necesidades)yortogonal(cubrirtodaslasnecesidadesdentrodelalcancedelalibrera). Unainterfaztpicadeuncontenedorincluye: Constructores(defaultconstructors,copyconstructors,moveconstructorsnuevoen C++11) Accesoaloselementos Insercindeelementos Emplacementdeelementos(nuevoenC++11) Borradodeelementos Destructures Iteradores Loscontenedorestambintienenlacapacidaddereservaryliberarmemoriaparalosobjetos quecontienen. Loscontenedoresasociativos,comoset,multiset,mapymultimapasocianunvaloraotroy sebasanenalgoritmosdeinsercinybsquedaquetrabajanconrbolesbalanceadosloque minimizaeltiempodebsqueda,peronecesitanqueloselementossepuedancomparar. ConC++11seintroducenloscontenedoresasociatiosunordered_mapyunordered_setque tienentiemposdebsquedaconstanteysebasanentablashash.Engeneralreemplazanlas versionesbasadasenrbolesbalanceadosespecialmentecuandonosenecesitaelconcepto deordenyencontenedoresconmuchoselementos. Loselementosdeloscontenedoresasociativossonpairyporlotantoelvalorclaveseobtiene

con(*p).firstyelvalorasociadocon(*p).second(siendopuniterador). LosalgoritmosdelalibreraSTLsebasanenloscontenedoreseiteradores.Soneficientesy utilizaneltipodeiteradorquefacilitaelalgoritmomseficiente. Losalgoritmossepuedencatalogarenalgoritmosdeordenamiento,algoritmosqueno modificanalcontenedor,algoritmosquecambianelcontenedoryalgoritmosnumricosque realizanclculosenbasealoselementosdelcontenedor. Elalgoritmostable_sort()garantizaqueloselementosconelmismovalormantienenlamisma posicinrelativadentrodelcontenedor. Lafuncintpicadeunalgoritmoquenocambialosvaloresdeloselementosdeuncontenedor esladebuscarunelementoydevolversuposicin. Envezdebuscaporunelementodeterminadoelalgoritmodebsquedapuedebuscarporun predicadootambinllamado"functor"quedevuelveTrueoFalsesisecumpleunacondicin. Elusode"functores"aumentalaortogonalidaddelalibrerapermitiendosuaplicacinamuchos mscasos. Unalgoritmomuyutilesfor_each()elcualejecutaunafuncinconloselementosdeun contenedor.Sifirmaes:
t e m p l a t e < c l a s s I n p u t I t e r , C l a s s F u n c t i o n > v o i d f o r _ e a c h ( I n p u t I t e r b , I n p u t I t e r e , F u n c t i o n f )

C++11introducelasfuncioneslambda,ofuncionessinnombre.for_each()sevemuy beneficiadaconlasfuncioneslambdaquesedefinendentrodelallamadaalafuncin. Enlasfuncioneslambda,sesuelenutilizarvariablesstaticpararetenervaloresentremltiples llamadasalafuncin.Porejemplo[](int&i){staticintn=1,i=n++}. Noesimprescindibledefinireltipoquedevuelveunafuncinlambdayaqueelcompiladorlo puedededucirdelaexpresintraselreturn.Sinembargoesposible[](intn)>int{returnn++}. copy()esunalgoritmoquemodificaelcontenedor. Elalgoritmoaccumulate()puederecibircomoparmetrounoperadorbinarioenelcasoes posibleusarunafuncionlambdacomo[](Ta,Tb){....} STLtambinusaobjetosfunciones,quesonclasesquetienendefinidoeloperator().Un ejemplodeusopodrasersum=accumulate(v1,v1*LENGTH,minus<int>())dondeminus esunaclaseconeloperador()definido. OtroconceptoqueseusajuntoconSTLsonlosobjetosgeneradorescomomuestrael siguientecdigo:

c l a s s g e n { p u b l i c : g e n ( d o u b l e x _ z e r o , d o u b l e i n c r e m e n t ) : x ( x _ z e r o ) , i n c r ( i n c r e m e n t ) { } d o u b l e o p e r a t o r ( ) ( ) { x + = i n c r r e t u r n x * x } p r i v a t e : d o u b l e x , i n c r } d o u b l e i n t e g r a t e ( g e n g , i n t n ) { v e c t o r < d o u b l e > f x ( n ) s t d : : g e n e r a t e ( f x . b e g i n ( ) , f x . e n d ( ) , g ) r e t u r n ( a c c u m u l a t e ( f x . b e g i n ( ) , f x . e n d ( ) , 0 . 0 ) / n ) } i n t m a i n ( ) { c o n s t i n t n = 1 0 0 0 g e n g ( 0 . 0 , 1 . 0 / n ) c o u t < < i n t e g r a t i o n p r o g r a m x * * 2 < < e n d l c o u t < < i n t e g r a t e ( g , n ) < < e n d l }

Elcomportamientodelalgoritmogenerate()delaSTLesequivalentea:
t e m p l a t e < c l a s s F o r w a r d I t e r a t o r , c l a s s G e n e r a t o r > v o i d g e n e r a t e ( F o r w a r d I t e r a t o r f i r s t , F o r w a r d I t e r a t o r l a s t , G e n e r a t o r g e n ) { w h i l e ( f i r s t ! = l a s t ) { * f i r s t = g e n ( ) + + f i r s t } }

DentrodelaSTLhayobjetosdefuncionespredefinidosquesepuedenclasificarcomoobjetos aritmticos,decomparacinolgicos. Losobjetosaritmticossonplus,minus,times,divides,modulusynegatequetienenla forma:


t e m p l a t e < c l a s s T > s t r u c t p l u s < T >

queenestecasosumadosoperadoresdeltipoT. Elalgoritmotransform()aplicaunafuncinaloselementosdeuncontenedoryguardael

resultadoenotrocontenedor. Esposibledefinirelrangodedestinoigualalrangodeentradadeformaderealizarlaoperacin enellugar.


t e m p l a t e < c l a s s I n p u t I t e r a t o r , c l a s s O u t p u t I t e r a t o r , c l a s s U n a r y O p e r a t o r > O u t p u t I t e r a t o r t r a n s f o r m ( I n p u t I t e r a t o r f i r s t 1 , I n p u t I t e r a t o r l a s t 1 , O u t p u t I t e r a t o r r e s u l t , U n a r y O p e r a t o r o p ) { w h i l e ( f i r s t 1 ! = l a s t 1 ) { * r e s u l t = o p ( * f i r s t 1 ) + + r e s u l t + + f i r s t 1 } r e t u r n r e s u l t }

Lafuncinbind2nd()construyeunobjetofuncinunitariadesdeunobjetofuncinbinariaop asociandoelsegundoparmetroaunvalorfijoxcomosemuestraenelsiguienteejemplode aplicacin transform(data,data+LENGTH,data,bind2nd(times<int>(),2)): Lafuncintransform()necesitaunobjetofuncinunitaria,perotimes<int>()esunobjeto funcinunitaria.Conelusodebind2nd()logramosduplicarelvalordeloselementosdeun contenedor.

Hex, the game and C++ Inheritance


Unjuegoconinformacinperfectaesunodondeeloponentetienetodalainformacin disponible. Unajugadarazonableserahacerelcaminolomslargoposibleybloquearaloponentepara questelohaga. LametodologadeOOPsebasaenlaapropiadaeleccindetiposapropiadosparaeldominio (porejemploenHexeltableroylosgrafos)ydefinirsusinterrelaciones. LasintaxisenC++esclassclassname:(public|protected|private)optbasename{...}.La herenciapblicaeslamsimportanteyseaplicaamsdel90%deloscasos. LaclasepairenC++11fuegeneralizadaportuple. Siunmiembrodeunaclasesedefinecomoprotectedpuedeserutilizableporlasclasesque heredandeesaclase,paracualquierotroobjetoesinaccesiblecomolosmiembrosdefinidos comoprivados.

Elmecanismodelaherenciapermiteobtenernuevasclasesdeclasesexistentes(llamadas clasesbase). Tienecomoobjetivoreutilizarcdigoylasclasesobtenidassedesarrollandelaclasebase agregandonuevocdigoocdigoalternativo.Engenerarlasclasesheredadasagregan informacin. Lajerarquadetiposrelacionadospermitecompartircdigoeinterfaz. EnC++esposibledefinirsimpleomltipleherencia. Lasclasespermitendefinirunaclasificacintaxonmica,esdecirgruposdeclasesque compartenungrupodecaractersticas. Entrelasclasessepuedendefinirdistintostiposderelaciones.PorejemplounelefanteISA mamfero,ylaclasecircoHASAelefante. Unamtodovirtualesunmtodoqueesdeclaradoenlaclasebaseypuedeserreemplazado (overridden)enlaclasederivada.Estereemplazosediferenciadelasobrecargaenquepuede tenerlamismafirma.MedianteelpunterothisC++accedealafuncinadecuadaparacada claseentiempodeejecucinenformadinmica.Aestemecanismoselollamapolimorfismo puro. Paraqueestoseaposible,elobjetodebetenerinformacindetipoquepuedaserusada dinmicamente. Paraevitarlasobrecargaasociadaalastablasdebsquedadinmicaentiempodeejecucin debedefinirseunmtodocomonovirtual. Porejemplosidefinimosclasspoint3d:publicpoint{...}elconstructordelaclasepoint3d podraserpoint3d():point(),z(0.0){}elcualllamaalconstructordesuancestro. C++permiteimpedirquesepuedaheredardeunaclaseconlapalabraclavefinal.Porejemplo enladefinicinclasspoint3dfinal:publicpoint{...}laclasepoint3dnosepudeutilizarpara derivarunanuevaclase. ElconceptodepuentesesunaestrategiamuyusadaenHexyrecomiendaincorporarcomo partedelprograma. Paraidentificarunnodo(i,j)sepuedeutilizarlafrmulan=i*lado+jdndeladoeslalongitud deceldasporladodeltablero.Deestaformasepuedepasardelarepresentacin bidimensionaldeltableroaunalinealdenodos.Parapasardelnmerodeno=doala representacinbidireccionalsepuedeusarladivisinyelmdulodeenterosi=n/ladoj=n %ladoEnamboscasosi,jyncomienzanen0. UnejemplodelaclasehexGraphpodraser:

c l a s e h e x G r a p h { p u b l i c : h e x G r a p h ( ) { i n t c o u n t = 0 e d g e l i s t . r e s i z e ( 1 2 1 ) f o r ( i n t i = 0 i < 1 1 i + + ) f o r ( i n t j = 0 j < 1 1 j + + ) m a k e N o d e ( i , j , e d g e l i s t [ c o u n t + + ] ) } p r i v a t e : v e c t o r < d e q u e < i n t > > e d g e l i s t }

Porejemplo,paranodosinternoslasconexionesson:
e l s e { e l i s t . p u s h _ f r o n t ( i * 1 1 + j + 1 ) e l i s t . p u s h _ f r o n t ( i * 1 1 + j 1 ) e l i s t . p u s h _ f r o n t ( ( i + 1 ) * 1 1 + j ) e l i s t . p u s h _ f r o n t ( ( i + 1 ) * 1 1 + j + 1 ) e l i s t . p u s h _ f r o n t ( ( i 1 ) * 1 1 + j ) e l i s t . p u s h _ f r o n t ( ( i 1 ) * 1 1 + j 1 ) }

Laexpresinvoidprint()constindicaqueelpunterothisnoseverafectadodentrodel miembroprint(). Serecomiendautilizarprotectedenlugardeprivateparadefinirmiembrosdeunaclase,ya quesinousaesaclaseparacrearsubclases,elencapsulamientoselograigual,perodejala puertaabiertaacrearsubclases. GradyBoochescribivariasreglasdebuenasprcticasdeOOP.Unadeellasindicaquees convenienteentenderlosobjetosenelmundorealantesdecrearelprograma,ymuchasveces elprogramadordebetrabajarconunespecialistaeneldominioparaelcualseaplicael programa. Punterosdeltipodelaclasebasepuedenserutilizadosparaapuntarobjetosdelassubclases. Silaclasegrad_studentheredadestudent,entoncessepuedereemplazarelmtodoprint()de studentengrad_studentconestasintaxis:
v o i d g a d _ s t u d e n t : : p r i n t ( ) { s t u d e n t : : p r i n t ( ) c o u t < < n e w s t a f f }

Esimportantedestacarelusodeoperador::parapoderllamaralmiembrodelaclasebase.

Cuandolosmtodosnosonvirtuales,cadallamadoaprint(),dependiendodeltipodelpuntero, imprimelainformacindistinta,limitadaasutipo.Esteeselcomportamientopordefault.
s t u d e n t s ( ) , * p s = & s g r a d _ s t u d e n t g s ( ) , * p g s p s > p r i n t ( ) / / s t u d e n t : : p r i n t p s = p g s = & g s p s > p r i n t ( ) / / s t u d e n t : : p r i n t p g s > p r i n t ( ) / / g r a d _ s t u d e n t : : p r i n t

Elpunteropspuedeapuntaraobjetosdeltipostudentygrad_student,peroelpunteropgs solopuedeapuntaraobjetosdeltipograd_student. Conelusodevirtual,elcomportamientonodependedeltipodelpuntero(comoenelejemplo anterior)sinoaltipodelobjetoqueapunta. Elusodevirtualhacequeelcompiladornopuedadefinirdeantemanoquemiembrollamar,sino quecreaunatabladepunterosafuncionesqueesusadaentiempodeejecucin.Entiempode ejecucinelprogramaverificaaquetipodeobjetoestapuntando(informacinqueseguarda juntoconelobjeto)yejecutalafuncinadecuadaparaesetipo. Estoagregaungastoadicionalalllamadodelafuncin,yporesoenC++noesel comportamientopordefaultyrequiereelusodevirtual. Unavezqueseutilizaladecoracinvirtualparadefinirunmiembro,esacaractersticapersiste, ynoesnecesarioutilizarvirtualenlassubclases. Elsiguientecdigoejemplificaelcomportamientodevirtual:
c l a s s B { p u b l i c : i n t i v i r t u a l v o i d p r i n t _ i ( ) c o n s t { c o u t < < i < < i n s i d e B < < e n d l } } c l a s s D : p u b l i c B { p u b l i c : v o i d p r i n t _ i ( ) c o n s t { c o u t < < i < < i n s i d e D < < e n d l } / / v i t u a l } m a i n ( ) { B b , p b = & b D f f . i = 1 + ( b . i = 1 ) p b > p r i n t _ i ( ) / / c a l l B : : p r i n t _ i ( ) p b = & f p b > p r i n t _ i ( ) / / c a l l D : : p r i n t : i ( ) }

Sepuedegenerarconfusionesentrefuncionessobrecargadas(overloaded)ylasfunciones reemplazadas(overrided),especialmenteencasosdeconversinautomticadetipos. Esdeseablenorealizarelsiguientecdigoporquepuededarlugaraerroresocultos


c l a s s B { p u b l i c : v i r t u a l f o o ( i n t ) v i r t u a l f o o ( d o u b l e ) / / o v e r l o a d i n g } p u b l i c D : p u b l i c B { p u b l i c : f o o ( i n t ) / / o v e r r i d e } m a i n ( ) { D d B b , * p b = d b . f o o ( 9 . 5 ) / / B : : f o o ( d o u b l e ) d . f o o ( 9 . 5 ) / / D : : f o o ( i n t ) p b > f o o ( 9 . 5 ) / / B : : f o o ( d o u b l e ) }

Soloesposibledefinirmtodosvirtualesenaquellosquenosonestticos(esdecirqueestn asociadosalaclaseynoalosobjetos). Tampocopuedenservirtualeslosconstructores(aunquelafuncionalidadsepuedecodificar conelpatrnfbrica),perosilosdestructores.Lamayoradelasvecesqueusamosherencia sedefinenlosdestructorescomovirtuales.

Min-Max and C++11 Classes; Alpha-beta and Polish


t e m p l a t e < c l a s s T , i n t n > c l a s s m y _ c o n t a i n e r { p u b l i c : m y _ c o n t a i n e r ( ) { a = n e w T [ n ] } ~ m y _ c o n t a i n e r ( ) { d e l e t e [ ] a } p r i v a t e : T * a }

UnaprincipaldiferenciaalincluireltamaodelarrayenladescripcindelTemplateenlugarde enlafirmadelconstructoresqueunaclasede5elementosesdeuntipodistintoaunaclasede 10elementos.

e x p l i c i t m y _ c o n t a i n e r ( T * b ) : m y _ c o n t a i n e r ( ) { f o r ( i n t i = 0 i < n i + + ) a [ i ] = b [ i ] }

Esteconstructortieneunsoloargumento,ygeneralmentelosconstructoresconunsolo argumentoseutilizanparaconversindetipo.Asuvezexplicitevitalasconversiones automticas. Lasintaxis:my_containter()essimilaralasintaxisdeunconstructordeunasubclase llamandoalaclasebase,peroenrealidadexpresaunanuevacaractersticallamadadelegacin deconstruccin(Delegateconstruction).Estanuevacaractersticafacilitalautilizacinde cdigoexistente. Elsiguienteesuntpicoconstructordecopiaquetambinusaladelegacindeconstruccin.


m y _ c o n t a i n e r ( c o n s t m y _ c o n t e i n e r & b ) : m y _ c o n t a i n e r ( ) { f o r ( i n t i = 0 i < n i + + ) / / c l o n a l a m e m o r i a . a [ i ] = b . a [ i ] }

Losconstructorestpicosdeunaclasesoneldefault,quenotieneparmetroslosde conversin,conunsoloparmetroyeldecopia. EnC++11seagregaelconstructormove


m y _ c o n t a i n e r ( m y _ c o n t e i n e r & & b ) n o e x c e p t { a = b . a / / r e f e r e n c i a l c o p y o s h a l l o w c o p y . b . a = n u l l p t r / / }

Enelejemploanteriorseagreganoexcept,quetambinseagregaenC++11,garantizandoque dentrodelcdigoelprogramadorgarantizaquenosevanagenerarexcepciones. &&hacereferenciaaqueesunconstructormove. Elconstructormoveesparaelcasoquelavariableseutilizaenelladoderechodeuna expresin.ElpunterooriginalesasociadoaNULL,porlotantonosepuedeutilizar. Algunosejemplosdedeclaraciones:


i n t & a = b / / a i s a n l v a l u e r e f e r e n c e . i n t * p t r _ a = & b / / p t r _ a i s a d d r e s s o f b . i n t & & b / / n e w d e c l a r a t i o n r v a l u e r e f e r e n c e

Unareferenciaaunrvalueasociaaunobjetotemporal,quetpicamentenosevaavolvera usar. Cuandosecreaunconstructormovetambinnormalmentesesobrecargaeloperador=


m y _ c o n t a i n e r & o p e r a t o r = ( m y _ c o n t e i n e r & & b ) n o e x c e p t { a = b . a b . a = n u l l p t r r e t u r n * t h i s / / r e g r e s a n d o e l p u n t e r o a l o b j e t o e l o p e r a d o r s e p u e d e / / e n c a d e n a r . }

Nuevamente,enestecaso,elrvaluedejadeservlido. Elnuevoconceptomoveesutilizadocuandosetrabajaconconjuntosdedatos,paravalores simplescomointodouble,notienesentido. Untipousodelnuevoconceptomoveesenlafuncinswap()


v o i d s w a p ( m y _ c o n t e i n e r & b ) { m y _ c o n t a i n e r t e m p = m o v e ( b ) b = m o v e ( * t h i s ) * t h i s = m o v e ( t e m p ) }

/ / b d e j a d e s e r u n p u n t e r o v l i d o .

Elusodedeloperadormove()luegodel=indicaquesedeseautilizareloperador=conla firmade&&paramoverynocopiar. Ladefiniciondemoveesstd:move()static_cast<T&&>(t) Esconvenienteparaejercitaragregareloperador[](index)alaclaseyimplementarlalgicade iteradores. Vislumbrarelfuturo(lookahead)esmuyusadoenAIdejuegos.Avecessepuedellegaralfinal deljuego,enotrashastallegaraunaposicinprometedora. EstavisinafuturosepuedeimplementarconelalgoritmoMinmax.Laideadelalgoritmoes elegirlajugadaquehagamenosposiblequeeloponenteminimicenuestropuntajeconsu prximajugada,yasenadelante.SeaplicaajuegosconinformacinperfectayMinimaxesun algoritmorecursivo. Estealgoritmosedebellamarcadavezquelacomputadoradebehacerunajugada.A continuacinunejemplo:

[ 6 ] M A X / | \ [ 1 ] [ 6 ] [ 3 ] M I N / \ | / | \ [ 5 ] 1 [ 6 ] 7 [ 3 ] [ 9 ] M A X / \ / | | | 2 5 6 1 3 9 M I N

EnlajergasedefinePlyacadapasoenlaprofundidadtotaldelrbolyBranchingrateala cantidaddenodosquecuelgandecadanodo. PararecortarelrbolesbuenodefinirunalgoritmoquegenereloquesellamaPlausibleMove, quesonlasjugadasmsprometedoras. EnHexestealgoritmopodraanalizar: Sisepuedengenerarjugadasganadoras. Sisepuedebloquearoprevenirqueeloponentegane. Siesposibleextenderelcaminomslargo. Siesposiblebloquearelcaminomslargodeloponente. Siesposibleextenderohacerunpuenteparauncamino. Siesposibletomarunadelascasillascentrales Sisepuedemoverhaciaunacolumna(ofila)annoocupada TodaalgoritmodeIArequierelaposibilidaddeevaluarunaposicinestticaparacomparary elegirunajugadaenlugardeotra.EnHex,quienestmscercadehaceruncaminocompleto deextremoaextremo,esunaformarpidaderealizarestaevaluacin. AlfaBetaesunaevolucindeMinmax.Elalgoritmopodalasramasquenoinfluyenenla decisindelalgoritmosMinmax. Lapodaalfabetatomadichonombredelautilizacindedosparmetrosquedescribenlos lmitessobrelosvaloreshaciaatrsqueaparecenalolargodecadacamino. eselvalordelamejoropcinhastaelmomentoalolargodelcaminoparaMAX,esto implicarporlotantolaeleccindelvalormsalto.sesueleinicializareninfinito. eselvalordelamejoropcinhastaelmomentoalolargodelcaminoparaMIN,esto implicarporlotantolaeleccindelvalormsbajo.sesueleinicializaren+infinito. Estabsquedaalfabetavaactualizandoelvalordelosparmetrossegnserecorreelrbol.El mtodorealizarlapodadelasramasrestantescuandoelvaloractualqueseestexaminando seapeorqueelvaloractualdeoparaMAXoMIN,respectivamente.

[ 5 ] M A X

/ | \ [ 5 ] [ 3 * ] [ 4 * ] M I N / | / | \ | \ [ 5 ] [ 7 * ] [ 8 ] [ 3 ] [ * ] [ 4 ] [ * ] M A X

/|/|\/|||\|\/|\ 457388439534547 ******* Unavezqueencuentraelmaximizadorencuentrael7*,sabequealminimizadordeorden superiorledejadeinteresartodalarama,porqueaunqueencuentreunvalormenorlmismo(el maximizador)lovaadescartar. Lomismopasacuandoelminimizadorencuentrael3*,sabequealmaximizadordeorden superiorledejadeinteresartodalarama,porqueaunqueencuentreunvalormayorlmismo(el minimizador)lovaadescartar. Laejecucindeunaexpresinmatemticaselapuedevercomounrbol,dondelashojasson losvaloresylosnodosinternoslasoperacionesmatemticas.Sepuedeexpresarcon parntesisoennotacinpolacainversa. Elrecolectordebasuraporreferenciaesunalgoritmoquellevalacuentadecuantospunteros hacenreferenciaaunobjeto,ynoloborranhastaqueesacuentallegueacero.
c l a s s N o d e { f r i e n d c l a s s T r e e f r i e n d o s t r e a m & o p e r a t o r < < ( o s t r e a m & , c o n s t T r e e & ) i n t u s e / / r e f e r e n c e c o u n t G C p r o t e c t e d : N o d e ( ) { u s e = 1 } v i r t u a l v o i d p r i n t ( o s t r e a m & ) = 0 / / p u r e v i r t u a l v i r t u a l ~ N o d e ( ) { } / / n o t e v i r t u a l d e s c t r u c t o r v i r t u a l v o i d p r i n t ( o s t r e a m & o ) = 0 / / p u r e v i r t u a l v i r t u a l i n t e v a l ( ) = 0 / / p u r e v i r t u a l } c l a s s T r e e { f r i e n d c l a s s N o d e / / o k a y b e t w e e n c o u s i n f r i e n d o s t r e a m & o p e r a t o r < < ( o s t r e a m & , c o n s t T r e e & ) N o d e * p / / p o l y m o r p h i c h i e r a r c h y p u b l i c : T r e e ( i n t ) / / c o n s t a n t T r e e ( c h a r ) / / v a r i a b l e T r e e ( c h a r * , T r e e ) / / u n a r y o p e r a t o r T r e e ( c h a r * , T r e e , T r e e ) / / b i n a r y o p e r a t o r T r e e ( c o n s t T r e e & t ) { p = t . p + + p > u s e } / / r e f e r e n t i a l c o p y c o n s t r u c t o r ~ T r e e ( ) { i f ( p > u s e = = 0 ) d e l e t e p } v o i d o p e r a t o r = ( c o n s t T r e e & t ) i n t e v a l ( ) { r e t u r n p > e v a l ( ) } } o s t r e a m & o p e r a t o r < < ( o s t r e a m & o , c o n s t T r e e & t )

{ t . p > p r i n t ( o ) r e t u r n ( o ) } c l a s s L e f t N o d e : p u b l i c N o d e { f r i e n d c l a s s T r e e v i r t u a l v o i d p r i n t ( o s t r e a m & o ) = 0 / / p u r e v i r t u a l v i r t u a l i n t e v a l ( ) = 0 / / p u r e v i r t u a l }

Altenermiembrospuramentevirtuales,nopuedencrearinstanciasdelacaseNode,perosi puedehaberpunterosaNodos.Aestasclasesselasllamaclasesabstractas. AlserNode.eval()unafuncinvirtual,cuandoenTreeseejecutap>eval()seejecutalafuncin adecuadaparacadasubclase.Lomismopasaconprint() Laideadelcolectordebasurasebasaquecadavezqueseasignalainstanciaaunavariable sehaceunacopiadereferenciayseincrementalavariableuse. ComoenelcasodeLeftNode,unaclaseabstractapuedeheredardeotraclaseabstracta.Al finaldebedefinirseunaclaseconcretaderivadadelaclaseabstractacomolassiguientes:


c l a s s I n t N o d e : p u b l i c L e f t N o d e { f r i e n d c l a s s T r e e i n t n v i r t u a l v o i d p r i n t ( o s t r e a m & o ) { o < < n } I n t N o d e ( i n t k ) : n ( k ) { } p u b l i c : i n t e v a l ( ) { r e t u r n n } } c l a s s I d N o d e : p u b l i c L e f t N o d e { f r i e n d c l a s s T r e e c h a r n a m e v i r t u a l v o i d p r i n t ( o s t r e a m & o ) { o < < n a m e } I d N o d e ( c h a r i d ) : n a m e ( i d ) { } p u b l i c : i n t e v a l ( ) { r e t u r n v a l t a b [ n a m e ] } }

Elprimerejemploesparaunaconstante,yelsegundoparaunavariablerepresentadaporun caracteryalmacenadaenunarraydeint.
c l a s s U n a r y N o d e : p u b l i c N o d e { f r i e n d c l a s s T r e e c h a r * o p T r e e o p n d U n a r y N o d e ( c h a r * a , T r e e b ) : o p ( a ) , o p n d ( b ) { } v o i d p r i n t ( o s t r e a m & o ) { o < < ( < < o p < < o p n d < < ) } p u b l i c : i n t e v a l ( )

} i n t U n a r y N o d e : : e v a l ( ) { s w i t c h ( o p [ 0 ] { c a s e : r e t u r n ( o p n d . e v a l ( ) ) c a s e + : r e t u r n ( + o p n d . e v a l ( ) ) d e f a u l t : e r r < < n o o p e r a n d \ n < < e n d l r e t u r n 0 } } c l a s s B i n a r y N o d e : p u b l i c N o d e { f r i e n d c l a s s T r e e c h a r * o p T r e e l e f t T r e e r i g h t B i n a r y N o d e ( c h a r * a , T r e e b , T r e e c ) : o p ( a ) , l e f t ( b ) , r i g h t ( c ) { } v o i d p r i n t ( o s t r e a m & o ) { o < < ( < < l e f t < < o p < < r i g h t < < ) } p u b l i c : i n t e v a l ( ) } i n t B i n a r y N o d e : : e v a l ( ) { s w i t c h ( o p [ 0 ] { c a s e : r e t u r n ( l e f t . e v a l ( ) r i g h t . e v a l ( ) ) c a s e + : r e t u r n ( l e f t . e v a l ( ) + r i g h t . e v a l ( ) ) c a s e * : r e t u r n ( l e f t . e v a l ( ) * r i g h t . e v a l ( ) ) d e f a u l t : e r r < < n o o p e r a n d \ n < < e n d l r e t u r n 0 } }

Conestaformadeprogramarselogracdigofcilmenteextensible. AcontinuacinsemuestranlosconstructoresdelaclaseTree:
T r e e : : T r e e ( i n t n ) { p = n e w I n t N o d e ( n ) } T r e e : : T r e e ( c h a r i d ) { p = n e w I d N o d e ( i d ) } T r e e : : T r e e ( c h a r * o p , T r e e t ) { p = n e w U n a r y N o d e ( o p , t ) } T r e e : : T r e e ( c h a r * o p , T r e e l e f t , T r e e r i g h t ) { p = n e w B i n a r y N o d e ( o p , l e f t , r i g h t ) }

Monte Carlo Evaluation; the C++11 Standard


Incluyendolalibrera<cassert>sedisponedelafuncinvoidassert(intexpresion)Sila expresinesceroimprimeunerroryabortaelprograma.Esteenfoqueproduceunasobrecarga deejecucin,porlotantosehabilitasololamacroNDEBUGnoestdefinida(NDEBUGsignifica NoDebug). Iraproponeelusointensivodeassert()yaqueademsdeverificarelprogramacomplementala documentacinindicandoqueseesperaendeterminadospuntosdelprograma. Lasexcepcionessueleserutilizadasconrecursoslimitados,oerroresenI/O.Nodebeusarse comounaformadelograrunsaltotipogoto.Enloposibleacotaraestoscasoselusode excepciones. Losassertestticospuedenserverificadosporelcompiladoryesunconceptonuevoen C++11(queyavenadelalibreraBoost).Lasintaxisesstatic_assert(bool_contexpr,string) Elsiguienteejemplomuestraelconcepto:
# i n c l u d e < t y p e _ t r a i t s > t e m p l a t e < c l a s s T > v o i d s w a p ( T & a , T & b ) { s t a t i c _ a s s e r t ( s t d : : i s _ c o p y _ c o n s t r u c t i b l e < T > : : v a l u e , S w a p r e q u i e r e s c o p y i n g ) a u t o c = b / / e x p e c t a t i o n o f c o p y b = c a = c }

Lalibrera<type_traits>permitedefinirreglasdelostiposquesepuedenusanenuntemplate, quesuelenserfuentedeerroresdifcilesdeencontrar. throweslainstruccinquelanzaunaexcepcin,yaceptacualquiertipodevalor,aunque generalmenteseutilizauntexto.


# i n c l u d e < i o s t r i n g > u s i n g n a m e s p a c e s t d m a i n ( ) { t r y { c o u t < < t e s t < < e n d l t h r o w A b o r t } c a t c h ( . . . ) { c o u t < < D o n t a b o r t < < e n d l } }

Lasintaxisdecatchescatch(sometype).Elvalores...esespecialysignificaquecualquier excepcinsercapturada.

Eltipodelvalorusadoenthrowdebecoincidirconeltipocapturado. LaSTLdefineen<exceptions>lasexcepcionesestndarquesonusadasenlalibrera.Los tiposestnorganizadosenunajerarquadeclasesquelosagrupayrelaciona. Esposibledefinirnuevasexceptionsconlasiguienteextructura:


# i n c l u d e < e x c e p t i o n s > u s i n g n a m e s p a c e s t d c l a s s m y e x c e p t i o n : p u b l i c e x c e p t i o n { v i r t u a l c o n s t c h a r * w h a t ( ) c o n s t t h r o w ( ) { r e t u r n M y e x c e p t i o n h a p p e n e d } } m y e x i n t m a i n ( ) { t r y { t h r o w m y e x } c a t c h ( e x c e p t i o n & e ) { c o u t < < e . w h a t ( ) < < e n d l } r e t u r n 0 }

Enestecaso,encatch()enlugardeexceptionpodrahaberseespecializadocon myexception. ParalamultitareaC++11incluyelaslibreras<thread>,<mutex>,<future>,<atomic>y <condition_variable>. Simpleejemplodemultithread:


# i n c l u d e < i o s t r e a m > # i n c l u d e < s t i n g > # i n c l u d e < t h r e a d > v o i d m e s s a g e 1 ( ) { c o u t < < W r i t e a M e s s a g e ! \ n } i n t m a i n ( ) { t h r e a d f o o ( [ ] ( ) { / / d e c l a r e a s a t h r e a d a l a m b d a e x p r e s i o n c o u t < < H e l l o W o r l d \ n } ) t h r e a d t h r 1 ( m e s s a g e 1 ) t h r 1 . j o i n ( ) f o o . j o i n ( )

Paracompilarengccsedebeusarlaopcinpthread. Esimportantehacerverificacionesqueellasobrecargadelusodethreadjustifiquelasoluciny resulteenunprogramamseficiente. Lalibrera<tuple>defineeltemplatetuple<listadetipos>quepermiteasociarunapequea cantidaddeelementosdecualquiertipo. Porejemplo,sidefinimoslavariablepcomotuple<int,double,int>,paraasociarunnuevo tuplealavariablepodramosusarelcdigop=make_tuple(1,1.5,2)yparaobtenerlos valoresindependientessedebeusarget<0>(p)get<1>(p)yget<2>(p) Tupleayudaalaprogramacinbasadaengenricos. AcontinuacinunresumendedistintasfuncionalidadesdeC++11(lasnuevasestnresaltadas ennegrita).
# i n c l u d e < i o s t r e a m > # i n c l u d e < s t r i n g > u s i n g n a m e s p a c e s t d c l a s s s i m p l e { p u b l i c : s i m p l e ( ) = d e f a u l t / / c o m p i l e r g e n e r a t e d c o n s t r u c t o r s i m p l e ( d o u b l e x ) = d e l e t e / / s u p p r e s s e d c o n v e r s i o n c o n s t r u c t o r / / i m p i d e q u e e s a f i r m a s e a v l i d a s i m p l e ( i n t x , i n t y ) : p ( x ) , q ( y ) { } s i m p l e ( i n t x ) : s i m p l e ( x , 1 ) { } / / d e l e g a t e c o n s t r u c t o r s i m p l e ( c o n s t s i m p l e & x ) : s i m p l e ( x . p , x . p ) { } / / c o p y c o n s t r u c t o r s i m p l e ( s i m p l e & & x ) : s i m p l e ( x . p , x . p ) { x . p = x . p = 0 } / / m o v e s e m a n t i c s p r i v a t e : i n t p = 0 , q = 1 / / d e f a u l t i n i t i a l i z e r c a n b e o v e r r i d d e n } c l a s s r a t i o n a l : p u b l i c s i m p l e { p u b l i c u s i n g s i m p l e : : s i m p l e / / i m p l i c i t l y d e c l a r e s c o n s t r u c t o r s b u t u s e b a s e . / / i m p o r t a l o s c o n s t r u c t o r e s d e l a c l a s e b a s e . }

Lospatronesdediseodebentenerunnombre,resolverunproblemaysuutilizacintiene consecuencias. Haypatronesdecreacin(ejFactoryMethodySingleton),patronesestructurales(ejFaadey Proxy). ElpatrnFactoryMethodseutilizaenloscasosqueelcdigosabeacercadelasclases

abstractasbaseperonosabenadasobrelassubclasesconcretas.Lacreacindelas subclasessedelegaaltiempodeejecucin. Enelpatrnparticipanlasclasesabstractas(quedefinenlacategoradelosobjetos)ylos objetosconcretos. Elcreadorllamaamtodosparalacreacinyelcreadorconcretosobreescribeelfactory methodparacrearelobjetoconcreto. Sigueunejemplo:


c l a s s C r e a t o r { p u b l i c : v i r t u a l O b j e c t * c r e a t e ( O b j e c t T y p e ) = 0 } O b j e c t * C r e a t o r : : c r e a t e ( O b j e c t T y p e i d ) { i f ( i d = = o b j 1 ) r e t u r n n e w O b j _ 1 i f ( i d = = o b j 2 ) r e t u r n n e w O b j _ 2 e l s e r e t u r n 0 / / e r r o r n u l l o b j e c t }

Cualquierobjetoconcretoquesecreedebepoderserapuntadoporunpunterodelacasebase. OtropatrntileselAdaptador,cuyopropsitoesconvertirlainterfazdeunaclaseenlade otra.Lamotivacinesparareutilizarcdigo. PorejemploenSTLlaclasestackesunadaptadordevector.

Anda mungkin juga menyukai