Upload
microsoft
View
1.385
Download
3
Embed Size (px)
DESCRIPTION
Le langage C++ a toujours la réputation d’un langage complexe, demandant une rigueur de tous les instants et qui peut en rebuter plus d’un. Mais avec l’arrivée de la nouvelle norme C++11 et de son intégration dans Visual Studio 11 (et intégration partielle dans Visual Studio 2010), elle permet comme le souligne Herb Sutter, d’écrire désormais du code "Clean, Safe and Fast", nous passons à l'ère du C++ moderne.
Citation preview
palais des
congregraves
Paris
7 8 et 9
feacutevrier 2012
Christophe PichaudConsultant Architecte Sogeti
Les nouveauteacutes de C++Ecrire du code C++ Moderne (LAN207)
Alain ZanchettaConsultant ArchitecteMicrosoft
C++
Beaucoup de deacuteveloppeurs connaissent le C++ mais nrsquoen eacutecrivent qursquooccasionnellement
Utilisation tactique (Win32 COM) plus du C que du C++
Manque de temps pour suivre les eacutevolutions du langage
Le C++ fait peurhellip
Il se passe laquo enfin raquo quelque chose dans le monde C++
Regain drsquointeacuterecirct de la part des deacuteveloppeurs
Evolutions du langage ndash standard C++ 11
Cette preacutesentation montre le nouveau visage du C++
Plus simple plus sucircr
Et toujours aussi performant
Level 400 =gt 200
Pourquoi cette session C++
Pourquoi choisir C++
ldquoThe going word at Facebook is that lsquoreasonably written C++ code just runs fastrsquo which underscores the enormous effort spent at optimizing PHP and Java code Paradoxically C++ code is more difficult to write than in other languages but
efficient code is a lot easierrdquo ndash Andrei Alexandrescu
The C++ Standards Commitee
httpwwwopen-stdorgjtc1sc22wg21
2011 Approbation du standard C++0x
Ameacutelioration de lrsquoimpleacutementation dans laquo VC++ 11 raquo
2008 Draft pour C++0x
Impleacutementation (partielle) dans Visual C++ 2010
2005 TR1= Library Technical Report 1
Visual C++ 2008 + TR 1
2003 TC1 = corrections C++98
1998 C++ devient un standard ISO (laquo C++98 raquo)
La normalisation du C++
TR1 C++0x C++ 11
TR1 - Technical Report 1shared_ptrltTgt
weak_ptrltTgt
unique_ptrltTgt
regex
tuple
array
hellip
C++ 0xlambdas
r-value reference
auto
decltype
static_assert
Thread
mutex
futureltTgt
vectorltvectorltintgtgt
variadic templates
hellip
C++ mythes et reacutealiteacutes
Template meta-programming
Des macros et de goto
Crsquoest du C
Un langage orienteacute objet compliqueacute
Bas niveau
Non seacutecuriseacutee dangereux
Code dur agrave maintenir
Code crado mais je continue sur le mecircme modegravelehellip
Compliqueacute agrave apprendre
Peu productif
cast
new delete
pointers
Orienteacute objet
Un bon code
principes et techniques
Interfaces riches
Structure de donneacutees compactes et efficaces
le style C++ 11
gestion des erreurs
C++ refreshed
Soit un point A
Soit un ensemble de polygones
Trouver le premier polygone qui contient A
NB ce nrsquoest pas un problegraveme de matheacutematiques
mais une petite illustration de lrsquoeacutevolution du C++
Illustration
C++ laquo classique raquo C
11
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = begbreak
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) delete begreturn ret
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
Plus grosse laquo difficulteacute du C++ raquo la gestion de meacutemoire
difficile drsquoeacuteviter les fuites les doubles libeacuterations lrsquoutilisation de zones deacutejagrave libeacutereacutees
Il nrsquoy a pas de maniegravere unique drsquoallouer la meacutemoire en C++
Mais il y a un meacutecanisme de libeacuteration deacuteterministe
Gestion de la meacutemoire
Gestion automatique du cyle de vie lieacute agrave lrsquoobjet contenant
Cycle de vie aussureacute par le scope avec creacuteation du membre gadget wg
Destruction automatique et de-
allocation de w et wg
class widget
privategadget g
publicvoid draw()
void f() widget w
wdraw()
Principe RAII = Resource Acquisition Is Initialisation
Applicable agrave toutes les ressources laquo preacutecieuses
Meacutemoire
fichiers sockets handles Windows
Destruction deacuteterministe (ie pas besoin de laquo using raquo)
Libeacuteration deacuteterministe
ldquoC++ is the best language for garbage collection principally because it creates less garbagerdquo
Bjarne Stroustrup
Un template C++ disponible dans ltmemorygt
shared_ptrltPolygongt sp(new Polygon())sp-gtDraw(hellip)return sp
Baseacute sur le comptage de reacutefeacuterences
Gain de productiviteacute amp robustesse importants avec impact minimal sur les perfs
Compatible avec les conteneurs STL
Compatible avec le polymorphisme
shared_ptrltDerivedgt est convertible en shared_ptrltBasegt Ne casse pas le meacutecanisme de comptage des reacutefeacuterences
Libeacuteration particuliegravere
shared_ptrltintgt sp((int)CoTaskMemAlloc(sizeof(int))CoTaskMemFree)
Caracteacuteristiques de
shared_ptrltTgt
Possibiliteacute drsquoinstancier shared_ptrltTgt sans modifier T
La gestion des reacutefeacuterences (usesweaks) est dans le
shared_ptr
Fonctionne avec les types preacutedeacutefinis shared_ptrltintgt
Srsquoincorpore dans le code sans modifier les types existants
Un mecircme type peut ecirctre manipuleacute parfois via un
shared_ptr et drsquoautres fois via drsquoautres meacutecanismes
shared_ptr est Non-Intrusif
VS 2008 SP1 (VC9 SP1)
shared_ptrltTgt sp(new T(args))shared_ptrltTgt sp(new T(args) del alloc)
VS 2010 (VC10)
shared_ptrltTgt sp = make_sharedltTgt(args)voire auto sp = make_sharedltTgt(args)
shared_ptrltTgt sp = allocate_sharedltTgt(alloc args)
voire auto sp = allocate_sharedltTgt(alloc args)
Simple et eacutelegant
Eacutecrire le type T une seule fois
Performant
Une seule allocation pour lrsquoobjet et le bloc de comptage
make_sharedltTgt()
Patterns parent enfants observer
Solution weak_ptrltTgt lock() expired()
lock transformation en shared_ptr
expired tester si la ressource est disponible
Casser les cycles avec weak_ptrltTgt
static void do_lock (const char title weak_ptrltresourcegt wp)
shared_ptrltresourcegt sp = wplock()show(title sp)
int main()
demonstrate member function lockshared_ptrltresourcegt sp0(new resource)weak_ptrltresourcegt wp0(sp0)do_lock(weak_ptr with resource wp0)sp0reset()do_lock(expired weak_ptr wp0)return 0
int main()
demonstrate member function expiredcout ltlt boolalphashared_ptrltresourcegt sp(new resource)weak_ptrltresourcegt wp(sp)cout ltlt points to resource ltlt wpexpired () ltlt nspreset ()cout ltlt expired ltlt wpexpired() ltlt nreturn 0
Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))
Remplace auto_ptr qui est obsolegravete
Compatible avec les collections STL (containers)
Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))
unique_ptrltTgt
Effective C++ Third Edition (2005) by Scott Meyers
shared_ptr may be the most widely useful component in TR1
C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu
Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr
Paroles drsquoexperts
delete
C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = begbreak
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) delete begreturn ret
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
nullptr exprime un pointeur nul
Ce nrsquoest pas un int
class Foo
public
Foo(const char s)
Foo(int n)
hellip
Foo f(NULL)
Foo f(nullptr)
nullptr
NULL
Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =
polysbegin()
long et fastidieux agrave eacutecrire
Maintenant avec laquo auto raquo
auto beg = polysbegin()
Type deacuteduit par le compilateur
Equivalent de laquo var raquo en C
auto
auto utilise les regravegles de deacutetection drsquoarguments des
templates
const auto p = foo et const autoamp r = bar compilent
auto
Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute
Permet drsquoeacuteviter les erreurs de types troncations hellip
Fonctionne tregraves bien avec les types comme les
lambdas
auto pourquoi lrsquoutiliser
C++ C
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
RValue = tout ce qui nrsquoest pas LValue
Les reacutefeacuterences de Rvalue permettent deux choses importantes
Deacuteplacement (move semantics) pour la performance
Perfect forwarding pour la geacuteneacutericiteacute
= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)
Ex make_shared
Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre
Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc
Les conteneurs STL sont ldquomove awarerdquo
Move Semantics Perfect
Forwarding
class my_class BigHugeData data
publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr
hellip
Meacutecanique du Move Value Types
my_class f()my_class tmphellipreturn tmp
void main()my_class c = f()
Appel du Move Constructor
C++ C
29
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()
beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
une classe possegravede par deacutefaut 5 opeacuterations
Un constructeur par copie
Un opeacuterateur de copie
Un constructeur de move
Un opeacuterateur de move
Un destructeur
Attention aux impleacutementations par deacutefaut
Une classe C++11 type
Indiquer explicitement un opeacuterateur de copie par deacutefault
class Y
Yamp operator=(const Yamp) = default default copy semantics
Y(const Yamp) = default
Indiquer lrsquointerdiction de la copieclass X
Xamp operator=(const Xamp) = delete Disallow copying
X(const Xamp) = delete
=default et =delete
vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )
arrayltstring50gt a
Conteneurs STL
mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
unordered_mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
unordered_multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
container par deacutefaut vector
compact efficace cache preacutefetch
dictionary map (arbre) ou unordered_map (hash)
vecteur de taillle fixe array
compact efficace cache preacutefetch
vectorltintgt vfor (auto i = vbegin() i = vend() ++i)
i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)
i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip
cbegin() cend() crbegin() crend()
Parcours simples
Exemple for_each = le plus simple
Parcours avec transformations
Exemple copy = copie tous les eacuteleacutements reacutepondant agrave
une condition
Tris
Exemples sort stable_sort lower_bound
Algorithmes trois cateacutegories
All of
Any of
None of
For each
Find
Find end
Find first
Adjacent Find
Count
Mismatch
Equal
Is permutation
Search
Parcours simples
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
Christophe PichaudConsultant Architecte Sogeti
Les nouveauteacutes de C++Ecrire du code C++ Moderne (LAN207)
Alain ZanchettaConsultant ArchitecteMicrosoft
C++
Beaucoup de deacuteveloppeurs connaissent le C++ mais nrsquoen eacutecrivent qursquooccasionnellement
Utilisation tactique (Win32 COM) plus du C que du C++
Manque de temps pour suivre les eacutevolutions du langage
Le C++ fait peurhellip
Il se passe laquo enfin raquo quelque chose dans le monde C++
Regain drsquointeacuterecirct de la part des deacuteveloppeurs
Evolutions du langage ndash standard C++ 11
Cette preacutesentation montre le nouveau visage du C++
Plus simple plus sucircr
Et toujours aussi performant
Level 400 =gt 200
Pourquoi cette session C++
Pourquoi choisir C++
ldquoThe going word at Facebook is that lsquoreasonably written C++ code just runs fastrsquo which underscores the enormous effort spent at optimizing PHP and Java code Paradoxically C++ code is more difficult to write than in other languages but
efficient code is a lot easierrdquo ndash Andrei Alexandrescu
The C++ Standards Commitee
httpwwwopen-stdorgjtc1sc22wg21
2011 Approbation du standard C++0x
Ameacutelioration de lrsquoimpleacutementation dans laquo VC++ 11 raquo
2008 Draft pour C++0x
Impleacutementation (partielle) dans Visual C++ 2010
2005 TR1= Library Technical Report 1
Visual C++ 2008 + TR 1
2003 TC1 = corrections C++98
1998 C++ devient un standard ISO (laquo C++98 raquo)
La normalisation du C++
TR1 C++0x C++ 11
TR1 - Technical Report 1shared_ptrltTgt
weak_ptrltTgt
unique_ptrltTgt
regex
tuple
array
hellip
C++ 0xlambdas
r-value reference
auto
decltype
static_assert
Thread
mutex
futureltTgt
vectorltvectorltintgtgt
variadic templates
hellip
C++ mythes et reacutealiteacutes
Template meta-programming
Des macros et de goto
Crsquoest du C
Un langage orienteacute objet compliqueacute
Bas niveau
Non seacutecuriseacutee dangereux
Code dur agrave maintenir
Code crado mais je continue sur le mecircme modegravelehellip
Compliqueacute agrave apprendre
Peu productif
cast
new delete
pointers
Orienteacute objet
Un bon code
principes et techniques
Interfaces riches
Structure de donneacutees compactes et efficaces
le style C++ 11
gestion des erreurs
C++ refreshed
Soit un point A
Soit un ensemble de polygones
Trouver le premier polygone qui contient A
NB ce nrsquoest pas un problegraveme de matheacutematiques
mais une petite illustration de lrsquoeacutevolution du C++
Illustration
C++ laquo classique raquo C
11
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = begbreak
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) delete begreturn ret
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
Plus grosse laquo difficulteacute du C++ raquo la gestion de meacutemoire
difficile drsquoeacuteviter les fuites les doubles libeacuterations lrsquoutilisation de zones deacutejagrave libeacutereacutees
Il nrsquoy a pas de maniegravere unique drsquoallouer la meacutemoire en C++
Mais il y a un meacutecanisme de libeacuteration deacuteterministe
Gestion de la meacutemoire
Gestion automatique du cyle de vie lieacute agrave lrsquoobjet contenant
Cycle de vie aussureacute par le scope avec creacuteation du membre gadget wg
Destruction automatique et de-
allocation de w et wg
class widget
privategadget g
publicvoid draw()
void f() widget w
wdraw()
Principe RAII = Resource Acquisition Is Initialisation
Applicable agrave toutes les ressources laquo preacutecieuses
Meacutemoire
fichiers sockets handles Windows
Destruction deacuteterministe (ie pas besoin de laquo using raquo)
Libeacuteration deacuteterministe
ldquoC++ is the best language for garbage collection principally because it creates less garbagerdquo
Bjarne Stroustrup
Un template C++ disponible dans ltmemorygt
shared_ptrltPolygongt sp(new Polygon())sp-gtDraw(hellip)return sp
Baseacute sur le comptage de reacutefeacuterences
Gain de productiviteacute amp robustesse importants avec impact minimal sur les perfs
Compatible avec les conteneurs STL
Compatible avec le polymorphisme
shared_ptrltDerivedgt est convertible en shared_ptrltBasegt Ne casse pas le meacutecanisme de comptage des reacutefeacuterences
Libeacuteration particuliegravere
shared_ptrltintgt sp((int)CoTaskMemAlloc(sizeof(int))CoTaskMemFree)
Caracteacuteristiques de
shared_ptrltTgt
Possibiliteacute drsquoinstancier shared_ptrltTgt sans modifier T
La gestion des reacutefeacuterences (usesweaks) est dans le
shared_ptr
Fonctionne avec les types preacutedeacutefinis shared_ptrltintgt
Srsquoincorpore dans le code sans modifier les types existants
Un mecircme type peut ecirctre manipuleacute parfois via un
shared_ptr et drsquoautres fois via drsquoautres meacutecanismes
shared_ptr est Non-Intrusif
VS 2008 SP1 (VC9 SP1)
shared_ptrltTgt sp(new T(args))shared_ptrltTgt sp(new T(args) del alloc)
VS 2010 (VC10)
shared_ptrltTgt sp = make_sharedltTgt(args)voire auto sp = make_sharedltTgt(args)
shared_ptrltTgt sp = allocate_sharedltTgt(alloc args)
voire auto sp = allocate_sharedltTgt(alloc args)
Simple et eacutelegant
Eacutecrire le type T une seule fois
Performant
Une seule allocation pour lrsquoobjet et le bloc de comptage
make_sharedltTgt()
Patterns parent enfants observer
Solution weak_ptrltTgt lock() expired()
lock transformation en shared_ptr
expired tester si la ressource est disponible
Casser les cycles avec weak_ptrltTgt
static void do_lock (const char title weak_ptrltresourcegt wp)
shared_ptrltresourcegt sp = wplock()show(title sp)
int main()
demonstrate member function lockshared_ptrltresourcegt sp0(new resource)weak_ptrltresourcegt wp0(sp0)do_lock(weak_ptr with resource wp0)sp0reset()do_lock(expired weak_ptr wp0)return 0
int main()
demonstrate member function expiredcout ltlt boolalphashared_ptrltresourcegt sp(new resource)weak_ptrltresourcegt wp(sp)cout ltlt points to resource ltlt wpexpired () ltlt nspreset ()cout ltlt expired ltlt wpexpired() ltlt nreturn 0
Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))
Remplace auto_ptr qui est obsolegravete
Compatible avec les collections STL (containers)
Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))
unique_ptrltTgt
Effective C++ Third Edition (2005) by Scott Meyers
shared_ptr may be the most widely useful component in TR1
C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu
Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr
Paroles drsquoexperts
delete
C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = begbreak
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) delete begreturn ret
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
nullptr exprime un pointeur nul
Ce nrsquoest pas un int
class Foo
public
Foo(const char s)
Foo(int n)
hellip
Foo f(NULL)
Foo f(nullptr)
nullptr
NULL
Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =
polysbegin()
long et fastidieux agrave eacutecrire
Maintenant avec laquo auto raquo
auto beg = polysbegin()
Type deacuteduit par le compilateur
Equivalent de laquo var raquo en C
auto
auto utilise les regravegles de deacutetection drsquoarguments des
templates
const auto p = foo et const autoamp r = bar compilent
auto
Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute
Permet drsquoeacuteviter les erreurs de types troncations hellip
Fonctionne tregraves bien avec les types comme les
lambdas
auto pourquoi lrsquoutiliser
C++ C
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
RValue = tout ce qui nrsquoest pas LValue
Les reacutefeacuterences de Rvalue permettent deux choses importantes
Deacuteplacement (move semantics) pour la performance
Perfect forwarding pour la geacuteneacutericiteacute
= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)
Ex make_shared
Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre
Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc
Les conteneurs STL sont ldquomove awarerdquo
Move Semantics Perfect
Forwarding
class my_class BigHugeData data
publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr
hellip
Meacutecanique du Move Value Types
my_class f()my_class tmphellipreturn tmp
void main()my_class c = f()
Appel du Move Constructor
C++ C
29
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()
beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
une classe possegravede par deacutefaut 5 opeacuterations
Un constructeur par copie
Un opeacuterateur de copie
Un constructeur de move
Un opeacuterateur de move
Un destructeur
Attention aux impleacutementations par deacutefaut
Une classe C++11 type
Indiquer explicitement un opeacuterateur de copie par deacutefault
class Y
Yamp operator=(const Yamp) = default default copy semantics
Y(const Yamp) = default
Indiquer lrsquointerdiction de la copieclass X
Xamp operator=(const Xamp) = delete Disallow copying
X(const Xamp) = delete
=default et =delete
vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )
arrayltstring50gt a
Conteneurs STL
mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
unordered_mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
unordered_multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
container par deacutefaut vector
compact efficace cache preacutefetch
dictionary map (arbre) ou unordered_map (hash)
vecteur de taillle fixe array
compact efficace cache preacutefetch
vectorltintgt vfor (auto i = vbegin() i = vend() ++i)
i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)
i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip
cbegin() cend() crbegin() crend()
Parcours simples
Exemple for_each = le plus simple
Parcours avec transformations
Exemple copy = copie tous les eacuteleacutements reacutepondant agrave
une condition
Tris
Exemples sort stable_sort lower_bound
Algorithmes trois cateacutegories
All of
Any of
None of
For each
Find
Find end
Find first
Adjacent Find
Count
Mismatch
Equal
Is permutation
Search
Parcours simples
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
C++
Beaucoup de deacuteveloppeurs connaissent le C++ mais nrsquoen eacutecrivent qursquooccasionnellement
Utilisation tactique (Win32 COM) plus du C que du C++
Manque de temps pour suivre les eacutevolutions du langage
Le C++ fait peurhellip
Il se passe laquo enfin raquo quelque chose dans le monde C++
Regain drsquointeacuterecirct de la part des deacuteveloppeurs
Evolutions du langage ndash standard C++ 11
Cette preacutesentation montre le nouveau visage du C++
Plus simple plus sucircr
Et toujours aussi performant
Level 400 =gt 200
Pourquoi cette session C++
Pourquoi choisir C++
ldquoThe going word at Facebook is that lsquoreasonably written C++ code just runs fastrsquo which underscores the enormous effort spent at optimizing PHP and Java code Paradoxically C++ code is more difficult to write than in other languages but
efficient code is a lot easierrdquo ndash Andrei Alexandrescu
The C++ Standards Commitee
httpwwwopen-stdorgjtc1sc22wg21
2011 Approbation du standard C++0x
Ameacutelioration de lrsquoimpleacutementation dans laquo VC++ 11 raquo
2008 Draft pour C++0x
Impleacutementation (partielle) dans Visual C++ 2010
2005 TR1= Library Technical Report 1
Visual C++ 2008 + TR 1
2003 TC1 = corrections C++98
1998 C++ devient un standard ISO (laquo C++98 raquo)
La normalisation du C++
TR1 C++0x C++ 11
TR1 - Technical Report 1shared_ptrltTgt
weak_ptrltTgt
unique_ptrltTgt
regex
tuple
array
hellip
C++ 0xlambdas
r-value reference
auto
decltype
static_assert
Thread
mutex
futureltTgt
vectorltvectorltintgtgt
variadic templates
hellip
C++ mythes et reacutealiteacutes
Template meta-programming
Des macros et de goto
Crsquoest du C
Un langage orienteacute objet compliqueacute
Bas niveau
Non seacutecuriseacutee dangereux
Code dur agrave maintenir
Code crado mais je continue sur le mecircme modegravelehellip
Compliqueacute agrave apprendre
Peu productif
cast
new delete
pointers
Orienteacute objet
Un bon code
principes et techniques
Interfaces riches
Structure de donneacutees compactes et efficaces
le style C++ 11
gestion des erreurs
C++ refreshed
Soit un point A
Soit un ensemble de polygones
Trouver le premier polygone qui contient A
NB ce nrsquoest pas un problegraveme de matheacutematiques
mais une petite illustration de lrsquoeacutevolution du C++
Illustration
C++ laquo classique raquo C
11
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = begbreak
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) delete begreturn ret
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
Plus grosse laquo difficulteacute du C++ raquo la gestion de meacutemoire
difficile drsquoeacuteviter les fuites les doubles libeacuterations lrsquoutilisation de zones deacutejagrave libeacutereacutees
Il nrsquoy a pas de maniegravere unique drsquoallouer la meacutemoire en C++
Mais il y a un meacutecanisme de libeacuteration deacuteterministe
Gestion de la meacutemoire
Gestion automatique du cyle de vie lieacute agrave lrsquoobjet contenant
Cycle de vie aussureacute par le scope avec creacuteation du membre gadget wg
Destruction automatique et de-
allocation de w et wg
class widget
privategadget g
publicvoid draw()
void f() widget w
wdraw()
Principe RAII = Resource Acquisition Is Initialisation
Applicable agrave toutes les ressources laquo preacutecieuses
Meacutemoire
fichiers sockets handles Windows
Destruction deacuteterministe (ie pas besoin de laquo using raquo)
Libeacuteration deacuteterministe
ldquoC++ is the best language for garbage collection principally because it creates less garbagerdquo
Bjarne Stroustrup
Un template C++ disponible dans ltmemorygt
shared_ptrltPolygongt sp(new Polygon())sp-gtDraw(hellip)return sp
Baseacute sur le comptage de reacutefeacuterences
Gain de productiviteacute amp robustesse importants avec impact minimal sur les perfs
Compatible avec les conteneurs STL
Compatible avec le polymorphisme
shared_ptrltDerivedgt est convertible en shared_ptrltBasegt Ne casse pas le meacutecanisme de comptage des reacutefeacuterences
Libeacuteration particuliegravere
shared_ptrltintgt sp((int)CoTaskMemAlloc(sizeof(int))CoTaskMemFree)
Caracteacuteristiques de
shared_ptrltTgt
Possibiliteacute drsquoinstancier shared_ptrltTgt sans modifier T
La gestion des reacutefeacuterences (usesweaks) est dans le
shared_ptr
Fonctionne avec les types preacutedeacutefinis shared_ptrltintgt
Srsquoincorpore dans le code sans modifier les types existants
Un mecircme type peut ecirctre manipuleacute parfois via un
shared_ptr et drsquoautres fois via drsquoautres meacutecanismes
shared_ptr est Non-Intrusif
VS 2008 SP1 (VC9 SP1)
shared_ptrltTgt sp(new T(args))shared_ptrltTgt sp(new T(args) del alloc)
VS 2010 (VC10)
shared_ptrltTgt sp = make_sharedltTgt(args)voire auto sp = make_sharedltTgt(args)
shared_ptrltTgt sp = allocate_sharedltTgt(alloc args)
voire auto sp = allocate_sharedltTgt(alloc args)
Simple et eacutelegant
Eacutecrire le type T une seule fois
Performant
Une seule allocation pour lrsquoobjet et le bloc de comptage
make_sharedltTgt()
Patterns parent enfants observer
Solution weak_ptrltTgt lock() expired()
lock transformation en shared_ptr
expired tester si la ressource est disponible
Casser les cycles avec weak_ptrltTgt
static void do_lock (const char title weak_ptrltresourcegt wp)
shared_ptrltresourcegt sp = wplock()show(title sp)
int main()
demonstrate member function lockshared_ptrltresourcegt sp0(new resource)weak_ptrltresourcegt wp0(sp0)do_lock(weak_ptr with resource wp0)sp0reset()do_lock(expired weak_ptr wp0)return 0
int main()
demonstrate member function expiredcout ltlt boolalphashared_ptrltresourcegt sp(new resource)weak_ptrltresourcegt wp(sp)cout ltlt points to resource ltlt wpexpired () ltlt nspreset ()cout ltlt expired ltlt wpexpired() ltlt nreturn 0
Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))
Remplace auto_ptr qui est obsolegravete
Compatible avec les collections STL (containers)
Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))
unique_ptrltTgt
Effective C++ Third Edition (2005) by Scott Meyers
shared_ptr may be the most widely useful component in TR1
C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu
Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr
Paroles drsquoexperts
delete
C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = begbreak
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) delete begreturn ret
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
nullptr exprime un pointeur nul
Ce nrsquoest pas un int
class Foo
public
Foo(const char s)
Foo(int n)
hellip
Foo f(NULL)
Foo f(nullptr)
nullptr
NULL
Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =
polysbegin()
long et fastidieux agrave eacutecrire
Maintenant avec laquo auto raquo
auto beg = polysbegin()
Type deacuteduit par le compilateur
Equivalent de laquo var raquo en C
auto
auto utilise les regravegles de deacutetection drsquoarguments des
templates
const auto p = foo et const autoamp r = bar compilent
auto
Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute
Permet drsquoeacuteviter les erreurs de types troncations hellip
Fonctionne tregraves bien avec les types comme les
lambdas
auto pourquoi lrsquoutiliser
C++ C
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
RValue = tout ce qui nrsquoest pas LValue
Les reacutefeacuterences de Rvalue permettent deux choses importantes
Deacuteplacement (move semantics) pour la performance
Perfect forwarding pour la geacuteneacutericiteacute
= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)
Ex make_shared
Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre
Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc
Les conteneurs STL sont ldquomove awarerdquo
Move Semantics Perfect
Forwarding
class my_class BigHugeData data
publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr
hellip
Meacutecanique du Move Value Types
my_class f()my_class tmphellipreturn tmp
void main()my_class c = f()
Appel du Move Constructor
C++ C
29
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()
beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
une classe possegravede par deacutefaut 5 opeacuterations
Un constructeur par copie
Un opeacuterateur de copie
Un constructeur de move
Un opeacuterateur de move
Un destructeur
Attention aux impleacutementations par deacutefaut
Une classe C++11 type
Indiquer explicitement un opeacuterateur de copie par deacutefault
class Y
Yamp operator=(const Yamp) = default default copy semantics
Y(const Yamp) = default
Indiquer lrsquointerdiction de la copieclass X
Xamp operator=(const Xamp) = delete Disallow copying
X(const Xamp) = delete
=default et =delete
vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )
arrayltstring50gt a
Conteneurs STL
mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
unordered_mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
unordered_multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
container par deacutefaut vector
compact efficace cache preacutefetch
dictionary map (arbre) ou unordered_map (hash)
vecteur de taillle fixe array
compact efficace cache preacutefetch
vectorltintgt vfor (auto i = vbegin() i = vend() ++i)
i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)
i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip
cbegin() cend() crbegin() crend()
Parcours simples
Exemple for_each = le plus simple
Parcours avec transformations
Exemple copy = copie tous les eacuteleacutements reacutepondant agrave
une condition
Tris
Exemples sort stable_sort lower_bound
Algorithmes trois cateacutegories
All of
Any of
None of
For each
Find
Find end
Find first
Adjacent Find
Count
Mismatch
Equal
Is permutation
Search
Parcours simples
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
Beaucoup de deacuteveloppeurs connaissent le C++ mais nrsquoen eacutecrivent qursquooccasionnellement
Utilisation tactique (Win32 COM) plus du C que du C++
Manque de temps pour suivre les eacutevolutions du langage
Le C++ fait peurhellip
Il se passe laquo enfin raquo quelque chose dans le monde C++
Regain drsquointeacuterecirct de la part des deacuteveloppeurs
Evolutions du langage ndash standard C++ 11
Cette preacutesentation montre le nouveau visage du C++
Plus simple plus sucircr
Et toujours aussi performant
Level 400 =gt 200
Pourquoi cette session C++
Pourquoi choisir C++
ldquoThe going word at Facebook is that lsquoreasonably written C++ code just runs fastrsquo which underscores the enormous effort spent at optimizing PHP and Java code Paradoxically C++ code is more difficult to write than in other languages but
efficient code is a lot easierrdquo ndash Andrei Alexandrescu
The C++ Standards Commitee
httpwwwopen-stdorgjtc1sc22wg21
2011 Approbation du standard C++0x
Ameacutelioration de lrsquoimpleacutementation dans laquo VC++ 11 raquo
2008 Draft pour C++0x
Impleacutementation (partielle) dans Visual C++ 2010
2005 TR1= Library Technical Report 1
Visual C++ 2008 + TR 1
2003 TC1 = corrections C++98
1998 C++ devient un standard ISO (laquo C++98 raquo)
La normalisation du C++
TR1 C++0x C++ 11
TR1 - Technical Report 1shared_ptrltTgt
weak_ptrltTgt
unique_ptrltTgt
regex
tuple
array
hellip
C++ 0xlambdas
r-value reference
auto
decltype
static_assert
Thread
mutex
futureltTgt
vectorltvectorltintgtgt
variadic templates
hellip
C++ mythes et reacutealiteacutes
Template meta-programming
Des macros et de goto
Crsquoest du C
Un langage orienteacute objet compliqueacute
Bas niveau
Non seacutecuriseacutee dangereux
Code dur agrave maintenir
Code crado mais je continue sur le mecircme modegravelehellip
Compliqueacute agrave apprendre
Peu productif
cast
new delete
pointers
Orienteacute objet
Un bon code
principes et techniques
Interfaces riches
Structure de donneacutees compactes et efficaces
le style C++ 11
gestion des erreurs
C++ refreshed
Soit un point A
Soit un ensemble de polygones
Trouver le premier polygone qui contient A
NB ce nrsquoest pas un problegraveme de matheacutematiques
mais une petite illustration de lrsquoeacutevolution du C++
Illustration
C++ laquo classique raquo C
11
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = begbreak
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) delete begreturn ret
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
Plus grosse laquo difficulteacute du C++ raquo la gestion de meacutemoire
difficile drsquoeacuteviter les fuites les doubles libeacuterations lrsquoutilisation de zones deacutejagrave libeacutereacutees
Il nrsquoy a pas de maniegravere unique drsquoallouer la meacutemoire en C++
Mais il y a un meacutecanisme de libeacuteration deacuteterministe
Gestion de la meacutemoire
Gestion automatique du cyle de vie lieacute agrave lrsquoobjet contenant
Cycle de vie aussureacute par le scope avec creacuteation du membre gadget wg
Destruction automatique et de-
allocation de w et wg
class widget
privategadget g
publicvoid draw()
void f() widget w
wdraw()
Principe RAII = Resource Acquisition Is Initialisation
Applicable agrave toutes les ressources laquo preacutecieuses
Meacutemoire
fichiers sockets handles Windows
Destruction deacuteterministe (ie pas besoin de laquo using raquo)
Libeacuteration deacuteterministe
ldquoC++ is the best language for garbage collection principally because it creates less garbagerdquo
Bjarne Stroustrup
Un template C++ disponible dans ltmemorygt
shared_ptrltPolygongt sp(new Polygon())sp-gtDraw(hellip)return sp
Baseacute sur le comptage de reacutefeacuterences
Gain de productiviteacute amp robustesse importants avec impact minimal sur les perfs
Compatible avec les conteneurs STL
Compatible avec le polymorphisme
shared_ptrltDerivedgt est convertible en shared_ptrltBasegt Ne casse pas le meacutecanisme de comptage des reacutefeacuterences
Libeacuteration particuliegravere
shared_ptrltintgt sp((int)CoTaskMemAlloc(sizeof(int))CoTaskMemFree)
Caracteacuteristiques de
shared_ptrltTgt
Possibiliteacute drsquoinstancier shared_ptrltTgt sans modifier T
La gestion des reacutefeacuterences (usesweaks) est dans le
shared_ptr
Fonctionne avec les types preacutedeacutefinis shared_ptrltintgt
Srsquoincorpore dans le code sans modifier les types existants
Un mecircme type peut ecirctre manipuleacute parfois via un
shared_ptr et drsquoautres fois via drsquoautres meacutecanismes
shared_ptr est Non-Intrusif
VS 2008 SP1 (VC9 SP1)
shared_ptrltTgt sp(new T(args))shared_ptrltTgt sp(new T(args) del alloc)
VS 2010 (VC10)
shared_ptrltTgt sp = make_sharedltTgt(args)voire auto sp = make_sharedltTgt(args)
shared_ptrltTgt sp = allocate_sharedltTgt(alloc args)
voire auto sp = allocate_sharedltTgt(alloc args)
Simple et eacutelegant
Eacutecrire le type T une seule fois
Performant
Une seule allocation pour lrsquoobjet et le bloc de comptage
make_sharedltTgt()
Patterns parent enfants observer
Solution weak_ptrltTgt lock() expired()
lock transformation en shared_ptr
expired tester si la ressource est disponible
Casser les cycles avec weak_ptrltTgt
static void do_lock (const char title weak_ptrltresourcegt wp)
shared_ptrltresourcegt sp = wplock()show(title sp)
int main()
demonstrate member function lockshared_ptrltresourcegt sp0(new resource)weak_ptrltresourcegt wp0(sp0)do_lock(weak_ptr with resource wp0)sp0reset()do_lock(expired weak_ptr wp0)return 0
int main()
demonstrate member function expiredcout ltlt boolalphashared_ptrltresourcegt sp(new resource)weak_ptrltresourcegt wp(sp)cout ltlt points to resource ltlt wpexpired () ltlt nspreset ()cout ltlt expired ltlt wpexpired() ltlt nreturn 0
Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))
Remplace auto_ptr qui est obsolegravete
Compatible avec les collections STL (containers)
Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))
unique_ptrltTgt
Effective C++ Third Edition (2005) by Scott Meyers
shared_ptr may be the most widely useful component in TR1
C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu
Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr
Paroles drsquoexperts
delete
C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = begbreak
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) delete begreturn ret
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
nullptr exprime un pointeur nul
Ce nrsquoest pas un int
class Foo
public
Foo(const char s)
Foo(int n)
hellip
Foo f(NULL)
Foo f(nullptr)
nullptr
NULL
Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =
polysbegin()
long et fastidieux agrave eacutecrire
Maintenant avec laquo auto raquo
auto beg = polysbegin()
Type deacuteduit par le compilateur
Equivalent de laquo var raquo en C
auto
auto utilise les regravegles de deacutetection drsquoarguments des
templates
const auto p = foo et const autoamp r = bar compilent
auto
Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute
Permet drsquoeacuteviter les erreurs de types troncations hellip
Fonctionne tregraves bien avec les types comme les
lambdas
auto pourquoi lrsquoutiliser
C++ C
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
RValue = tout ce qui nrsquoest pas LValue
Les reacutefeacuterences de Rvalue permettent deux choses importantes
Deacuteplacement (move semantics) pour la performance
Perfect forwarding pour la geacuteneacutericiteacute
= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)
Ex make_shared
Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre
Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc
Les conteneurs STL sont ldquomove awarerdquo
Move Semantics Perfect
Forwarding
class my_class BigHugeData data
publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr
hellip
Meacutecanique du Move Value Types
my_class f()my_class tmphellipreturn tmp
void main()my_class c = f()
Appel du Move Constructor
C++ C
29
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()
beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
une classe possegravede par deacutefaut 5 opeacuterations
Un constructeur par copie
Un opeacuterateur de copie
Un constructeur de move
Un opeacuterateur de move
Un destructeur
Attention aux impleacutementations par deacutefaut
Une classe C++11 type
Indiquer explicitement un opeacuterateur de copie par deacutefault
class Y
Yamp operator=(const Yamp) = default default copy semantics
Y(const Yamp) = default
Indiquer lrsquointerdiction de la copieclass X
Xamp operator=(const Xamp) = delete Disallow copying
X(const Xamp) = delete
=default et =delete
vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )
arrayltstring50gt a
Conteneurs STL
mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
unordered_mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
unordered_multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
container par deacutefaut vector
compact efficace cache preacutefetch
dictionary map (arbre) ou unordered_map (hash)
vecteur de taillle fixe array
compact efficace cache preacutefetch
vectorltintgt vfor (auto i = vbegin() i = vend() ++i)
i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)
i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip
cbegin() cend() crbegin() crend()
Parcours simples
Exemple for_each = le plus simple
Parcours avec transformations
Exemple copy = copie tous les eacuteleacutements reacutepondant agrave
une condition
Tris
Exemples sort stable_sort lower_bound
Algorithmes trois cateacutegories
All of
Any of
None of
For each
Find
Find end
Find first
Adjacent Find
Count
Mismatch
Equal
Is permutation
Search
Parcours simples
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
Pourquoi choisir C++
ldquoThe going word at Facebook is that lsquoreasonably written C++ code just runs fastrsquo which underscores the enormous effort spent at optimizing PHP and Java code Paradoxically C++ code is more difficult to write than in other languages but
efficient code is a lot easierrdquo ndash Andrei Alexandrescu
The C++ Standards Commitee
httpwwwopen-stdorgjtc1sc22wg21
2011 Approbation du standard C++0x
Ameacutelioration de lrsquoimpleacutementation dans laquo VC++ 11 raquo
2008 Draft pour C++0x
Impleacutementation (partielle) dans Visual C++ 2010
2005 TR1= Library Technical Report 1
Visual C++ 2008 + TR 1
2003 TC1 = corrections C++98
1998 C++ devient un standard ISO (laquo C++98 raquo)
La normalisation du C++
TR1 C++0x C++ 11
TR1 - Technical Report 1shared_ptrltTgt
weak_ptrltTgt
unique_ptrltTgt
regex
tuple
array
hellip
C++ 0xlambdas
r-value reference
auto
decltype
static_assert
Thread
mutex
futureltTgt
vectorltvectorltintgtgt
variadic templates
hellip
C++ mythes et reacutealiteacutes
Template meta-programming
Des macros et de goto
Crsquoest du C
Un langage orienteacute objet compliqueacute
Bas niveau
Non seacutecuriseacutee dangereux
Code dur agrave maintenir
Code crado mais je continue sur le mecircme modegravelehellip
Compliqueacute agrave apprendre
Peu productif
cast
new delete
pointers
Orienteacute objet
Un bon code
principes et techniques
Interfaces riches
Structure de donneacutees compactes et efficaces
le style C++ 11
gestion des erreurs
C++ refreshed
Soit un point A
Soit un ensemble de polygones
Trouver le premier polygone qui contient A
NB ce nrsquoest pas un problegraveme de matheacutematiques
mais une petite illustration de lrsquoeacutevolution du C++
Illustration
C++ laquo classique raquo C
11
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = begbreak
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) delete begreturn ret
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
Plus grosse laquo difficulteacute du C++ raquo la gestion de meacutemoire
difficile drsquoeacuteviter les fuites les doubles libeacuterations lrsquoutilisation de zones deacutejagrave libeacutereacutees
Il nrsquoy a pas de maniegravere unique drsquoallouer la meacutemoire en C++
Mais il y a un meacutecanisme de libeacuteration deacuteterministe
Gestion de la meacutemoire
Gestion automatique du cyle de vie lieacute agrave lrsquoobjet contenant
Cycle de vie aussureacute par le scope avec creacuteation du membre gadget wg
Destruction automatique et de-
allocation de w et wg
class widget
privategadget g
publicvoid draw()
void f() widget w
wdraw()
Principe RAII = Resource Acquisition Is Initialisation
Applicable agrave toutes les ressources laquo preacutecieuses
Meacutemoire
fichiers sockets handles Windows
Destruction deacuteterministe (ie pas besoin de laquo using raquo)
Libeacuteration deacuteterministe
ldquoC++ is the best language for garbage collection principally because it creates less garbagerdquo
Bjarne Stroustrup
Un template C++ disponible dans ltmemorygt
shared_ptrltPolygongt sp(new Polygon())sp-gtDraw(hellip)return sp
Baseacute sur le comptage de reacutefeacuterences
Gain de productiviteacute amp robustesse importants avec impact minimal sur les perfs
Compatible avec les conteneurs STL
Compatible avec le polymorphisme
shared_ptrltDerivedgt est convertible en shared_ptrltBasegt Ne casse pas le meacutecanisme de comptage des reacutefeacuterences
Libeacuteration particuliegravere
shared_ptrltintgt sp((int)CoTaskMemAlloc(sizeof(int))CoTaskMemFree)
Caracteacuteristiques de
shared_ptrltTgt
Possibiliteacute drsquoinstancier shared_ptrltTgt sans modifier T
La gestion des reacutefeacuterences (usesweaks) est dans le
shared_ptr
Fonctionne avec les types preacutedeacutefinis shared_ptrltintgt
Srsquoincorpore dans le code sans modifier les types existants
Un mecircme type peut ecirctre manipuleacute parfois via un
shared_ptr et drsquoautres fois via drsquoautres meacutecanismes
shared_ptr est Non-Intrusif
VS 2008 SP1 (VC9 SP1)
shared_ptrltTgt sp(new T(args))shared_ptrltTgt sp(new T(args) del alloc)
VS 2010 (VC10)
shared_ptrltTgt sp = make_sharedltTgt(args)voire auto sp = make_sharedltTgt(args)
shared_ptrltTgt sp = allocate_sharedltTgt(alloc args)
voire auto sp = allocate_sharedltTgt(alloc args)
Simple et eacutelegant
Eacutecrire le type T une seule fois
Performant
Une seule allocation pour lrsquoobjet et le bloc de comptage
make_sharedltTgt()
Patterns parent enfants observer
Solution weak_ptrltTgt lock() expired()
lock transformation en shared_ptr
expired tester si la ressource est disponible
Casser les cycles avec weak_ptrltTgt
static void do_lock (const char title weak_ptrltresourcegt wp)
shared_ptrltresourcegt sp = wplock()show(title sp)
int main()
demonstrate member function lockshared_ptrltresourcegt sp0(new resource)weak_ptrltresourcegt wp0(sp0)do_lock(weak_ptr with resource wp0)sp0reset()do_lock(expired weak_ptr wp0)return 0
int main()
demonstrate member function expiredcout ltlt boolalphashared_ptrltresourcegt sp(new resource)weak_ptrltresourcegt wp(sp)cout ltlt points to resource ltlt wpexpired () ltlt nspreset ()cout ltlt expired ltlt wpexpired() ltlt nreturn 0
Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))
Remplace auto_ptr qui est obsolegravete
Compatible avec les collections STL (containers)
Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))
unique_ptrltTgt
Effective C++ Third Edition (2005) by Scott Meyers
shared_ptr may be the most widely useful component in TR1
C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu
Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr
Paroles drsquoexperts
delete
C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = begbreak
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) delete begreturn ret
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
nullptr exprime un pointeur nul
Ce nrsquoest pas un int
class Foo
public
Foo(const char s)
Foo(int n)
hellip
Foo f(NULL)
Foo f(nullptr)
nullptr
NULL
Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =
polysbegin()
long et fastidieux agrave eacutecrire
Maintenant avec laquo auto raquo
auto beg = polysbegin()
Type deacuteduit par le compilateur
Equivalent de laquo var raquo en C
auto
auto utilise les regravegles de deacutetection drsquoarguments des
templates
const auto p = foo et const autoamp r = bar compilent
auto
Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute
Permet drsquoeacuteviter les erreurs de types troncations hellip
Fonctionne tregraves bien avec les types comme les
lambdas
auto pourquoi lrsquoutiliser
C++ C
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
RValue = tout ce qui nrsquoest pas LValue
Les reacutefeacuterences de Rvalue permettent deux choses importantes
Deacuteplacement (move semantics) pour la performance
Perfect forwarding pour la geacuteneacutericiteacute
= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)
Ex make_shared
Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre
Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc
Les conteneurs STL sont ldquomove awarerdquo
Move Semantics Perfect
Forwarding
class my_class BigHugeData data
publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr
hellip
Meacutecanique du Move Value Types
my_class f()my_class tmphellipreturn tmp
void main()my_class c = f()
Appel du Move Constructor
C++ C
29
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()
beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
une classe possegravede par deacutefaut 5 opeacuterations
Un constructeur par copie
Un opeacuterateur de copie
Un constructeur de move
Un opeacuterateur de move
Un destructeur
Attention aux impleacutementations par deacutefaut
Une classe C++11 type
Indiquer explicitement un opeacuterateur de copie par deacutefault
class Y
Yamp operator=(const Yamp) = default default copy semantics
Y(const Yamp) = default
Indiquer lrsquointerdiction de la copieclass X
Xamp operator=(const Xamp) = delete Disallow copying
X(const Xamp) = delete
=default et =delete
vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )
arrayltstring50gt a
Conteneurs STL
mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
unordered_mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
unordered_multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
container par deacutefaut vector
compact efficace cache preacutefetch
dictionary map (arbre) ou unordered_map (hash)
vecteur de taillle fixe array
compact efficace cache preacutefetch
vectorltintgt vfor (auto i = vbegin() i = vend() ++i)
i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)
i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip
cbegin() cend() crbegin() crend()
Parcours simples
Exemple for_each = le plus simple
Parcours avec transformations
Exemple copy = copie tous les eacuteleacutements reacutepondant agrave
une condition
Tris
Exemples sort stable_sort lower_bound
Algorithmes trois cateacutegories
All of
Any of
None of
For each
Find
Find end
Find first
Adjacent Find
Count
Mismatch
Equal
Is permutation
Search
Parcours simples
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
The C++ Standards Commitee
httpwwwopen-stdorgjtc1sc22wg21
2011 Approbation du standard C++0x
Ameacutelioration de lrsquoimpleacutementation dans laquo VC++ 11 raquo
2008 Draft pour C++0x
Impleacutementation (partielle) dans Visual C++ 2010
2005 TR1= Library Technical Report 1
Visual C++ 2008 + TR 1
2003 TC1 = corrections C++98
1998 C++ devient un standard ISO (laquo C++98 raquo)
La normalisation du C++
TR1 C++0x C++ 11
TR1 - Technical Report 1shared_ptrltTgt
weak_ptrltTgt
unique_ptrltTgt
regex
tuple
array
hellip
C++ 0xlambdas
r-value reference
auto
decltype
static_assert
Thread
mutex
futureltTgt
vectorltvectorltintgtgt
variadic templates
hellip
C++ mythes et reacutealiteacutes
Template meta-programming
Des macros et de goto
Crsquoest du C
Un langage orienteacute objet compliqueacute
Bas niveau
Non seacutecuriseacutee dangereux
Code dur agrave maintenir
Code crado mais je continue sur le mecircme modegravelehellip
Compliqueacute agrave apprendre
Peu productif
cast
new delete
pointers
Orienteacute objet
Un bon code
principes et techniques
Interfaces riches
Structure de donneacutees compactes et efficaces
le style C++ 11
gestion des erreurs
C++ refreshed
Soit un point A
Soit un ensemble de polygones
Trouver le premier polygone qui contient A
NB ce nrsquoest pas un problegraveme de matheacutematiques
mais une petite illustration de lrsquoeacutevolution du C++
Illustration
C++ laquo classique raquo C
11
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = begbreak
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) delete begreturn ret
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
Plus grosse laquo difficulteacute du C++ raquo la gestion de meacutemoire
difficile drsquoeacuteviter les fuites les doubles libeacuterations lrsquoutilisation de zones deacutejagrave libeacutereacutees
Il nrsquoy a pas de maniegravere unique drsquoallouer la meacutemoire en C++
Mais il y a un meacutecanisme de libeacuteration deacuteterministe
Gestion de la meacutemoire
Gestion automatique du cyle de vie lieacute agrave lrsquoobjet contenant
Cycle de vie aussureacute par le scope avec creacuteation du membre gadget wg
Destruction automatique et de-
allocation de w et wg
class widget
privategadget g
publicvoid draw()
void f() widget w
wdraw()
Principe RAII = Resource Acquisition Is Initialisation
Applicable agrave toutes les ressources laquo preacutecieuses
Meacutemoire
fichiers sockets handles Windows
Destruction deacuteterministe (ie pas besoin de laquo using raquo)
Libeacuteration deacuteterministe
ldquoC++ is the best language for garbage collection principally because it creates less garbagerdquo
Bjarne Stroustrup
Un template C++ disponible dans ltmemorygt
shared_ptrltPolygongt sp(new Polygon())sp-gtDraw(hellip)return sp
Baseacute sur le comptage de reacutefeacuterences
Gain de productiviteacute amp robustesse importants avec impact minimal sur les perfs
Compatible avec les conteneurs STL
Compatible avec le polymorphisme
shared_ptrltDerivedgt est convertible en shared_ptrltBasegt Ne casse pas le meacutecanisme de comptage des reacutefeacuterences
Libeacuteration particuliegravere
shared_ptrltintgt sp((int)CoTaskMemAlloc(sizeof(int))CoTaskMemFree)
Caracteacuteristiques de
shared_ptrltTgt
Possibiliteacute drsquoinstancier shared_ptrltTgt sans modifier T
La gestion des reacutefeacuterences (usesweaks) est dans le
shared_ptr
Fonctionne avec les types preacutedeacutefinis shared_ptrltintgt
Srsquoincorpore dans le code sans modifier les types existants
Un mecircme type peut ecirctre manipuleacute parfois via un
shared_ptr et drsquoautres fois via drsquoautres meacutecanismes
shared_ptr est Non-Intrusif
VS 2008 SP1 (VC9 SP1)
shared_ptrltTgt sp(new T(args))shared_ptrltTgt sp(new T(args) del alloc)
VS 2010 (VC10)
shared_ptrltTgt sp = make_sharedltTgt(args)voire auto sp = make_sharedltTgt(args)
shared_ptrltTgt sp = allocate_sharedltTgt(alloc args)
voire auto sp = allocate_sharedltTgt(alloc args)
Simple et eacutelegant
Eacutecrire le type T une seule fois
Performant
Une seule allocation pour lrsquoobjet et le bloc de comptage
make_sharedltTgt()
Patterns parent enfants observer
Solution weak_ptrltTgt lock() expired()
lock transformation en shared_ptr
expired tester si la ressource est disponible
Casser les cycles avec weak_ptrltTgt
static void do_lock (const char title weak_ptrltresourcegt wp)
shared_ptrltresourcegt sp = wplock()show(title sp)
int main()
demonstrate member function lockshared_ptrltresourcegt sp0(new resource)weak_ptrltresourcegt wp0(sp0)do_lock(weak_ptr with resource wp0)sp0reset()do_lock(expired weak_ptr wp0)return 0
int main()
demonstrate member function expiredcout ltlt boolalphashared_ptrltresourcegt sp(new resource)weak_ptrltresourcegt wp(sp)cout ltlt points to resource ltlt wpexpired () ltlt nspreset ()cout ltlt expired ltlt wpexpired() ltlt nreturn 0
Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))
Remplace auto_ptr qui est obsolegravete
Compatible avec les collections STL (containers)
Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))
unique_ptrltTgt
Effective C++ Third Edition (2005) by Scott Meyers
shared_ptr may be the most widely useful component in TR1
C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu
Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr
Paroles drsquoexperts
delete
C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = begbreak
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) delete begreturn ret
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
nullptr exprime un pointeur nul
Ce nrsquoest pas un int
class Foo
public
Foo(const char s)
Foo(int n)
hellip
Foo f(NULL)
Foo f(nullptr)
nullptr
NULL
Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =
polysbegin()
long et fastidieux agrave eacutecrire
Maintenant avec laquo auto raquo
auto beg = polysbegin()
Type deacuteduit par le compilateur
Equivalent de laquo var raquo en C
auto
auto utilise les regravegles de deacutetection drsquoarguments des
templates
const auto p = foo et const autoamp r = bar compilent
auto
Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute
Permet drsquoeacuteviter les erreurs de types troncations hellip
Fonctionne tregraves bien avec les types comme les
lambdas
auto pourquoi lrsquoutiliser
C++ C
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
RValue = tout ce qui nrsquoest pas LValue
Les reacutefeacuterences de Rvalue permettent deux choses importantes
Deacuteplacement (move semantics) pour la performance
Perfect forwarding pour la geacuteneacutericiteacute
= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)
Ex make_shared
Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre
Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc
Les conteneurs STL sont ldquomove awarerdquo
Move Semantics Perfect
Forwarding
class my_class BigHugeData data
publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr
hellip
Meacutecanique du Move Value Types
my_class f()my_class tmphellipreturn tmp
void main()my_class c = f()
Appel du Move Constructor
C++ C
29
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()
beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
une classe possegravede par deacutefaut 5 opeacuterations
Un constructeur par copie
Un opeacuterateur de copie
Un constructeur de move
Un opeacuterateur de move
Un destructeur
Attention aux impleacutementations par deacutefaut
Une classe C++11 type
Indiquer explicitement un opeacuterateur de copie par deacutefault
class Y
Yamp operator=(const Yamp) = default default copy semantics
Y(const Yamp) = default
Indiquer lrsquointerdiction de la copieclass X
Xamp operator=(const Xamp) = delete Disallow copying
X(const Xamp) = delete
=default et =delete
vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )
arrayltstring50gt a
Conteneurs STL
mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
unordered_mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
unordered_multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
container par deacutefaut vector
compact efficace cache preacutefetch
dictionary map (arbre) ou unordered_map (hash)
vecteur de taillle fixe array
compact efficace cache preacutefetch
vectorltintgt vfor (auto i = vbegin() i = vend() ++i)
i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)
i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip
cbegin() cend() crbegin() crend()
Parcours simples
Exemple for_each = le plus simple
Parcours avec transformations
Exemple copy = copie tous les eacuteleacutements reacutepondant agrave
une condition
Tris
Exemples sort stable_sort lower_bound
Algorithmes trois cateacutegories
All of
Any of
None of
For each
Find
Find end
Find first
Adjacent Find
Count
Mismatch
Equal
Is permutation
Search
Parcours simples
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
TR1 C++0x C++ 11
TR1 - Technical Report 1shared_ptrltTgt
weak_ptrltTgt
unique_ptrltTgt
regex
tuple
array
hellip
C++ 0xlambdas
r-value reference
auto
decltype
static_assert
Thread
mutex
futureltTgt
vectorltvectorltintgtgt
variadic templates
hellip
C++ mythes et reacutealiteacutes
Template meta-programming
Des macros et de goto
Crsquoest du C
Un langage orienteacute objet compliqueacute
Bas niveau
Non seacutecuriseacutee dangereux
Code dur agrave maintenir
Code crado mais je continue sur le mecircme modegravelehellip
Compliqueacute agrave apprendre
Peu productif
cast
new delete
pointers
Orienteacute objet
Un bon code
principes et techniques
Interfaces riches
Structure de donneacutees compactes et efficaces
le style C++ 11
gestion des erreurs
C++ refreshed
Soit un point A
Soit un ensemble de polygones
Trouver le premier polygone qui contient A
NB ce nrsquoest pas un problegraveme de matheacutematiques
mais une petite illustration de lrsquoeacutevolution du C++
Illustration
C++ laquo classique raquo C
11
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = begbreak
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) delete begreturn ret
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
Plus grosse laquo difficulteacute du C++ raquo la gestion de meacutemoire
difficile drsquoeacuteviter les fuites les doubles libeacuterations lrsquoutilisation de zones deacutejagrave libeacutereacutees
Il nrsquoy a pas de maniegravere unique drsquoallouer la meacutemoire en C++
Mais il y a un meacutecanisme de libeacuteration deacuteterministe
Gestion de la meacutemoire
Gestion automatique du cyle de vie lieacute agrave lrsquoobjet contenant
Cycle de vie aussureacute par le scope avec creacuteation du membre gadget wg
Destruction automatique et de-
allocation de w et wg
class widget
privategadget g
publicvoid draw()
void f() widget w
wdraw()
Principe RAII = Resource Acquisition Is Initialisation
Applicable agrave toutes les ressources laquo preacutecieuses
Meacutemoire
fichiers sockets handles Windows
Destruction deacuteterministe (ie pas besoin de laquo using raquo)
Libeacuteration deacuteterministe
ldquoC++ is the best language for garbage collection principally because it creates less garbagerdquo
Bjarne Stroustrup
Un template C++ disponible dans ltmemorygt
shared_ptrltPolygongt sp(new Polygon())sp-gtDraw(hellip)return sp
Baseacute sur le comptage de reacutefeacuterences
Gain de productiviteacute amp robustesse importants avec impact minimal sur les perfs
Compatible avec les conteneurs STL
Compatible avec le polymorphisme
shared_ptrltDerivedgt est convertible en shared_ptrltBasegt Ne casse pas le meacutecanisme de comptage des reacutefeacuterences
Libeacuteration particuliegravere
shared_ptrltintgt sp((int)CoTaskMemAlloc(sizeof(int))CoTaskMemFree)
Caracteacuteristiques de
shared_ptrltTgt
Possibiliteacute drsquoinstancier shared_ptrltTgt sans modifier T
La gestion des reacutefeacuterences (usesweaks) est dans le
shared_ptr
Fonctionne avec les types preacutedeacutefinis shared_ptrltintgt
Srsquoincorpore dans le code sans modifier les types existants
Un mecircme type peut ecirctre manipuleacute parfois via un
shared_ptr et drsquoautres fois via drsquoautres meacutecanismes
shared_ptr est Non-Intrusif
VS 2008 SP1 (VC9 SP1)
shared_ptrltTgt sp(new T(args))shared_ptrltTgt sp(new T(args) del alloc)
VS 2010 (VC10)
shared_ptrltTgt sp = make_sharedltTgt(args)voire auto sp = make_sharedltTgt(args)
shared_ptrltTgt sp = allocate_sharedltTgt(alloc args)
voire auto sp = allocate_sharedltTgt(alloc args)
Simple et eacutelegant
Eacutecrire le type T une seule fois
Performant
Une seule allocation pour lrsquoobjet et le bloc de comptage
make_sharedltTgt()
Patterns parent enfants observer
Solution weak_ptrltTgt lock() expired()
lock transformation en shared_ptr
expired tester si la ressource est disponible
Casser les cycles avec weak_ptrltTgt
static void do_lock (const char title weak_ptrltresourcegt wp)
shared_ptrltresourcegt sp = wplock()show(title sp)
int main()
demonstrate member function lockshared_ptrltresourcegt sp0(new resource)weak_ptrltresourcegt wp0(sp0)do_lock(weak_ptr with resource wp0)sp0reset()do_lock(expired weak_ptr wp0)return 0
int main()
demonstrate member function expiredcout ltlt boolalphashared_ptrltresourcegt sp(new resource)weak_ptrltresourcegt wp(sp)cout ltlt points to resource ltlt wpexpired () ltlt nspreset ()cout ltlt expired ltlt wpexpired() ltlt nreturn 0
Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))
Remplace auto_ptr qui est obsolegravete
Compatible avec les collections STL (containers)
Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))
unique_ptrltTgt
Effective C++ Third Edition (2005) by Scott Meyers
shared_ptr may be the most widely useful component in TR1
C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu
Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr
Paroles drsquoexperts
delete
C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = begbreak
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) delete begreturn ret
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
nullptr exprime un pointeur nul
Ce nrsquoest pas un int
class Foo
public
Foo(const char s)
Foo(int n)
hellip
Foo f(NULL)
Foo f(nullptr)
nullptr
NULL
Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =
polysbegin()
long et fastidieux agrave eacutecrire
Maintenant avec laquo auto raquo
auto beg = polysbegin()
Type deacuteduit par le compilateur
Equivalent de laquo var raquo en C
auto
auto utilise les regravegles de deacutetection drsquoarguments des
templates
const auto p = foo et const autoamp r = bar compilent
auto
Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute
Permet drsquoeacuteviter les erreurs de types troncations hellip
Fonctionne tregraves bien avec les types comme les
lambdas
auto pourquoi lrsquoutiliser
C++ C
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
RValue = tout ce qui nrsquoest pas LValue
Les reacutefeacuterences de Rvalue permettent deux choses importantes
Deacuteplacement (move semantics) pour la performance
Perfect forwarding pour la geacuteneacutericiteacute
= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)
Ex make_shared
Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre
Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc
Les conteneurs STL sont ldquomove awarerdquo
Move Semantics Perfect
Forwarding
class my_class BigHugeData data
publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr
hellip
Meacutecanique du Move Value Types
my_class f()my_class tmphellipreturn tmp
void main()my_class c = f()
Appel du Move Constructor
C++ C
29
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()
beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
une classe possegravede par deacutefaut 5 opeacuterations
Un constructeur par copie
Un opeacuterateur de copie
Un constructeur de move
Un opeacuterateur de move
Un destructeur
Attention aux impleacutementations par deacutefaut
Une classe C++11 type
Indiquer explicitement un opeacuterateur de copie par deacutefault
class Y
Yamp operator=(const Yamp) = default default copy semantics
Y(const Yamp) = default
Indiquer lrsquointerdiction de la copieclass X
Xamp operator=(const Xamp) = delete Disallow copying
X(const Xamp) = delete
=default et =delete
vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )
arrayltstring50gt a
Conteneurs STL
mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
unordered_mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
unordered_multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
container par deacutefaut vector
compact efficace cache preacutefetch
dictionary map (arbre) ou unordered_map (hash)
vecteur de taillle fixe array
compact efficace cache preacutefetch
vectorltintgt vfor (auto i = vbegin() i = vend() ++i)
i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)
i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip
cbegin() cend() crbegin() crend()
Parcours simples
Exemple for_each = le plus simple
Parcours avec transformations
Exemple copy = copie tous les eacuteleacutements reacutepondant agrave
une condition
Tris
Exemples sort stable_sort lower_bound
Algorithmes trois cateacutegories
All of
Any of
None of
For each
Find
Find end
Find first
Adjacent Find
Count
Mismatch
Equal
Is permutation
Search
Parcours simples
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
C++ mythes et reacutealiteacutes
Template meta-programming
Des macros et de goto
Crsquoest du C
Un langage orienteacute objet compliqueacute
Bas niveau
Non seacutecuriseacutee dangereux
Code dur agrave maintenir
Code crado mais je continue sur le mecircme modegravelehellip
Compliqueacute agrave apprendre
Peu productif
cast
new delete
pointers
Orienteacute objet
Un bon code
principes et techniques
Interfaces riches
Structure de donneacutees compactes et efficaces
le style C++ 11
gestion des erreurs
C++ refreshed
Soit un point A
Soit un ensemble de polygones
Trouver le premier polygone qui contient A
NB ce nrsquoest pas un problegraveme de matheacutematiques
mais une petite illustration de lrsquoeacutevolution du C++
Illustration
C++ laquo classique raquo C
11
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = begbreak
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) delete begreturn ret
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
Plus grosse laquo difficulteacute du C++ raquo la gestion de meacutemoire
difficile drsquoeacuteviter les fuites les doubles libeacuterations lrsquoutilisation de zones deacutejagrave libeacutereacutees
Il nrsquoy a pas de maniegravere unique drsquoallouer la meacutemoire en C++
Mais il y a un meacutecanisme de libeacuteration deacuteterministe
Gestion de la meacutemoire
Gestion automatique du cyle de vie lieacute agrave lrsquoobjet contenant
Cycle de vie aussureacute par le scope avec creacuteation du membre gadget wg
Destruction automatique et de-
allocation de w et wg
class widget
privategadget g
publicvoid draw()
void f() widget w
wdraw()
Principe RAII = Resource Acquisition Is Initialisation
Applicable agrave toutes les ressources laquo preacutecieuses
Meacutemoire
fichiers sockets handles Windows
Destruction deacuteterministe (ie pas besoin de laquo using raquo)
Libeacuteration deacuteterministe
ldquoC++ is the best language for garbage collection principally because it creates less garbagerdquo
Bjarne Stroustrup
Un template C++ disponible dans ltmemorygt
shared_ptrltPolygongt sp(new Polygon())sp-gtDraw(hellip)return sp
Baseacute sur le comptage de reacutefeacuterences
Gain de productiviteacute amp robustesse importants avec impact minimal sur les perfs
Compatible avec les conteneurs STL
Compatible avec le polymorphisme
shared_ptrltDerivedgt est convertible en shared_ptrltBasegt Ne casse pas le meacutecanisme de comptage des reacutefeacuterences
Libeacuteration particuliegravere
shared_ptrltintgt sp((int)CoTaskMemAlloc(sizeof(int))CoTaskMemFree)
Caracteacuteristiques de
shared_ptrltTgt
Possibiliteacute drsquoinstancier shared_ptrltTgt sans modifier T
La gestion des reacutefeacuterences (usesweaks) est dans le
shared_ptr
Fonctionne avec les types preacutedeacutefinis shared_ptrltintgt
Srsquoincorpore dans le code sans modifier les types existants
Un mecircme type peut ecirctre manipuleacute parfois via un
shared_ptr et drsquoautres fois via drsquoautres meacutecanismes
shared_ptr est Non-Intrusif
VS 2008 SP1 (VC9 SP1)
shared_ptrltTgt sp(new T(args))shared_ptrltTgt sp(new T(args) del alloc)
VS 2010 (VC10)
shared_ptrltTgt sp = make_sharedltTgt(args)voire auto sp = make_sharedltTgt(args)
shared_ptrltTgt sp = allocate_sharedltTgt(alloc args)
voire auto sp = allocate_sharedltTgt(alloc args)
Simple et eacutelegant
Eacutecrire le type T une seule fois
Performant
Une seule allocation pour lrsquoobjet et le bloc de comptage
make_sharedltTgt()
Patterns parent enfants observer
Solution weak_ptrltTgt lock() expired()
lock transformation en shared_ptr
expired tester si la ressource est disponible
Casser les cycles avec weak_ptrltTgt
static void do_lock (const char title weak_ptrltresourcegt wp)
shared_ptrltresourcegt sp = wplock()show(title sp)
int main()
demonstrate member function lockshared_ptrltresourcegt sp0(new resource)weak_ptrltresourcegt wp0(sp0)do_lock(weak_ptr with resource wp0)sp0reset()do_lock(expired weak_ptr wp0)return 0
int main()
demonstrate member function expiredcout ltlt boolalphashared_ptrltresourcegt sp(new resource)weak_ptrltresourcegt wp(sp)cout ltlt points to resource ltlt wpexpired () ltlt nspreset ()cout ltlt expired ltlt wpexpired() ltlt nreturn 0
Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))
Remplace auto_ptr qui est obsolegravete
Compatible avec les collections STL (containers)
Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))
unique_ptrltTgt
Effective C++ Third Edition (2005) by Scott Meyers
shared_ptr may be the most widely useful component in TR1
C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu
Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr
Paroles drsquoexperts
delete
C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = begbreak
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) delete begreturn ret
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
nullptr exprime un pointeur nul
Ce nrsquoest pas un int
class Foo
public
Foo(const char s)
Foo(int n)
hellip
Foo f(NULL)
Foo f(nullptr)
nullptr
NULL
Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =
polysbegin()
long et fastidieux agrave eacutecrire
Maintenant avec laquo auto raquo
auto beg = polysbegin()
Type deacuteduit par le compilateur
Equivalent de laquo var raquo en C
auto
auto utilise les regravegles de deacutetection drsquoarguments des
templates
const auto p = foo et const autoamp r = bar compilent
auto
Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute
Permet drsquoeacuteviter les erreurs de types troncations hellip
Fonctionne tregraves bien avec les types comme les
lambdas
auto pourquoi lrsquoutiliser
C++ C
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
RValue = tout ce qui nrsquoest pas LValue
Les reacutefeacuterences de Rvalue permettent deux choses importantes
Deacuteplacement (move semantics) pour la performance
Perfect forwarding pour la geacuteneacutericiteacute
= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)
Ex make_shared
Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre
Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc
Les conteneurs STL sont ldquomove awarerdquo
Move Semantics Perfect
Forwarding
class my_class BigHugeData data
publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr
hellip
Meacutecanique du Move Value Types
my_class f()my_class tmphellipreturn tmp
void main()my_class c = f()
Appel du Move Constructor
C++ C
29
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()
beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
une classe possegravede par deacutefaut 5 opeacuterations
Un constructeur par copie
Un opeacuterateur de copie
Un constructeur de move
Un opeacuterateur de move
Un destructeur
Attention aux impleacutementations par deacutefaut
Une classe C++11 type
Indiquer explicitement un opeacuterateur de copie par deacutefault
class Y
Yamp operator=(const Yamp) = default default copy semantics
Y(const Yamp) = default
Indiquer lrsquointerdiction de la copieclass X
Xamp operator=(const Xamp) = delete Disallow copying
X(const Xamp) = delete
=default et =delete
vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )
arrayltstring50gt a
Conteneurs STL
mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
unordered_mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
unordered_multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
container par deacutefaut vector
compact efficace cache preacutefetch
dictionary map (arbre) ou unordered_map (hash)
vecteur de taillle fixe array
compact efficace cache preacutefetch
vectorltintgt vfor (auto i = vbegin() i = vend() ++i)
i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)
i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip
cbegin() cend() crbegin() crend()
Parcours simples
Exemple for_each = le plus simple
Parcours avec transformations
Exemple copy = copie tous les eacuteleacutements reacutepondant agrave
une condition
Tris
Exemples sort stable_sort lower_bound
Algorithmes trois cateacutegories
All of
Any of
None of
For each
Find
Find end
Find first
Adjacent Find
Count
Mismatch
Equal
Is permutation
Search
Parcours simples
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
C++ refreshed
Soit un point A
Soit un ensemble de polygones
Trouver le premier polygone qui contient A
NB ce nrsquoest pas un problegraveme de matheacutematiques
mais une petite illustration de lrsquoeacutevolution du C++
Illustration
C++ laquo classique raquo C
11
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = begbreak
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) delete begreturn ret
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
Plus grosse laquo difficulteacute du C++ raquo la gestion de meacutemoire
difficile drsquoeacuteviter les fuites les doubles libeacuterations lrsquoutilisation de zones deacutejagrave libeacutereacutees
Il nrsquoy a pas de maniegravere unique drsquoallouer la meacutemoire en C++
Mais il y a un meacutecanisme de libeacuteration deacuteterministe
Gestion de la meacutemoire
Gestion automatique du cyle de vie lieacute agrave lrsquoobjet contenant
Cycle de vie aussureacute par le scope avec creacuteation du membre gadget wg
Destruction automatique et de-
allocation de w et wg
class widget
privategadget g
publicvoid draw()
void f() widget w
wdraw()
Principe RAII = Resource Acquisition Is Initialisation
Applicable agrave toutes les ressources laquo preacutecieuses
Meacutemoire
fichiers sockets handles Windows
Destruction deacuteterministe (ie pas besoin de laquo using raquo)
Libeacuteration deacuteterministe
ldquoC++ is the best language for garbage collection principally because it creates less garbagerdquo
Bjarne Stroustrup
Un template C++ disponible dans ltmemorygt
shared_ptrltPolygongt sp(new Polygon())sp-gtDraw(hellip)return sp
Baseacute sur le comptage de reacutefeacuterences
Gain de productiviteacute amp robustesse importants avec impact minimal sur les perfs
Compatible avec les conteneurs STL
Compatible avec le polymorphisme
shared_ptrltDerivedgt est convertible en shared_ptrltBasegt Ne casse pas le meacutecanisme de comptage des reacutefeacuterences
Libeacuteration particuliegravere
shared_ptrltintgt sp((int)CoTaskMemAlloc(sizeof(int))CoTaskMemFree)
Caracteacuteristiques de
shared_ptrltTgt
Possibiliteacute drsquoinstancier shared_ptrltTgt sans modifier T
La gestion des reacutefeacuterences (usesweaks) est dans le
shared_ptr
Fonctionne avec les types preacutedeacutefinis shared_ptrltintgt
Srsquoincorpore dans le code sans modifier les types existants
Un mecircme type peut ecirctre manipuleacute parfois via un
shared_ptr et drsquoautres fois via drsquoautres meacutecanismes
shared_ptr est Non-Intrusif
VS 2008 SP1 (VC9 SP1)
shared_ptrltTgt sp(new T(args))shared_ptrltTgt sp(new T(args) del alloc)
VS 2010 (VC10)
shared_ptrltTgt sp = make_sharedltTgt(args)voire auto sp = make_sharedltTgt(args)
shared_ptrltTgt sp = allocate_sharedltTgt(alloc args)
voire auto sp = allocate_sharedltTgt(alloc args)
Simple et eacutelegant
Eacutecrire le type T une seule fois
Performant
Une seule allocation pour lrsquoobjet et le bloc de comptage
make_sharedltTgt()
Patterns parent enfants observer
Solution weak_ptrltTgt lock() expired()
lock transformation en shared_ptr
expired tester si la ressource est disponible
Casser les cycles avec weak_ptrltTgt
static void do_lock (const char title weak_ptrltresourcegt wp)
shared_ptrltresourcegt sp = wplock()show(title sp)
int main()
demonstrate member function lockshared_ptrltresourcegt sp0(new resource)weak_ptrltresourcegt wp0(sp0)do_lock(weak_ptr with resource wp0)sp0reset()do_lock(expired weak_ptr wp0)return 0
int main()
demonstrate member function expiredcout ltlt boolalphashared_ptrltresourcegt sp(new resource)weak_ptrltresourcegt wp(sp)cout ltlt points to resource ltlt wpexpired () ltlt nspreset ()cout ltlt expired ltlt wpexpired() ltlt nreturn 0
Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))
Remplace auto_ptr qui est obsolegravete
Compatible avec les collections STL (containers)
Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))
unique_ptrltTgt
Effective C++ Third Edition (2005) by Scott Meyers
shared_ptr may be the most widely useful component in TR1
C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu
Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr
Paroles drsquoexperts
delete
C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = begbreak
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) delete begreturn ret
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
nullptr exprime un pointeur nul
Ce nrsquoest pas un int
class Foo
public
Foo(const char s)
Foo(int n)
hellip
Foo f(NULL)
Foo f(nullptr)
nullptr
NULL
Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =
polysbegin()
long et fastidieux agrave eacutecrire
Maintenant avec laquo auto raquo
auto beg = polysbegin()
Type deacuteduit par le compilateur
Equivalent de laquo var raquo en C
auto
auto utilise les regravegles de deacutetection drsquoarguments des
templates
const auto p = foo et const autoamp r = bar compilent
auto
Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute
Permet drsquoeacuteviter les erreurs de types troncations hellip
Fonctionne tregraves bien avec les types comme les
lambdas
auto pourquoi lrsquoutiliser
C++ C
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
RValue = tout ce qui nrsquoest pas LValue
Les reacutefeacuterences de Rvalue permettent deux choses importantes
Deacuteplacement (move semantics) pour la performance
Perfect forwarding pour la geacuteneacutericiteacute
= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)
Ex make_shared
Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre
Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc
Les conteneurs STL sont ldquomove awarerdquo
Move Semantics Perfect
Forwarding
class my_class BigHugeData data
publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr
hellip
Meacutecanique du Move Value Types
my_class f()my_class tmphellipreturn tmp
void main()my_class c = f()
Appel du Move Constructor
C++ C
29
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()
beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
une classe possegravede par deacutefaut 5 opeacuterations
Un constructeur par copie
Un opeacuterateur de copie
Un constructeur de move
Un opeacuterateur de move
Un destructeur
Attention aux impleacutementations par deacutefaut
Une classe C++11 type
Indiquer explicitement un opeacuterateur de copie par deacutefault
class Y
Yamp operator=(const Yamp) = default default copy semantics
Y(const Yamp) = default
Indiquer lrsquointerdiction de la copieclass X
Xamp operator=(const Xamp) = delete Disallow copying
X(const Xamp) = delete
=default et =delete
vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )
arrayltstring50gt a
Conteneurs STL
mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
unordered_mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
unordered_multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
container par deacutefaut vector
compact efficace cache preacutefetch
dictionary map (arbre) ou unordered_map (hash)
vecteur de taillle fixe array
compact efficace cache preacutefetch
vectorltintgt vfor (auto i = vbegin() i = vend() ++i)
i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)
i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip
cbegin() cend() crbegin() crend()
Parcours simples
Exemple for_each = le plus simple
Parcours avec transformations
Exemple copy = copie tous les eacuteleacutements reacutepondant agrave
une condition
Tris
Exemples sort stable_sort lower_bound
Algorithmes trois cateacutegories
All of
Any of
None of
For each
Find
Find end
Find first
Adjacent Find
Count
Mismatch
Equal
Is permutation
Search
Parcours simples
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
Soit un point A
Soit un ensemble de polygones
Trouver le premier polygone qui contient A
NB ce nrsquoest pas un problegraveme de matheacutematiques
mais une petite illustration de lrsquoeacutevolution du C++
Illustration
C++ laquo classique raquo C
11
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = begbreak
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) delete begreturn ret
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
Plus grosse laquo difficulteacute du C++ raquo la gestion de meacutemoire
difficile drsquoeacuteviter les fuites les doubles libeacuterations lrsquoutilisation de zones deacutejagrave libeacutereacutees
Il nrsquoy a pas de maniegravere unique drsquoallouer la meacutemoire en C++
Mais il y a un meacutecanisme de libeacuteration deacuteterministe
Gestion de la meacutemoire
Gestion automatique du cyle de vie lieacute agrave lrsquoobjet contenant
Cycle de vie aussureacute par le scope avec creacuteation du membre gadget wg
Destruction automatique et de-
allocation de w et wg
class widget
privategadget g
publicvoid draw()
void f() widget w
wdraw()
Principe RAII = Resource Acquisition Is Initialisation
Applicable agrave toutes les ressources laquo preacutecieuses
Meacutemoire
fichiers sockets handles Windows
Destruction deacuteterministe (ie pas besoin de laquo using raquo)
Libeacuteration deacuteterministe
ldquoC++ is the best language for garbage collection principally because it creates less garbagerdquo
Bjarne Stroustrup
Un template C++ disponible dans ltmemorygt
shared_ptrltPolygongt sp(new Polygon())sp-gtDraw(hellip)return sp
Baseacute sur le comptage de reacutefeacuterences
Gain de productiviteacute amp robustesse importants avec impact minimal sur les perfs
Compatible avec les conteneurs STL
Compatible avec le polymorphisme
shared_ptrltDerivedgt est convertible en shared_ptrltBasegt Ne casse pas le meacutecanisme de comptage des reacutefeacuterences
Libeacuteration particuliegravere
shared_ptrltintgt sp((int)CoTaskMemAlloc(sizeof(int))CoTaskMemFree)
Caracteacuteristiques de
shared_ptrltTgt
Possibiliteacute drsquoinstancier shared_ptrltTgt sans modifier T
La gestion des reacutefeacuterences (usesweaks) est dans le
shared_ptr
Fonctionne avec les types preacutedeacutefinis shared_ptrltintgt
Srsquoincorpore dans le code sans modifier les types existants
Un mecircme type peut ecirctre manipuleacute parfois via un
shared_ptr et drsquoautres fois via drsquoautres meacutecanismes
shared_ptr est Non-Intrusif
VS 2008 SP1 (VC9 SP1)
shared_ptrltTgt sp(new T(args))shared_ptrltTgt sp(new T(args) del alloc)
VS 2010 (VC10)
shared_ptrltTgt sp = make_sharedltTgt(args)voire auto sp = make_sharedltTgt(args)
shared_ptrltTgt sp = allocate_sharedltTgt(alloc args)
voire auto sp = allocate_sharedltTgt(alloc args)
Simple et eacutelegant
Eacutecrire le type T une seule fois
Performant
Une seule allocation pour lrsquoobjet et le bloc de comptage
make_sharedltTgt()
Patterns parent enfants observer
Solution weak_ptrltTgt lock() expired()
lock transformation en shared_ptr
expired tester si la ressource est disponible
Casser les cycles avec weak_ptrltTgt
static void do_lock (const char title weak_ptrltresourcegt wp)
shared_ptrltresourcegt sp = wplock()show(title sp)
int main()
demonstrate member function lockshared_ptrltresourcegt sp0(new resource)weak_ptrltresourcegt wp0(sp0)do_lock(weak_ptr with resource wp0)sp0reset()do_lock(expired weak_ptr wp0)return 0
int main()
demonstrate member function expiredcout ltlt boolalphashared_ptrltresourcegt sp(new resource)weak_ptrltresourcegt wp(sp)cout ltlt points to resource ltlt wpexpired () ltlt nspreset ()cout ltlt expired ltlt wpexpired() ltlt nreturn 0
Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))
Remplace auto_ptr qui est obsolegravete
Compatible avec les collections STL (containers)
Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))
unique_ptrltTgt
Effective C++ Third Edition (2005) by Scott Meyers
shared_ptr may be the most widely useful component in TR1
C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu
Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr
Paroles drsquoexperts
delete
C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = begbreak
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) delete begreturn ret
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
nullptr exprime un pointeur nul
Ce nrsquoest pas un int
class Foo
public
Foo(const char s)
Foo(int n)
hellip
Foo f(NULL)
Foo f(nullptr)
nullptr
NULL
Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =
polysbegin()
long et fastidieux agrave eacutecrire
Maintenant avec laquo auto raquo
auto beg = polysbegin()
Type deacuteduit par le compilateur
Equivalent de laquo var raquo en C
auto
auto utilise les regravegles de deacutetection drsquoarguments des
templates
const auto p = foo et const autoamp r = bar compilent
auto
Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute
Permet drsquoeacuteviter les erreurs de types troncations hellip
Fonctionne tregraves bien avec les types comme les
lambdas
auto pourquoi lrsquoutiliser
C++ C
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
RValue = tout ce qui nrsquoest pas LValue
Les reacutefeacuterences de Rvalue permettent deux choses importantes
Deacuteplacement (move semantics) pour la performance
Perfect forwarding pour la geacuteneacutericiteacute
= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)
Ex make_shared
Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre
Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc
Les conteneurs STL sont ldquomove awarerdquo
Move Semantics Perfect
Forwarding
class my_class BigHugeData data
publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr
hellip
Meacutecanique du Move Value Types
my_class f()my_class tmphellipreturn tmp
void main()my_class c = f()
Appel du Move Constructor
C++ C
29
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()
beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
une classe possegravede par deacutefaut 5 opeacuterations
Un constructeur par copie
Un opeacuterateur de copie
Un constructeur de move
Un opeacuterateur de move
Un destructeur
Attention aux impleacutementations par deacutefaut
Une classe C++11 type
Indiquer explicitement un opeacuterateur de copie par deacutefault
class Y
Yamp operator=(const Yamp) = default default copy semantics
Y(const Yamp) = default
Indiquer lrsquointerdiction de la copieclass X
Xamp operator=(const Xamp) = delete Disallow copying
X(const Xamp) = delete
=default et =delete
vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )
arrayltstring50gt a
Conteneurs STL
mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
unordered_mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
unordered_multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
container par deacutefaut vector
compact efficace cache preacutefetch
dictionary map (arbre) ou unordered_map (hash)
vecteur de taillle fixe array
compact efficace cache preacutefetch
vectorltintgt vfor (auto i = vbegin() i = vend() ++i)
i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)
i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip
cbegin() cend() crbegin() crend()
Parcours simples
Exemple for_each = le plus simple
Parcours avec transformations
Exemple copy = copie tous les eacuteleacutements reacutepondant agrave
une condition
Tris
Exemples sort stable_sort lower_bound
Algorithmes trois cateacutegories
All of
Any of
None of
For each
Find
Find end
Find first
Adjacent Find
Count
Mismatch
Equal
Is permutation
Search
Parcours simples
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
C++ laquo classique raquo C
11
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = begbreak
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) delete begreturn ret
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
Plus grosse laquo difficulteacute du C++ raquo la gestion de meacutemoire
difficile drsquoeacuteviter les fuites les doubles libeacuterations lrsquoutilisation de zones deacutejagrave libeacutereacutees
Il nrsquoy a pas de maniegravere unique drsquoallouer la meacutemoire en C++
Mais il y a un meacutecanisme de libeacuteration deacuteterministe
Gestion de la meacutemoire
Gestion automatique du cyle de vie lieacute agrave lrsquoobjet contenant
Cycle de vie aussureacute par le scope avec creacuteation du membre gadget wg
Destruction automatique et de-
allocation de w et wg
class widget
privategadget g
publicvoid draw()
void f() widget w
wdraw()
Principe RAII = Resource Acquisition Is Initialisation
Applicable agrave toutes les ressources laquo preacutecieuses
Meacutemoire
fichiers sockets handles Windows
Destruction deacuteterministe (ie pas besoin de laquo using raquo)
Libeacuteration deacuteterministe
ldquoC++ is the best language for garbage collection principally because it creates less garbagerdquo
Bjarne Stroustrup
Un template C++ disponible dans ltmemorygt
shared_ptrltPolygongt sp(new Polygon())sp-gtDraw(hellip)return sp
Baseacute sur le comptage de reacutefeacuterences
Gain de productiviteacute amp robustesse importants avec impact minimal sur les perfs
Compatible avec les conteneurs STL
Compatible avec le polymorphisme
shared_ptrltDerivedgt est convertible en shared_ptrltBasegt Ne casse pas le meacutecanisme de comptage des reacutefeacuterences
Libeacuteration particuliegravere
shared_ptrltintgt sp((int)CoTaskMemAlloc(sizeof(int))CoTaskMemFree)
Caracteacuteristiques de
shared_ptrltTgt
Possibiliteacute drsquoinstancier shared_ptrltTgt sans modifier T
La gestion des reacutefeacuterences (usesweaks) est dans le
shared_ptr
Fonctionne avec les types preacutedeacutefinis shared_ptrltintgt
Srsquoincorpore dans le code sans modifier les types existants
Un mecircme type peut ecirctre manipuleacute parfois via un
shared_ptr et drsquoautres fois via drsquoautres meacutecanismes
shared_ptr est Non-Intrusif
VS 2008 SP1 (VC9 SP1)
shared_ptrltTgt sp(new T(args))shared_ptrltTgt sp(new T(args) del alloc)
VS 2010 (VC10)
shared_ptrltTgt sp = make_sharedltTgt(args)voire auto sp = make_sharedltTgt(args)
shared_ptrltTgt sp = allocate_sharedltTgt(alloc args)
voire auto sp = allocate_sharedltTgt(alloc args)
Simple et eacutelegant
Eacutecrire le type T une seule fois
Performant
Une seule allocation pour lrsquoobjet et le bloc de comptage
make_sharedltTgt()
Patterns parent enfants observer
Solution weak_ptrltTgt lock() expired()
lock transformation en shared_ptr
expired tester si la ressource est disponible
Casser les cycles avec weak_ptrltTgt
static void do_lock (const char title weak_ptrltresourcegt wp)
shared_ptrltresourcegt sp = wplock()show(title sp)
int main()
demonstrate member function lockshared_ptrltresourcegt sp0(new resource)weak_ptrltresourcegt wp0(sp0)do_lock(weak_ptr with resource wp0)sp0reset()do_lock(expired weak_ptr wp0)return 0
int main()
demonstrate member function expiredcout ltlt boolalphashared_ptrltresourcegt sp(new resource)weak_ptrltresourcegt wp(sp)cout ltlt points to resource ltlt wpexpired () ltlt nspreset ()cout ltlt expired ltlt wpexpired() ltlt nreturn 0
Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))
Remplace auto_ptr qui est obsolegravete
Compatible avec les collections STL (containers)
Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))
unique_ptrltTgt
Effective C++ Third Edition (2005) by Scott Meyers
shared_ptr may be the most widely useful component in TR1
C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu
Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr
Paroles drsquoexperts
delete
C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = begbreak
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) delete begreturn ret
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
nullptr exprime un pointeur nul
Ce nrsquoest pas un int
class Foo
public
Foo(const char s)
Foo(int n)
hellip
Foo f(NULL)
Foo f(nullptr)
nullptr
NULL
Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =
polysbegin()
long et fastidieux agrave eacutecrire
Maintenant avec laquo auto raquo
auto beg = polysbegin()
Type deacuteduit par le compilateur
Equivalent de laquo var raquo en C
auto
auto utilise les regravegles de deacutetection drsquoarguments des
templates
const auto p = foo et const autoamp r = bar compilent
auto
Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute
Permet drsquoeacuteviter les erreurs de types troncations hellip
Fonctionne tregraves bien avec les types comme les
lambdas
auto pourquoi lrsquoutiliser
C++ C
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
RValue = tout ce qui nrsquoest pas LValue
Les reacutefeacuterences de Rvalue permettent deux choses importantes
Deacuteplacement (move semantics) pour la performance
Perfect forwarding pour la geacuteneacutericiteacute
= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)
Ex make_shared
Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre
Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc
Les conteneurs STL sont ldquomove awarerdquo
Move Semantics Perfect
Forwarding
class my_class BigHugeData data
publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr
hellip
Meacutecanique du Move Value Types
my_class f()my_class tmphellipreturn tmp
void main()my_class c = f()
Appel du Move Constructor
C++ C
29
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()
beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
une classe possegravede par deacutefaut 5 opeacuterations
Un constructeur par copie
Un opeacuterateur de copie
Un constructeur de move
Un opeacuterateur de move
Un destructeur
Attention aux impleacutementations par deacutefaut
Une classe C++11 type
Indiquer explicitement un opeacuterateur de copie par deacutefault
class Y
Yamp operator=(const Yamp) = default default copy semantics
Y(const Yamp) = default
Indiquer lrsquointerdiction de la copieclass X
Xamp operator=(const Xamp) = delete Disallow copying
X(const Xamp) = delete
=default et =delete
vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )
arrayltstring50gt a
Conteneurs STL
mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
unordered_mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
unordered_multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
container par deacutefaut vector
compact efficace cache preacutefetch
dictionary map (arbre) ou unordered_map (hash)
vecteur de taillle fixe array
compact efficace cache preacutefetch
vectorltintgt vfor (auto i = vbegin() i = vend() ++i)
i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)
i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip
cbegin() cend() crbegin() crend()
Parcours simples
Exemple for_each = le plus simple
Parcours avec transformations
Exemple copy = copie tous les eacuteleacutements reacutepondant agrave
une condition
Tris
Exemples sort stable_sort lower_bound
Algorithmes trois cateacutegories
All of
Any of
None of
For each
Find
Find end
Find first
Adjacent Find
Count
Mismatch
Equal
Is permutation
Search
Parcours simples
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
Plus grosse laquo difficulteacute du C++ raquo la gestion de meacutemoire
difficile drsquoeacuteviter les fuites les doubles libeacuterations lrsquoutilisation de zones deacutejagrave libeacutereacutees
Il nrsquoy a pas de maniegravere unique drsquoallouer la meacutemoire en C++
Mais il y a un meacutecanisme de libeacuteration deacuteterministe
Gestion de la meacutemoire
Gestion automatique du cyle de vie lieacute agrave lrsquoobjet contenant
Cycle de vie aussureacute par le scope avec creacuteation du membre gadget wg
Destruction automatique et de-
allocation de w et wg
class widget
privategadget g
publicvoid draw()
void f() widget w
wdraw()
Principe RAII = Resource Acquisition Is Initialisation
Applicable agrave toutes les ressources laquo preacutecieuses
Meacutemoire
fichiers sockets handles Windows
Destruction deacuteterministe (ie pas besoin de laquo using raquo)
Libeacuteration deacuteterministe
ldquoC++ is the best language for garbage collection principally because it creates less garbagerdquo
Bjarne Stroustrup
Un template C++ disponible dans ltmemorygt
shared_ptrltPolygongt sp(new Polygon())sp-gtDraw(hellip)return sp
Baseacute sur le comptage de reacutefeacuterences
Gain de productiviteacute amp robustesse importants avec impact minimal sur les perfs
Compatible avec les conteneurs STL
Compatible avec le polymorphisme
shared_ptrltDerivedgt est convertible en shared_ptrltBasegt Ne casse pas le meacutecanisme de comptage des reacutefeacuterences
Libeacuteration particuliegravere
shared_ptrltintgt sp((int)CoTaskMemAlloc(sizeof(int))CoTaskMemFree)
Caracteacuteristiques de
shared_ptrltTgt
Possibiliteacute drsquoinstancier shared_ptrltTgt sans modifier T
La gestion des reacutefeacuterences (usesweaks) est dans le
shared_ptr
Fonctionne avec les types preacutedeacutefinis shared_ptrltintgt
Srsquoincorpore dans le code sans modifier les types existants
Un mecircme type peut ecirctre manipuleacute parfois via un
shared_ptr et drsquoautres fois via drsquoautres meacutecanismes
shared_ptr est Non-Intrusif
VS 2008 SP1 (VC9 SP1)
shared_ptrltTgt sp(new T(args))shared_ptrltTgt sp(new T(args) del alloc)
VS 2010 (VC10)
shared_ptrltTgt sp = make_sharedltTgt(args)voire auto sp = make_sharedltTgt(args)
shared_ptrltTgt sp = allocate_sharedltTgt(alloc args)
voire auto sp = allocate_sharedltTgt(alloc args)
Simple et eacutelegant
Eacutecrire le type T une seule fois
Performant
Une seule allocation pour lrsquoobjet et le bloc de comptage
make_sharedltTgt()
Patterns parent enfants observer
Solution weak_ptrltTgt lock() expired()
lock transformation en shared_ptr
expired tester si la ressource est disponible
Casser les cycles avec weak_ptrltTgt
static void do_lock (const char title weak_ptrltresourcegt wp)
shared_ptrltresourcegt sp = wplock()show(title sp)
int main()
demonstrate member function lockshared_ptrltresourcegt sp0(new resource)weak_ptrltresourcegt wp0(sp0)do_lock(weak_ptr with resource wp0)sp0reset()do_lock(expired weak_ptr wp0)return 0
int main()
demonstrate member function expiredcout ltlt boolalphashared_ptrltresourcegt sp(new resource)weak_ptrltresourcegt wp(sp)cout ltlt points to resource ltlt wpexpired () ltlt nspreset ()cout ltlt expired ltlt wpexpired() ltlt nreturn 0
Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))
Remplace auto_ptr qui est obsolegravete
Compatible avec les collections STL (containers)
Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))
unique_ptrltTgt
Effective C++ Third Edition (2005) by Scott Meyers
shared_ptr may be the most widely useful component in TR1
C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu
Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr
Paroles drsquoexperts
delete
C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = begbreak
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) delete begreturn ret
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
nullptr exprime un pointeur nul
Ce nrsquoest pas un int
class Foo
public
Foo(const char s)
Foo(int n)
hellip
Foo f(NULL)
Foo f(nullptr)
nullptr
NULL
Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =
polysbegin()
long et fastidieux agrave eacutecrire
Maintenant avec laquo auto raquo
auto beg = polysbegin()
Type deacuteduit par le compilateur
Equivalent de laquo var raquo en C
auto
auto utilise les regravegles de deacutetection drsquoarguments des
templates
const auto p = foo et const autoamp r = bar compilent
auto
Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute
Permet drsquoeacuteviter les erreurs de types troncations hellip
Fonctionne tregraves bien avec les types comme les
lambdas
auto pourquoi lrsquoutiliser
C++ C
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
RValue = tout ce qui nrsquoest pas LValue
Les reacutefeacuterences de Rvalue permettent deux choses importantes
Deacuteplacement (move semantics) pour la performance
Perfect forwarding pour la geacuteneacutericiteacute
= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)
Ex make_shared
Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre
Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc
Les conteneurs STL sont ldquomove awarerdquo
Move Semantics Perfect
Forwarding
class my_class BigHugeData data
publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr
hellip
Meacutecanique du Move Value Types
my_class f()my_class tmphellipreturn tmp
void main()my_class c = f()
Appel du Move Constructor
C++ C
29
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()
beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
une classe possegravede par deacutefaut 5 opeacuterations
Un constructeur par copie
Un opeacuterateur de copie
Un constructeur de move
Un opeacuterateur de move
Un destructeur
Attention aux impleacutementations par deacutefaut
Une classe C++11 type
Indiquer explicitement un opeacuterateur de copie par deacutefault
class Y
Yamp operator=(const Yamp) = default default copy semantics
Y(const Yamp) = default
Indiquer lrsquointerdiction de la copieclass X
Xamp operator=(const Xamp) = delete Disallow copying
X(const Xamp) = delete
=default et =delete
vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )
arrayltstring50gt a
Conteneurs STL
mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
unordered_mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
unordered_multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
container par deacutefaut vector
compact efficace cache preacutefetch
dictionary map (arbre) ou unordered_map (hash)
vecteur de taillle fixe array
compact efficace cache preacutefetch
vectorltintgt vfor (auto i = vbegin() i = vend() ++i)
i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)
i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip
cbegin() cend() crbegin() crend()
Parcours simples
Exemple for_each = le plus simple
Parcours avec transformations
Exemple copy = copie tous les eacuteleacutements reacutepondant agrave
une condition
Tris
Exemples sort stable_sort lower_bound
Algorithmes trois cateacutegories
All of
Any of
None of
For each
Find
Find end
Find first
Adjacent Find
Count
Mismatch
Equal
Is permutation
Search
Parcours simples
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
Principe RAII = Resource Acquisition Is Initialisation
Applicable agrave toutes les ressources laquo preacutecieuses
Meacutemoire
fichiers sockets handles Windows
Destruction deacuteterministe (ie pas besoin de laquo using raquo)
Libeacuteration deacuteterministe
ldquoC++ is the best language for garbage collection principally because it creates less garbagerdquo
Bjarne Stroustrup
Un template C++ disponible dans ltmemorygt
shared_ptrltPolygongt sp(new Polygon())sp-gtDraw(hellip)return sp
Baseacute sur le comptage de reacutefeacuterences
Gain de productiviteacute amp robustesse importants avec impact minimal sur les perfs
Compatible avec les conteneurs STL
Compatible avec le polymorphisme
shared_ptrltDerivedgt est convertible en shared_ptrltBasegt Ne casse pas le meacutecanisme de comptage des reacutefeacuterences
Libeacuteration particuliegravere
shared_ptrltintgt sp((int)CoTaskMemAlloc(sizeof(int))CoTaskMemFree)
Caracteacuteristiques de
shared_ptrltTgt
Possibiliteacute drsquoinstancier shared_ptrltTgt sans modifier T
La gestion des reacutefeacuterences (usesweaks) est dans le
shared_ptr
Fonctionne avec les types preacutedeacutefinis shared_ptrltintgt
Srsquoincorpore dans le code sans modifier les types existants
Un mecircme type peut ecirctre manipuleacute parfois via un
shared_ptr et drsquoautres fois via drsquoautres meacutecanismes
shared_ptr est Non-Intrusif
VS 2008 SP1 (VC9 SP1)
shared_ptrltTgt sp(new T(args))shared_ptrltTgt sp(new T(args) del alloc)
VS 2010 (VC10)
shared_ptrltTgt sp = make_sharedltTgt(args)voire auto sp = make_sharedltTgt(args)
shared_ptrltTgt sp = allocate_sharedltTgt(alloc args)
voire auto sp = allocate_sharedltTgt(alloc args)
Simple et eacutelegant
Eacutecrire le type T une seule fois
Performant
Une seule allocation pour lrsquoobjet et le bloc de comptage
make_sharedltTgt()
Patterns parent enfants observer
Solution weak_ptrltTgt lock() expired()
lock transformation en shared_ptr
expired tester si la ressource est disponible
Casser les cycles avec weak_ptrltTgt
static void do_lock (const char title weak_ptrltresourcegt wp)
shared_ptrltresourcegt sp = wplock()show(title sp)
int main()
demonstrate member function lockshared_ptrltresourcegt sp0(new resource)weak_ptrltresourcegt wp0(sp0)do_lock(weak_ptr with resource wp0)sp0reset()do_lock(expired weak_ptr wp0)return 0
int main()
demonstrate member function expiredcout ltlt boolalphashared_ptrltresourcegt sp(new resource)weak_ptrltresourcegt wp(sp)cout ltlt points to resource ltlt wpexpired () ltlt nspreset ()cout ltlt expired ltlt wpexpired() ltlt nreturn 0
Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))
Remplace auto_ptr qui est obsolegravete
Compatible avec les collections STL (containers)
Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))
unique_ptrltTgt
Effective C++ Third Edition (2005) by Scott Meyers
shared_ptr may be the most widely useful component in TR1
C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu
Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr
Paroles drsquoexperts
delete
C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = begbreak
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) delete begreturn ret
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
nullptr exprime un pointeur nul
Ce nrsquoest pas un int
class Foo
public
Foo(const char s)
Foo(int n)
hellip
Foo f(NULL)
Foo f(nullptr)
nullptr
NULL
Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =
polysbegin()
long et fastidieux agrave eacutecrire
Maintenant avec laquo auto raquo
auto beg = polysbegin()
Type deacuteduit par le compilateur
Equivalent de laquo var raquo en C
auto
auto utilise les regravegles de deacutetection drsquoarguments des
templates
const auto p = foo et const autoamp r = bar compilent
auto
Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute
Permet drsquoeacuteviter les erreurs de types troncations hellip
Fonctionne tregraves bien avec les types comme les
lambdas
auto pourquoi lrsquoutiliser
C++ C
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
RValue = tout ce qui nrsquoest pas LValue
Les reacutefeacuterences de Rvalue permettent deux choses importantes
Deacuteplacement (move semantics) pour la performance
Perfect forwarding pour la geacuteneacutericiteacute
= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)
Ex make_shared
Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre
Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc
Les conteneurs STL sont ldquomove awarerdquo
Move Semantics Perfect
Forwarding
class my_class BigHugeData data
publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr
hellip
Meacutecanique du Move Value Types
my_class f()my_class tmphellipreturn tmp
void main()my_class c = f()
Appel du Move Constructor
C++ C
29
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()
beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
une classe possegravede par deacutefaut 5 opeacuterations
Un constructeur par copie
Un opeacuterateur de copie
Un constructeur de move
Un opeacuterateur de move
Un destructeur
Attention aux impleacutementations par deacutefaut
Une classe C++11 type
Indiquer explicitement un opeacuterateur de copie par deacutefault
class Y
Yamp operator=(const Yamp) = default default copy semantics
Y(const Yamp) = default
Indiquer lrsquointerdiction de la copieclass X
Xamp operator=(const Xamp) = delete Disallow copying
X(const Xamp) = delete
=default et =delete
vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )
arrayltstring50gt a
Conteneurs STL
mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
unordered_mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
unordered_multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
container par deacutefaut vector
compact efficace cache preacutefetch
dictionary map (arbre) ou unordered_map (hash)
vecteur de taillle fixe array
compact efficace cache preacutefetch
vectorltintgt vfor (auto i = vbegin() i = vend() ++i)
i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)
i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip
cbegin() cend() crbegin() crend()
Parcours simples
Exemple for_each = le plus simple
Parcours avec transformations
Exemple copy = copie tous les eacuteleacutements reacutepondant agrave
une condition
Tris
Exemples sort stable_sort lower_bound
Algorithmes trois cateacutegories
All of
Any of
None of
For each
Find
Find end
Find first
Adjacent Find
Count
Mismatch
Equal
Is permutation
Search
Parcours simples
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
Un template C++ disponible dans ltmemorygt
shared_ptrltPolygongt sp(new Polygon())sp-gtDraw(hellip)return sp
Baseacute sur le comptage de reacutefeacuterences
Gain de productiviteacute amp robustesse importants avec impact minimal sur les perfs
Compatible avec les conteneurs STL
Compatible avec le polymorphisme
shared_ptrltDerivedgt est convertible en shared_ptrltBasegt Ne casse pas le meacutecanisme de comptage des reacutefeacuterences
Libeacuteration particuliegravere
shared_ptrltintgt sp((int)CoTaskMemAlloc(sizeof(int))CoTaskMemFree)
Caracteacuteristiques de
shared_ptrltTgt
Possibiliteacute drsquoinstancier shared_ptrltTgt sans modifier T
La gestion des reacutefeacuterences (usesweaks) est dans le
shared_ptr
Fonctionne avec les types preacutedeacutefinis shared_ptrltintgt
Srsquoincorpore dans le code sans modifier les types existants
Un mecircme type peut ecirctre manipuleacute parfois via un
shared_ptr et drsquoautres fois via drsquoautres meacutecanismes
shared_ptr est Non-Intrusif
VS 2008 SP1 (VC9 SP1)
shared_ptrltTgt sp(new T(args))shared_ptrltTgt sp(new T(args) del alloc)
VS 2010 (VC10)
shared_ptrltTgt sp = make_sharedltTgt(args)voire auto sp = make_sharedltTgt(args)
shared_ptrltTgt sp = allocate_sharedltTgt(alloc args)
voire auto sp = allocate_sharedltTgt(alloc args)
Simple et eacutelegant
Eacutecrire le type T une seule fois
Performant
Une seule allocation pour lrsquoobjet et le bloc de comptage
make_sharedltTgt()
Patterns parent enfants observer
Solution weak_ptrltTgt lock() expired()
lock transformation en shared_ptr
expired tester si la ressource est disponible
Casser les cycles avec weak_ptrltTgt
static void do_lock (const char title weak_ptrltresourcegt wp)
shared_ptrltresourcegt sp = wplock()show(title sp)
int main()
demonstrate member function lockshared_ptrltresourcegt sp0(new resource)weak_ptrltresourcegt wp0(sp0)do_lock(weak_ptr with resource wp0)sp0reset()do_lock(expired weak_ptr wp0)return 0
int main()
demonstrate member function expiredcout ltlt boolalphashared_ptrltresourcegt sp(new resource)weak_ptrltresourcegt wp(sp)cout ltlt points to resource ltlt wpexpired () ltlt nspreset ()cout ltlt expired ltlt wpexpired() ltlt nreturn 0
Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))
Remplace auto_ptr qui est obsolegravete
Compatible avec les collections STL (containers)
Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))
unique_ptrltTgt
Effective C++ Third Edition (2005) by Scott Meyers
shared_ptr may be the most widely useful component in TR1
C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu
Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr
Paroles drsquoexperts
delete
C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = begbreak
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) delete begreturn ret
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
nullptr exprime un pointeur nul
Ce nrsquoest pas un int
class Foo
public
Foo(const char s)
Foo(int n)
hellip
Foo f(NULL)
Foo f(nullptr)
nullptr
NULL
Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =
polysbegin()
long et fastidieux agrave eacutecrire
Maintenant avec laquo auto raquo
auto beg = polysbegin()
Type deacuteduit par le compilateur
Equivalent de laquo var raquo en C
auto
auto utilise les regravegles de deacutetection drsquoarguments des
templates
const auto p = foo et const autoamp r = bar compilent
auto
Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute
Permet drsquoeacuteviter les erreurs de types troncations hellip
Fonctionne tregraves bien avec les types comme les
lambdas
auto pourquoi lrsquoutiliser
C++ C
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
RValue = tout ce qui nrsquoest pas LValue
Les reacutefeacuterences de Rvalue permettent deux choses importantes
Deacuteplacement (move semantics) pour la performance
Perfect forwarding pour la geacuteneacutericiteacute
= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)
Ex make_shared
Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre
Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc
Les conteneurs STL sont ldquomove awarerdquo
Move Semantics Perfect
Forwarding
class my_class BigHugeData data
publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr
hellip
Meacutecanique du Move Value Types
my_class f()my_class tmphellipreturn tmp
void main()my_class c = f()
Appel du Move Constructor
C++ C
29
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()
beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
une classe possegravede par deacutefaut 5 opeacuterations
Un constructeur par copie
Un opeacuterateur de copie
Un constructeur de move
Un opeacuterateur de move
Un destructeur
Attention aux impleacutementations par deacutefaut
Une classe C++11 type
Indiquer explicitement un opeacuterateur de copie par deacutefault
class Y
Yamp operator=(const Yamp) = default default copy semantics
Y(const Yamp) = default
Indiquer lrsquointerdiction de la copieclass X
Xamp operator=(const Xamp) = delete Disallow copying
X(const Xamp) = delete
=default et =delete
vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )
arrayltstring50gt a
Conteneurs STL
mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
unordered_mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
unordered_multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
container par deacutefaut vector
compact efficace cache preacutefetch
dictionary map (arbre) ou unordered_map (hash)
vecteur de taillle fixe array
compact efficace cache preacutefetch
vectorltintgt vfor (auto i = vbegin() i = vend() ++i)
i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)
i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip
cbegin() cend() crbegin() crend()
Parcours simples
Exemple for_each = le plus simple
Parcours avec transformations
Exemple copy = copie tous les eacuteleacutements reacutepondant agrave
une condition
Tris
Exemples sort stable_sort lower_bound
Algorithmes trois cateacutegories
All of
Any of
None of
For each
Find
Find end
Find first
Adjacent Find
Count
Mismatch
Equal
Is permutation
Search
Parcours simples
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
Possibiliteacute drsquoinstancier shared_ptrltTgt sans modifier T
La gestion des reacutefeacuterences (usesweaks) est dans le
shared_ptr
Fonctionne avec les types preacutedeacutefinis shared_ptrltintgt
Srsquoincorpore dans le code sans modifier les types existants
Un mecircme type peut ecirctre manipuleacute parfois via un
shared_ptr et drsquoautres fois via drsquoautres meacutecanismes
shared_ptr est Non-Intrusif
VS 2008 SP1 (VC9 SP1)
shared_ptrltTgt sp(new T(args))shared_ptrltTgt sp(new T(args) del alloc)
VS 2010 (VC10)
shared_ptrltTgt sp = make_sharedltTgt(args)voire auto sp = make_sharedltTgt(args)
shared_ptrltTgt sp = allocate_sharedltTgt(alloc args)
voire auto sp = allocate_sharedltTgt(alloc args)
Simple et eacutelegant
Eacutecrire le type T une seule fois
Performant
Une seule allocation pour lrsquoobjet et le bloc de comptage
make_sharedltTgt()
Patterns parent enfants observer
Solution weak_ptrltTgt lock() expired()
lock transformation en shared_ptr
expired tester si la ressource est disponible
Casser les cycles avec weak_ptrltTgt
static void do_lock (const char title weak_ptrltresourcegt wp)
shared_ptrltresourcegt sp = wplock()show(title sp)
int main()
demonstrate member function lockshared_ptrltresourcegt sp0(new resource)weak_ptrltresourcegt wp0(sp0)do_lock(weak_ptr with resource wp0)sp0reset()do_lock(expired weak_ptr wp0)return 0
int main()
demonstrate member function expiredcout ltlt boolalphashared_ptrltresourcegt sp(new resource)weak_ptrltresourcegt wp(sp)cout ltlt points to resource ltlt wpexpired () ltlt nspreset ()cout ltlt expired ltlt wpexpired() ltlt nreturn 0
Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))
Remplace auto_ptr qui est obsolegravete
Compatible avec les collections STL (containers)
Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))
unique_ptrltTgt
Effective C++ Third Edition (2005) by Scott Meyers
shared_ptr may be the most widely useful component in TR1
C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu
Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr
Paroles drsquoexperts
delete
C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = begbreak
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) delete begreturn ret
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
nullptr exprime un pointeur nul
Ce nrsquoest pas un int
class Foo
public
Foo(const char s)
Foo(int n)
hellip
Foo f(NULL)
Foo f(nullptr)
nullptr
NULL
Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =
polysbegin()
long et fastidieux agrave eacutecrire
Maintenant avec laquo auto raquo
auto beg = polysbegin()
Type deacuteduit par le compilateur
Equivalent de laquo var raquo en C
auto
auto utilise les regravegles de deacutetection drsquoarguments des
templates
const auto p = foo et const autoamp r = bar compilent
auto
Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute
Permet drsquoeacuteviter les erreurs de types troncations hellip
Fonctionne tregraves bien avec les types comme les
lambdas
auto pourquoi lrsquoutiliser
C++ C
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
RValue = tout ce qui nrsquoest pas LValue
Les reacutefeacuterences de Rvalue permettent deux choses importantes
Deacuteplacement (move semantics) pour la performance
Perfect forwarding pour la geacuteneacutericiteacute
= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)
Ex make_shared
Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre
Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc
Les conteneurs STL sont ldquomove awarerdquo
Move Semantics Perfect
Forwarding
class my_class BigHugeData data
publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr
hellip
Meacutecanique du Move Value Types
my_class f()my_class tmphellipreturn tmp
void main()my_class c = f()
Appel du Move Constructor
C++ C
29
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()
beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
une classe possegravede par deacutefaut 5 opeacuterations
Un constructeur par copie
Un opeacuterateur de copie
Un constructeur de move
Un opeacuterateur de move
Un destructeur
Attention aux impleacutementations par deacutefaut
Une classe C++11 type
Indiquer explicitement un opeacuterateur de copie par deacutefault
class Y
Yamp operator=(const Yamp) = default default copy semantics
Y(const Yamp) = default
Indiquer lrsquointerdiction de la copieclass X
Xamp operator=(const Xamp) = delete Disallow copying
X(const Xamp) = delete
=default et =delete
vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )
arrayltstring50gt a
Conteneurs STL
mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
unordered_mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
unordered_multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
container par deacutefaut vector
compact efficace cache preacutefetch
dictionary map (arbre) ou unordered_map (hash)
vecteur de taillle fixe array
compact efficace cache preacutefetch
vectorltintgt vfor (auto i = vbegin() i = vend() ++i)
i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)
i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip
cbegin() cend() crbegin() crend()
Parcours simples
Exemple for_each = le plus simple
Parcours avec transformations
Exemple copy = copie tous les eacuteleacutements reacutepondant agrave
une condition
Tris
Exemples sort stable_sort lower_bound
Algorithmes trois cateacutegories
All of
Any of
None of
For each
Find
Find end
Find first
Adjacent Find
Count
Mismatch
Equal
Is permutation
Search
Parcours simples
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
VS 2008 SP1 (VC9 SP1)
shared_ptrltTgt sp(new T(args))shared_ptrltTgt sp(new T(args) del alloc)
VS 2010 (VC10)
shared_ptrltTgt sp = make_sharedltTgt(args)voire auto sp = make_sharedltTgt(args)
shared_ptrltTgt sp = allocate_sharedltTgt(alloc args)
voire auto sp = allocate_sharedltTgt(alloc args)
Simple et eacutelegant
Eacutecrire le type T une seule fois
Performant
Une seule allocation pour lrsquoobjet et le bloc de comptage
make_sharedltTgt()
Patterns parent enfants observer
Solution weak_ptrltTgt lock() expired()
lock transformation en shared_ptr
expired tester si la ressource est disponible
Casser les cycles avec weak_ptrltTgt
static void do_lock (const char title weak_ptrltresourcegt wp)
shared_ptrltresourcegt sp = wplock()show(title sp)
int main()
demonstrate member function lockshared_ptrltresourcegt sp0(new resource)weak_ptrltresourcegt wp0(sp0)do_lock(weak_ptr with resource wp0)sp0reset()do_lock(expired weak_ptr wp0)return 0
int main()
demonstrate member function expiredcout ltlt boolalphashared_ptrltresourcegt sp(new resource)weak_ptrltresourcegt wp(sp)cout ltlt points to resource ltlt wpexpired () ltlt nspreset ()cout ltlt expired ltlt wpexpired() ltlt nreturn 0
Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))
Remplace auto_ptr qui est obsolegravete
Compatible avec les collections STL (containers)
Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))
unique_ptrltTgt
Effective C++ Third Edition (2005) by Scott Meyers
shared_ptr may be the most widely useful component in TR1
C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu
Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr
Paroles drsquoexperts
delete
C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = begbreak
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) delete begreturn ret
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
nullptr exprime un pointeur nul
Ce nrsquoest pas un int
class Foo
public
Foo(const char s)
Foo(int n)
hellip
Foo f(NULL)
Foo f(nullptr)
nullptr
NULL
Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =
polysbegin()
long et fastidieux agrave eacutecrire
Maintenant avec laquo auto raquo
auto beg = polysbegin()
Type deacuteduit par le compilateur
Equivalent de laquo var raquo en C
auto
auto utilise les regravegles de deacutetection drsquoarguments des
templates
const auto p = foo et const autoamp r = bar compilent
auto
Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute
Permet drsquoeacuteviter les erreurs de types troncations hellip
Fonctionne tregraves bien avec les types comme les
lambdas
auto pourquoi lrsquoutiliser
C++ C
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
RValue = tout ce qui nrsquoest pas LValue
Les reacutefeacuterences de Rvalue permettent deux choses importantes
Deacuteplacement (move semantics) pour la performance
Perfect forwarding pour la geacuteneacutericiteacute
= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)
Ex make_shared
Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre
Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc
Les conteneurs STL sont ldquomove awarerdquo
Move Semantics Perfect
Forwarding
class my_class BigHugeData data
publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr
hellip
Meacutecanique du Move Value Types
my_class f()my_class tmphellipreturn tmp
void main()my_class c = f()
Appel du Move Constructor
C++ C
29
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()
beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
une classe possegravede par deacutefaut 5 opeacuterations
Un constructeur par copie
Un opeacuterateur de copie
Un constructeur de move
Un opeacuterateur de move
Un destructeur
Attention aux impleacutementations par deacutefaut
Une classe C++11 type
Indiquer explicitement un opeacuterateur de copie par deacutefault
class Y
Yamp operator=(const Yamp) = default default copy semantics
Y(const Yamp) = default
Indiquer lrsquointerdiction de la copieclass X
Xamp operator=(const Xamp) = delete Disallow copying
X(const Xamp) = delete
=default et =delete
vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )
arrayltstring50gt a
Conteneurs STL
mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
unordered_mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
unordered_multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
container par deacutefaut vector
compact efficace cache preacutefetch
dictionary map (arbre) ou unordered_map (hash)
vecteur de taillle fixe array
compact efficace cache preacutefetch
vectorltintgt vfor (auto i = vbegin() i = vend() ++i)
i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)
i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip
cbegin() cend() crbegin() crend()
Parcours simples
Exemple for_each = le plus simple
Parcours avec transformations
Exemple copy = copie tous les eacuteleacutements reacutepondant agrave
une condition
Tris
Exemples sort stable_sort lower_bound
Algorithmes trois cateacutegories
All of
Any of
None of
For each
Find
Find end
Find first
Adjacent Find
Count
Mismatch
Equal
Is permutation
Search
Parcours simples
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
Patterns parent enfants observer
Solution weak_ptrltTgt lock() expired()
lock transformation en shared_ptr
expired tester si la ressource est disponible
Casser les cycles avec weak_ptrltTgt
static void do_lock (const char title weak_ptrltresourcegt wp)
shared_ptrltresourcegt sp = wplock()show(title sp)
int main()
demonstrate member function lockshared_ptrltresourcegt sp0(new resource)weak_ptrltresourcegt wp0(sp0)do_lock(weak_ptr with resource wp0)sp0reset()do_lock(expired weak_ptr wp0)return 0
int main()
demonstrate member function expiredcout ltlt boolalphashared_ptrltresourcegt sp(new resource)weak_ptrltresourcegt wp(sp)cout ltlt points to resource ltlt wpexpired () ltlt nspreset ()cout ltlt expired ltlt wpexpired() ltlt nreturn 0
Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))
Remplace auto_ptr qui est obsolegravete
Compatible avec les collections STL (containers)
Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))
unique_ptrltTgt
Effective C++ Third Edition (2005) by Scott Meyers
shared_ptr may be the most widely useful component in TR1
C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu
Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr
Paroles drsquoexperts
delete
C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = begbreak
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) delete begreturn ret
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
nullptr exprime un pointeur nul
Ce nrsquoest pas un int
class Foo
public
Foo(const char s)
Foo(int n)
hellip
Foo f(NULL)
Foo f(nullptr)
nullptr
NULL
Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =
polysbegin()
long et fastidieux agrave eacutecrire
Maintenant avec laquo auto raquo
auto beg = polysbegin()
Type deacuteduit par le compilateur
Equivalent de laquo var raquo en C
auto
auto utilise les regravegles de deacutetection drsquoarguments des
templates
const auto p = foo et const autoamp r = bar compilent
auto
Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute
Permet drsquoeacuteviter les erreurs de types troncations hellip
Fonctionne tregraves bien avec les types comme les
lambdas
auto pourquoi lrsquoutiliser
C++ C
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
RValue = tout ce qui nrsquoest pas LValue
Les reacutefeacuterences de Rvalue permettent deux choses importantes
Deacuteplacement (move semantics) pour la performance
Perfect forwarding pour la geacuteneacutericiteacute
= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)
Ex make_shared
Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre
Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc
Les conteneurs STL sont ldquomove awarerdquo
Move Semantics Perfect
Forwarding
class my_class BigHugeData data
publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr
hellip
Meacutecanique du Move Value Types
my_class f()my_class tmphellipreturn tmp
void main()my_class c = f()
Appel du Move Constructor
C++ C
29
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()
beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
une classe possegravede par deacutefaut 5 opeacuterations
Un constructeur par copie
Un opeacuterateur de copie
Un constructeur de move
Un opeacuterateur de move
Un destructeur
Attention aux impleacutementations par deacutefaut
Une classe C++11 type
Indiquer explicitement un opeacuterateur de copie par deacutefault
class Y
Yamp operator=(const Yamp) = default default copy semantics
Y(const Yamp) = default
Indiquer lrsquointerdiction de la copieclass X
Xamp operator=(const Xamp) = delete Disallow copying
X(const Xamp) = delete
=default et =delete
vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )
arrayltstring50gt a
Conteneurs STL
mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
unordered_mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
unordered_multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
container par deacutefaut vector
compact efficace cache preacutefetch
dictionary map (arbre) ou unordered_map (hash)
vecteur de taillle fixe array
compact efficace cache preacutefetch
vectorltintgt vfor (auto i = vbegin() i = vend() ++i)
i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)
i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip
cbegin() cend() crbegin() crend()
Parcours simples
Exemple for_each = le plus simple
Parcours avec transformations
Exemple copy = copie tous les eacuteleacutements reacutepondant agrave
une condition
Tris
Exemples sort stable_sort lower_bound
Algorithmes trois cateacutegories
All of
Any of
None of
For each
Find
Find end
Find first
Adjacent Find
Count
Mismatch
Equal
Is permutation
Search
Parcours simples
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
Une seule reacutefeacuterence de lrsquoobjetunique_ptrltCatgt c(new Cat)unique_ptrltCatgt c2(CatLoad(hellip))
Remplace auto_ptr qui est obsolegravete
Compatible avec les collections STL (containers)
Non copiable mais deacuteplaccedilableunique_ptrltCatgt c(new Cat)unique_ptrltDoggt ddreset(new Dog)unique_ptrltMonstergt m_src(new Monster)unique_ptrltMonstergt m_dest(move(m_src))
unique_ptrltTgt
Effective C++ Third Edition (2005) by Scott Meyers
shared_ptr may be the most widely useful component in TR1
C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu
Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr
Paroles drsquoexperts
delete
C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = begbreak
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) delete begreturn ret
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
nullptr exprime un pointeur nul
Ce nrsquoest pas un int
class Foo
public
Foo(const char s)
Foo(int n)
hellip
Foo f(NULL)
Foo f(nullptr)
nullptr
NULL
Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =
polysbegin()
long et fastidieux agrave eacutecrire
Maintenant avec laquo auto raquo
auto beg = polysbegin()
Type deacuteduit par le compilateur
Equivalent de laquo var raquo en C
auto
auto utilise les regravegles de deacutetection drsquoarguments des
templates
const auto p = foo et const autoamp r = bar compilent
auto
Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute
Permet drsquoeacuteviter les erreurs de types troncations hellip
Fonctionne tregraves bien avec les types comme les
lambdas
auto pourquoi lrsquoutiliser
C++ C
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
RValue = tout ce qui nrsquoest pas LValue
Les reacutefeacuterences de Rvalue permettent deux choses importantes
Deacuteplacement (move semantics) pour la performance
Perfect forwarding pour la geacuteneacutericiteacute
= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)
Ex make_shared
Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre
Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc
Les conteneurs STL sont ldquomove awarerdquo
Move Semantics Perfect
Forwarding
class my_class BigHugeData data
publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr
hellip
Meacutecanique du Move Value Types
my_class f()my_class tmphellipreturn tmp
void main()my_class c = f()
Appel du Move Constructor
C++ C
29
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()
beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
une classe possegravede par deacutefaut 5 opeacuterations
Un constructeur par copie
Un opeacuterateur de copie
Un constructeur de move
Un opeacuterateur de move
Un destructeur
Attention aux impleacutementations par deacutefaut
Une classe C++11 type
Indiquer explicitement un opeacuterateur de copie par deacutefault
class Y
Yamp operator=(const Yamp) = default default copy semantics
Y(const Yamp) = default
Indiquer lrsquointerdiction de la copieclass X
Xamp operator=(const Xamp) = delete Disallow copying
X(const Xamp) = delete
=default et =delete
vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )
arrayltstring50gt a
Conteneurs STL
mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
unordered_mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
unordered_multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
container par deacutefaut vector
compact efficace cache preacutefetch
dictionary map (arbre) ou unordered_map (hash)
vecteur de taillle fixe array
compact efficace cache preacutefetch
vectorltintgt vfor (auto i = vbegin() i = vend() ++i)
i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)
i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip
cbegin() cend() crbegin() crend()
Parcours simples
Exemple for_each = le plus simple
Parcours avec transformations
Exemple copy = copie tous les eacuteleacutements reacutepondant agrave
une condition
Tris
Exemples sort stable_sort lower_bound
Algorithmes trois cateacutegories
All of
Any of
None of
For each
Find
Find end
Find first
Adjacent Find
Count
Mismatch
Equal
Is permutation
Search
Parcours simples
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
Effective C++ Third Edition (2005) by Scott Meyers
shared_ptr may be the most widely useful component in TR1
C++ Coding Standards (2005) by Herb Sutter and Andrei Alexandrescu
Store only values and smart pointers in containers To this we add If you use [Boost] and [C++TR104] for nothing else use them for shared_ptr
Paroles drsquoexperts
delete
C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = begbreak
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) delete begreturn ret
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
nullptr exprime un pointeur nul
Ce nrsquoest pas un int
class Foo
public
Foo(const char s)
Foo(int n)
hellip
Foo f(NULL)
Foo f(nullptr)
nullptr
NULL
Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =
polysbegin()
long et fastidieux agrave eacutecrire
Maintenant avec laquo auto raquo
auto beg = polysbegin()
Type deacuteduit par le compilateur
Equivalent de laquo var raquo en C
auto
auto utilise les regravegles de deacutetection drsquoarguments des
templates
const auto p = foo et const autoamp r = bar compilent
auto
Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute
Permet drsquoeacuteviter les erreurs de types troncations hellip
Fonctionne tregraves bien avec les types comme les
lambdas
auto pourquoi lrsquoutiliser
C++ C
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
RValue = tout ce qui nrsquoest pas LValue
Les reacutefeacuterences de Rvalue permettent deux choses importantes
Deacuteplacement (move semantics) pour la performance
Perfect forwarding pour la geacuteneacutericiteacute
= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)
Ex make_shared
Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre
Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc
Les conteneurs STL sont ldquomove awarerdquo
Move Semantics Perfect
Forwarding
class my_class BigHugeData data
publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr
hellip
Meacutecanique du Move Value Types
my_class f()my_class tmphellipreturn tmp
void main()my_class c = f()
Appel du Move Constructor
C++ C
29
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()
beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
une classe possegravede par deacutefaut 5 opeacuterations
Un constructeur par copie
Un opeacuterateur de copie
Un constructeur de move
Un opeacuterateur de move
Un destructeur
Attention aux impleacutementations par deacutefaut
Une classe C++11 type
Indiquer explicitement un opeacuterateur de copie par deacutefault
class Y
Yamp operator=(const Yamp) = default default copy semantics
Y(const Yamp) = default
Indiquer lrsquointerdiction de la copieclass X
Xamp operator=(const Xamp) = delete Disallow copying
X(const Xamp) = delete
=default et =delete
vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )
arrayltstring50gt a
Conteneurs STL
mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
unordered_mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
unordered_multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
container par deacutefaut vector
compact efficace cache preacutefetch
dictionary map (arbre) ou unordered_map (hash)
vecteur de taillle fixe array
compact efficace cache preacutefetch
vectorltintgt vfor (auto i = vbegin() i = vend() ++i)
i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)
i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip
cbegin() cend() crbegin() crend()
Parcours simples
Exemple for_each = le plus simple
Parcours avec transformations
Exemple copy = copie tous les eacuteleacutements reacutepondant agrave
une condition
Tris
Exemples sort stable_sort lower_bound
Algorithmes trois cateacutegories
All of
Any of
None of
For each
Find
Find end
Find first
Adjacent Find
Count
Mismatch
Equal
Is permutation
Search
Parcours simples
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
delete
C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = begbreak
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) delete begreturn ret
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
nullptr exprime un pointeur nul
Ce nrsquoest pas un int
class Foo
public
Foo(const char s)
Foo(int n)
hellip
Foo f(NULL)
Foo f(nullptr)
nullptr
NULL
Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =
polysbegin()
long et fastidieux agrave eacutecrire
Maintenant avec laquo auto raquo
auto beg = polysbegin()
Type deacuteduit par le compilateur
Equivalent de laquo var raquo en C
auto
auto utilise les regravegles de deacutetection drsquoarguments des
templates
const auto p = foo et const autoamp r = bar compilent
auto
Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute
Permet drsquoeacuteviter les erreurs de types troncations hellip
Fonctionne tregraves bien avec les types comme les
lambdas
auto pourquoi lrsquoutiliser
C++ C
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
RValue = tout ce qui nrsquoest pas LValue
Les reacutefeacuterences de Rvalue permettent deux choses importantes
Deacuteplacement (move semantics) pour la performance
Perfect forwarding pour la geacuteneacutericiteacute
= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)
Ex make_shared
Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre
Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc
Les conteneurs STL sont ldquomove awarerdquo
Move Semantics Perfect
Forwarding
class my_class BigHugeData data
publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr
hellip
Meacutecanique du Move Value Types
my_class f()my_class tmphellipreturn tmp
void main()my_class c = f()
Appel du Move Constructor
C++ C
29
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()
beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
une classe possegravede par deacutefaut 5 opeacuterations
Un constructeur par copie
Un opeacuterateur de copie
Un constructeur de move
Un opeacuterateur de move
Un destructeur
Attention aux impleacutementations par deacutefaut
Une classe C++11 type
Indiquer explicitement un opeacuterateur de copie par deacutefault
class Y
Yamp operator=(const Yamp) = default default copy semantics
Y(const Yamp) = default
Indiquer lrsquointerdiction de la copieclass X
Xamp operator=(const Xamp) = delete Disallow copying
X(const Xamp) = delete
=default et =delete
vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )
arrayltstring50gt a
Conteneurs STL
mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
unordered_mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
unordered_multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
container par deacutefaut vector
compact efficace cache preacutefetch
dictionary map (arbre) ou unordered_map (hash)
vecteur de taillle fixe array
compact efficace cache preacutefetch
vectorltintgt vfor (auto i = vbegin() i = vend() ++i)
i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)
i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip
cbegin() cend() crbegin() crend()
Parcours simples
Exemple for_each = le plus simple
Parcours avec transformations
Exemple copy = copie tous les eacuteleacutements reacutepondant agrave
une condition
Tris
Exemples sort stable_sort lower_bound
Algorithmes trois cateacutegories
All of
Any of
None of
For each
Find
Find end
Find first
Adjacent Find
Count
Mismatch
Equal
Is permutation
Search
Parcours simples
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
C++ CCPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = begbreak
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) delete begreturn ret
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
nullptr exprime un pointeur nul
Ce nrsquoest pas un int
class Foo
public
Foo(const char s)
Foo(int n)
hellip
Foo f(NULL)
Foo f(nullptr)
nullptr
NULL
Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =
polysbegin()
long et fastidieux agrave eacutecrire
Maintenant avec laquo auto raquo
auto beg = polysbegin()
Type deacuteduit par le compilateur
Equivalent de laquo var raquo en C
auto
auto utilise les regravegles de deacutetection drsquoarguments des
templates
const auto p = foo et const autoamp r = bar compilent
auto
Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute
Permet drsquoeacuteviter les erreurs de types troncations hellip
Fonctionne tregraves bien avec les types comme les
lambdas
auto pourquoi lrsquoutiliser
C++ C
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
RValue = tout ce qui nrsquoest pas LValue
Les reacutefeacuterences de Rvalue permettent deux choses importantes
Deacuteplacement (move semantics) pour la performance
Perfect forwarding pour la geacuteneacutericiteacute
= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)
Ex make_shared
Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre
Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc
Les conteneurs STL sont ldquomove awarerdquo
Move Semantics Perfect
Forwarding
class my_class BigHugeData data
publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr
hellip
Meacutecanique du Move Value Types
my_class f()my_class tmphellipreturn tmp
void main()my_class c = f()
Appel du Move Constructor
C++ C
29
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()
beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
une classe possegravede par deacutefaut 5 opeacuterations
Un constructeur par copie
Un opeacuterateur de copie
Un constructeur de move
Un opeacuterateur de move
Un destructeur
Attention aux impleacutementations par deacutefaut
Une classe C++11 type
Indiquer explicitement un opeacuterateur de copie par deacutefault
class Y
Yamp operator=(const Yamp) = default default copy semantics
Y(const Yamp) = default
Indiquer lrsquointerdiction de la copieclass X
Xamp operator=(const Xamp) = delete Disallow copying
X(const Xamp) = delete
=default et =delete
vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )
arrayltstring50gt a
Conteneurs STL
mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
unordered_mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
unordered_multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
container par deacutefaut vector
compact efficace cache preacutefetch
dictionary map (arbre) ou unordered_map (hash)
vecteur de taillle fixe array
compact efficace cache preacutefetch
vectorltintgt vfor (auto i = vbegin() i = vend() ++i)
i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)
i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip
cbegin() cend() crbegin() crend()
Parcours simples
Exemple for_each = le plus simple
Parcours avec transformations
Exemple copy = copie tous les eacuteleacutements reacutepondant agrave
une condition
Tris
Exemples sort stable_sort lower_bound
Algorithmes trois cateacutegories
All of
Any of
None of
For each
Find
Find end
Find first
Adjacent Find
Count
Mismatch
Equal
Is permutation
Search
Parcours simples
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
nullptr exprime un pointeur nul
Ce nrsquoest pas un int
class Foo
public
Foo(const char s)
Foo(int n)
hellip
Foo f(NULL)
Foo f(nullptr)
nullptr
NULL
Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =
polysbegin()
long et fastidieux agrave eacutecrire
Maintenant avec laquo auto raquo
auto beg = polysbegin()
Type deacuteduit par le compilateur
Equivalent de laquo var raquo en C
auto
auto utilise les regravegles de deacutetection drsquoarguments des
templates
const auto p = foo et const autoamp r = bar compilent
auto
Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute
Permet drsquoeacuteviter les erreurs de types troncations hellip
Fonctionne tregraves bien avec les types comme les
lambdas
auto pourquoi lrsquoutiliser
C++ C
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
RValue = tout ce qui nrsquoest pas LValue
Les reacutefeacuterences de Rvalue permettent deux choses importantes
Deacuteplacement (move semantics) pour la performance
Perfect forwarding pour la geacuteneacutericiteacute
= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)
Ex make_shared
Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre
Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc
Les conteneurs STL sont ldquomove awarerdquo
Move Semantics Perfect
Forwarding
class my_class BigHugeData data
publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr
hellip
Meacutecanique du Move Value Types
my_class f()my_class tmphellipreturn tmp
void main()my_class c = f()
Appel du Move Constructor
C++ C
29
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()
beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
une classe possegravede par deacutefaut 5 opeacuterations
Un constructeur par copie
Un opeacuterateur de copie
Un constructeur de move
Un opeacuterateur de move
Un destructeur
Attention aux impleacutementations par deacutefaut
Une classe C++11 type
Indiquer explicitement un opeacuterateur de copie par deacutefault
class Y
Yamp operator=(const Yamp) = default default copy semantics
Y(const Yamp) = default
Indiquer lrsquointerdiction de la copieclass X
Xamp operator=(const Xamp) = delete Disallow copying
X(const Xamp) = delete
=default et =delete
vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )
arrayltstring50gt a
Conteneurs STL
mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
unordered_mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
unordered_multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
container par deacutefaut vector
compact efficace cache preacutefetch
dictionary map (arbre) ou unordered_map (hash)
vecteur de taillle fixe array
compact efficace cache preacutefetch
vectorltintgt vfor (auto i = vbegin() i = vend() ++i)
i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)
i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip
cbegin() cend() crbegin() crend()
Parcours simples
Exemple for_each = le plus simple
Parcours avec transformations
Exemple copy = copie tous les eacuteleacutements reacutepondant agrave
une condition
Tris
Exemples sort stable_sort lower_bound
Algorithmes trois cateacutegories
All of
Any of
None of
For each
Find
Find end
Find first
Adjacent Find
Count
Mismatch
Equal
Is permutation
Search
Parcours simples
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
NULL
Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =
polysbegin()
long et fastidieux agrave eacutecrire
Maintenant avec laquo auto raquo
auto beg = polysbegin()
Type deacuteduit par le compilateur
Equivalent de laquo var raquo en C
auto
auto utilise les regravegles de deacutetection drsquoarguments des
templates
const auto p = foo et const autoamp r = bar compilent
auto
Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute
Permet drsquoeacuteviter les erreurs de types troncations hellip
Fonctionne tregraves bien avec les types comme les
lambdas
auto pourquoi lrsquoutiliser
C++ C
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
RValue = tout ce qui nrsquoest pas LValue
Les reacutefeacuterences de Rvalue permettent deux choses importantes
Deacuteplacement (move semantics) pour la performance
Perfect forwarding pour la geacuteneacutericiteacute
= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)
Ex make_shared
Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre
Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc
Les conteneurs STL sont ldquomove awarerdquo
Move Semantics Perfect
Forwarding
class my_class BigHugeData data
publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr
hellip
Meacutecanique du Move Value Types
my_class f()my_class tmphellipreturn tmp
void main()my_class c = f()
Appel du Move Constructor
C++ C
29
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()
beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
une classe possegravede par deacutefaut 5 opeacuterations
Un constructeur par copie
Un opeacuterateur de copie
Un constructeur de move
Un opeacuterateur de move
Un destructeur
Attention aux impleacutementations par deacutefaut
Une classe C++11 type
Indiquer explicitement un opeacuterateur de copie par deacutefault
class Y
Yamp operator=(const Yamp) = default default copy semantics
Y(const Yamp) = default
Indiquer lrsquointerdiction de la copieclass X
Xamp operator=(const Xamp) = delete Disallow copying
X(const Xamp) = delete
=default et =delete
vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )
arrayltstring50gt a
Conteneurs STL
mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
unordered_mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
unordered_multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
container par deacutefaut vector
compact efficace cache preacutefetch
dictionary map (arbre) ou unordered_map (hash)
vecteur de taillle fixe array
compact efficace cache preacutefetch
vectorltintgt vfor (auto i = vbegin() i = vend() ++i)
i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)
i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip
cbegin() cend() crbegin() crend()
Parcours simples
Exemple for_each = le plus simple
Parcours avec transformations
Exemple copy = copie tous les eacuteleacutements reacutepondant agrave
une condition
Tris
Exemples sort stable_sort lower_bound
Algorithmes trois cateacutegories
All of
Any of
None of
For each
Find
Find end
Find first
Adjacent Find
Count
Mismatch
Equal
Is permutation
Search
Parcours simples
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
Avanthellip vectorltshared_ptrltCPolygongtgtiterator beg =
polysbegin()
long et fastidieux agrave eacutecrire
Maintenant avec laquo auto raquo
auto beg = polysbegin()
Type deacuteduit par le compilateur
Equivalent de laquo var raquo en C
auto
auto utilise les regravegles de deacutetection drsquoarguments des
templates
const auto p = foo et const autoamp r = bar compilent
auto
Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute
Permet drsquoeacuteviter les erreurs de types troncations hellip
Fonctionne tregraves bien avec les types comme les
lambdas
auto pourquoi lrsquoutiliser
C++ C
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
RValue = tout ce qui nrsquoest pas LValue
Les reacutefeacuterences de Rvalue permettent deux choses importantes
Deacuteplacement (move semantics) pour la performance
Perfect forwarding pour la geacuteneacutericiteacute
= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)
Ex make_shared
Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre
Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc
Les conteneurs STL sont ldquomove awarerdquo
Move Semantics Perfect
Forwarding
class my_class BigHugeData data
publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr
hellip
Meacutecanique du Move Value Types
my_class f()my_class tmphellipreturn tmp
void main()my_class c = f()
Appel du Move Constructor
C++ C
29
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()
beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
une classe possegravede par deacutefaut 5 opeacuterations
Un constructeur par copie
Un opeacuterateur de copie
Un constructeur de move
Un opeacuterateur de move
Un destructeur
Attention aux impleacutementations par deacutefaut
Une classe C++11 type
Indiquer explicitement un opeacuterateur de copie par deacutefault
class Y
Yamp operator=(const Yamp) = default default copy semantics
Y(const Yamp) = default
Indiquer lrsquointerdiction de la copieclass X
Xamp operator=(const Xamp) = delete Disallow copying
X(const Xamp) = delete
=default et =delete
vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )
arrayltstring50gt a
Conteneurs STL
mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
unordered_mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
unordered_multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
container par deacutefaut vector
compact efficace cache preacutefetch
dictionary map (arbre) ou unordered_map (hash)
vecteur de taillle fixe array
compact efficace cache preacutefetch
vectorltintgt vfor (auto i = vbegin() i = vend() ++i)
i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)
i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip
cbegin() cend() crbegin() crend()
Parcours simples
Exemple for_each = le plus simple
Parcours avec transformations
Exemple copy = copie tous les eacuteleacutements reacutepondant agrave
une condition
Tris
Exemples sort stable_sort lower_bound
Algorithmes trois cateacutegories
All of
Any of
None of
For each
Find
Find end
Find first
Adjacent Find
Count
Mismatch
Equal
Is permutation
Search
Parcours simples
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
auto utilise les regravegles de deacutetection drsquoarguments des
templates
const auto p = foo et const autoamp r = bar compilent
auto
Reacuteduit la taille du code et en ameacuteliore la lisibiliteacute
Permet drsquoeacuteviter les erreurs de types troncations hellip
Fonctionne tregraves bien avec les types comme les
lambdas
auto pourquoi lrsquoutiliser
C++ C
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
RValue = tout ce qui nrsquoest pas LValue
Les reacutefeacuterences de Rvalue permettent deux choses importantes
Deacuteplacement (move semantics) pour la performance
Perfect forwarding pour la geacuteneacutericiteacute
= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)
Ex make_shared
Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre
Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc
Les conteneurs STL sont ldquomove awarerdquo
Move Semantics Perfect
Forwarding
class my_class BigHugeData data
publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr
hellip
Meacutecanique du Move Value Types
my_class f()my_class tmphellipreturn tmp
void main()my_class c = f()
Appel du Move Constructor
C++ C
29
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()
beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
une classe possegravede par deacutefaut 5 opeacuterations
Un constructeur par copie
Un opeacuterateur de copie
Un constructeur de move
Un opeacuterateur de move
Un destructeur
Attention aux impleacutementations par deacutefaut
Une classe C++11 type
Indiquer explicitement un opeacuterateur de copie par deacutefault
class Y
Yamp operator=(const Yamp) = default default copy semantics
Y(const Yamp) = default
Indiquer lrsquointerdiction de la copieclass X
Xamp operator=(const Xamp) = delete Disallow copying
X(const Xamp) = delete
=default et =delete
vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )
arrayltstring50gt a
Conteneurs STL
mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
unordered_mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
unordered_multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
container par deacutefaut vector
compact efficace cache preacutefetch
dictionary map (arbre) ou unordered_map (hash)
vecteur de taillle fixe array
compact efficace cache preacutefetch
vectorltintgt vfor (auto i = vbegin() i = vend() ++i)
i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)
i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip
cbegin() cend() crbegin() crend()
Parcours simples
Exemple for_each = le plus simple
Parcours avec transformations
Exemple copy = copie tous les eacuteleacutements reacutepondant agrave
une condition
Tris
Exemples sort stable_sort lower_bound
Algorithmes trois cateacutegories
All of
Any of
None of
For each
Find
Find end
Find first
Adjacent Find
Count
Mismatch
Equal
Is permutation
Search
Parcours simples
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
C++ C
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (vectorltshared_ptrltCPolygongtgt
iterator beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
RValue = tout ce qui nrsquoest pas LValue
Les reacutefeacuterences de Rvalue permettent deux choses importantes
Deacuteplacement (move semantics) pour la performance
Perfect forwarding pour la geacuteneacutericiteacute
= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)
Ex make_shared
Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre
Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc
Les conteneurs STL sont ldquomove awarerdquo
Move Semantics Perfect
Forwarding
class my_class BigHugeData data
publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr
hellip
Meacutecanique du Move Value Types
my_class f()my_class tmphellipreturn tmp
void main()my_class c = f()
Appel du Move Constructor
C++ C
29
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()
beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
une classe possegravede par deacutefaut 5 opeacuterations
Un constructeur par copie
Un opeacuterateur de copie
Un constructeur de move
Un opeacuterateur de move
Un destructeur
Attention aux impleacutementations par deacutefaut
Une classe C++11 type
Indiquer explicitement un opeacuterateur de copie par deacutefault
class Y
Yamp operator=(const Yamp) = default default copy semantics
Y(const Yamp) = default
Indiquer lrsquointerdiction de la copieclass X
Xamp operator=(const Xamp) = delete Disallow copying
X(const Xamp) = delete
=default et =delete
vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )
arrayltstring50gt a
Conteneurs STL
mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
unordered_mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
unordered_multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
container par deacutefaut vector
compact efficace cache preacutefetch
dictionary map (arbre) ou unordered_map (hash)
vecteur de taillle fixe array
compact efficace cache preacutefetch
vectorltintgt vfor (auto i = vbegin() i = vend() ++i)
i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)
i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip
cbegin() cend() crbegin() crend()
Parcours simples
Exemple for_each = le plus simple
Parcours avec transformations
Exemple copy = copie tous les eacuteleacutements reacutepondant agrave
une condition
Tris
Exemples sort stable_sort lower_bound
Algorithmes trois cateacutegories
All of
Any of
None of
For each
Find
Find end
Find first
Adjacent Find
Count
Mismatch
Equal
Is permutation
Search
Parcours simples
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
RValue = tout ce qui nrsquoest pas LValue
Les reacutefeacuterences de Rvalue permettent deux choses importantes
Deacuteplacement (move semantics) pour la performance
Perfect forwarding pour la geacuteneacutericiteacute
= une seule fonction geacuteneacuterique qui accepte des arguments quelconqueset les transmet de maniegravere transparente agrave une autre fonction en preacuteservant leur nature (const lvalue rvalue etc)
Ex make_shared
Les patterns de deacuteplacement et de perfect forwarding sont simples agrave mettre en oeuvre
Mais ils srsquoappuient sur de nouvelles regravegles drsquoinitialisation de reacutesolution de surcharge de deacuteduction des paramegravetres des templates etc
Les conteneurs STL sont ldquomove awarerdquo
Move Semantics Perfect
Forwarding
class my_class BigHugeData data
publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr
hellip
Meacutecanique du Move Value Types
my_class f()my_class tmphellipreturn tmp
void main()my_class c = f()
Appel du Move Constructor
C++ C
29
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()
beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
une classe possegravede par deacutefaut 5 opeacuterations
Un constructeur par copie
Un opeacuterateur de copie
Un constructeur de move
Un opeacuterateur de move
Un destructeur
Attention aux impleacutementations par deacutefaut
Une classe C++11 type
Indiquer explicitement un opeacuterateur de copie par deacutefault
class Y
Yamp operator=(const Yamp) = default default copy semantics
Y(const Yamp) = default
Indiquer lrsquointerdiction de la copieclass X
Xamp operator=(const Xamp) = delete Disallow copying
X(const Xamp) = delete
=default et =delete
vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )
arrayltstring50gt a
Conteneurs STL
mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
unordered_mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
unordered_multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
container par deacutefaut vector
compact efficace cache preacutefetch
dictionary map (arbre) ou unordered_map (hash)
vecteur de taillle fixe array
compact efficace cache preacutefetch
vectorltintgt vfor (auto i = vbegin() i = vend() ++i)
i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)
i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip
cbegin() cend() crbegin() crend()
Parcours simples
Exemple for_each = le plus simple
Parcours avec transformations
Exemple copy = copie tous les eacuteleacutements reacutepondant agrave
une condition
Tris
Exemples sort stable_sort lower_bound
Algorithmes trois cateacutegories
All of
Any of
None of
For each
Find
Find end
Find first
Adjacent Find
Count
Mismatch
Equal
Is permutation
Search
Parcours simples
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
class my_class BigHugeData data
publicmy_class(const my_classamp src)hellipmy_class(my_classampamp other)data = otherdataotherdata = nullptr
hellip
Meacutecanique du Move Value Types
my_class f()my_class tmphellipreturn tmp
void main()my_class c = f()
Appel du Move Constructor
C++ C
29
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()
beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
une classe possegravede par deacutefaut 5 opeacuterations
Un constructeur par copie
Un opeacuterateur de copie
Un constructeur de move
Un opeacuterateur de move
Un destructeur
Attention aux impleacutementations par deacutefaut
Une classe C++11 type
Indiquer explicitement un opeacuterateur de copie par deacutefault
class Y
Yamp operator=(const Yamp) = default default copy semantics
Y(const Yamp) = default
Indiquer lrsquointerdiction de la copieclass X
Xamp operator=(const Xamp) = delete Disallow copying
X(const Xamp) = delete
=default et =delete
vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )
arrayltstring50gt a
Conteneurs STL
mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
unordered_mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
unordered_multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
container par deacutefaut vector
compact efficace cache preacutefetch
dictionary map (arbre) ou unordered_map (hash)
vecteur de taillle fixe array
compact efficace cache preacutefetch
vectorltintgt vfor (auto i = vbegin() i = vend() ++i)
i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)
i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip
cbegin() cend() crbegin() crend()
Parcours simples
Exemple for_each = le plus simple
Parcours avec transformations
Exemple copy = copie tous les eacuteleacutements reacutepondant agrave
une condition
Tris
Exemples sort stable_sort lower_bound
Algorithmes trois cateacutegories
All of
Any of
None of
For each
Find
Find end
Find first
Adjacent Find
Count
Mismatch
Equal
Is permutation
Search
Parcours simples
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
C++ C
29
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)vectorltshared_ptrltCPolygongtgt polysReadPolys(polys)for (auto beg = polysbegin()
beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
une classe possegravede par deacutefaut 5 opeacuterations
Un constructeur par copie
Un opeacuterateur de copie
Un constructeur de move
Un opeacuterateur de move
Un destructeur
Attention aux impleacutementations par deacutefaut
Une classe C++11 type
Indiquer explicitement un opeacuterateur de copie par deacutefault
class Y
Yamp operator=(const Yamp) = default default copy semantics
Y(const Yamp) = default
Indiquer lrsquointerdiction de la copieclass X
Xamp operator=(const Xamp) = delete Disallow copying
X(const Xamp) = delete
=default et =delete
vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )
arrayltstring50gt a
Conteneurs STL
mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
unordered_mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
unordered_multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
container par deacutefaut vector
compact efficace cache preacutefetch
dictionary map (arbre) ou unordered_map (hash)
vecteur de taillle fixe array
compact efficace cache preacutefetch
vectorltintgt vfor (auto i = vbegin() i = vend() ++i)
i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)
i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip
cbegin() cend() crbegin() crend()
Parcours simples
Exemple for_each = le plus simple
Parcours avec transformations
Exemple copy = copie tous les eacuteleacutements reacutepondant agrave
une condition
Tris
Exemples sort stable_sort lower_bound
Algorithmes trois cateacutegories
All of
Any of
None of
For each
Find
Find end
Find first
Adjacent Find
Count
Mismatch
Equal
Is permutation
Search
Parcours simples
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
une classe possegravede par deacutefaut 5 opeacuterations
Un constructeur par copie
Un opeacuterateur de copie
Un constructeur de move
Un opeacuterateur de move
Un destructeur
Attention aux impleacutementations par deacutefaut
Une classe C++11 type
Indiquer explicitement un opeacuterateur de copie par deacutefault
class Y
Yamp operator=(const Yamp) = default default copy semantics
Y(const Yamp) = default
Indiquer lrsquointerdiction de la copieclass X
Xamp operator=(const Xamp) = delete Disallow copying
X(const Xamp) = delete
=default et =delete
vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )
arrayltstring50gt a
Conteneurs STL
mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
unordered_mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
unordered_multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
container par deacutefaut vector
compact efficace cache preacutefetch
dictionary map (arbre) ou unordered_map (hash)
vecteur de taillle fixe array
compact efficace cache preacutefetch
vectorltintgt vfor (auto i = vbegin() i = vend() ++i)
i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)
i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip
cbegin() cend() crbegin() crend()
Parcours simples
Exemple for_each = le plus simple
Parcours avec transformations
Exemple copy = copie tous les eacuteleacutements reacutepondant agrave
une condition
Tris
Exemples sort stable_sort lower_bound
Algorithmes trois cateacutegories
All of
Any of
None of
For each
Find
Find end
Find first
Adjacent Find
Count
Mismatch
Equal
Is permutation
Search
Parcours simples
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
Indiquer explicitement un opeacuterateur de copie par deacutefault
class Y
Yamp operator=(const Yamp) = default default copy semantics
Y(const Yamp) = default
Indiquer lrsquointerdiction de la copieclass X
Xamp operator=(const Xamp) = delete Disallow copying
X(const Xamp) = delete
=default et =delete
vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )
arrayltstring50gt a
Conteneurs STL
mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
unordered_mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
unordered_multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
container par deacutefaut vector
compact efficace cache preacutefetch
dictionary map (arbre) ou unordered_map (hash)
vecteur de taillle fixe array
compact efficace cache preacutefetch
vectorltintgt vfor (auto i = vbegin() i = vend() ++i)
i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)
i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip
cbegin() cend() crbegin() crend()
Parcours simples
Exemple for_each = le plus simple
Parcours avec transformations
Exemple copy = copie tous les eacuteleacutements reacutepondant agrave
une condition
Tris
Exemples sort stable_sort lower_bound
Algorithmes trois cateacutegories
All of
Any of
None of
For each
Find
Find end
Find first
Adjacent Find
Count
Mismatch
Equal
Is permutation
Search
Parcours simples
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
vectorltstringgt vvpush_back( ldquoGeddy Leerdquo )
arrayltstring50gt a
Conteneurs STL
mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
unordered_mapltstring stringgt phone
phone[ldquoAlex Lifesonrdquo] = ldquo+1 (416) 555-1212rdquo
unordered_multimapltstring stringgt phone
phone[ldquoNeil Peartrdquo] = ldquo+1 (416) 555-1212rdquo
phone[ldquoNeil Peartrdquo] = ldquo+1 (905) 555-1234rdquo
container par deacutefaut vector
compact efficace cache preacutefetch
dictionary map (arbre) ou unordered_map (hash)
vecteur de taillle fixe array
compact efficace cache preacutefetch
vectorltintgt vfor (auto i = vbegin() i = vend() ++i)
i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)
i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip
cbegin() cend() crbegin() crend()
Parcours simples
Exemple for_each = le plus simple
Parcours avec transformations
Exemple copy = copie tous les eacuteleacutements reacutepondant agrave
une condition
Tris
Exemples sort stable_sort lower_bound
Algorithmes trois cateacutegories
All of
Any of
None of
For each
Find
Find end
Find first
Adjacent Find
Count
Mismatch
Equal
Is permutation
Search
Parcours simples
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
vectorltintgt vfor (auto i = vbegin() i = vend() ++i)
i is vectorltintgtiteratorfor (auto i = vcrbegin() i = vcrend() ++i)
i is vectorltintgtconst_iterator Forme preacutefeacutereacutee begin() et end()for (auto i = begin(v) i = end(v) ++i) hellip
cbegin() cend() crbegin() crend()
Parcours simples
Exemple for_each = le plus simple
Parcours avec transformations
Exemple copy = copie tous les eacuteleacutements reacutepondant agrave
une condition
Tris
Exemples sort stable_sort lower_bound
Algorithmes trois cateacutegories
All of
Any of
None of
For each
Find
Find end
Find first
Adjacent Find
Count
Mismatch
Equal
Is permutation
Search
Parcours simples
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
Parcours simples
Exemple for_each = le plus simple
Parcours avec transformations
Exemple copy = copie tous les eacuteleacutements reacutepondant agrave
une condition
Tris
Exemples sort stable_sort lower_bound
Algorithmes trois cateacutegories
All of
Any of
None of
For each
Find
Find end
Find first
Adjacent Find
Count
Mismatch
Equal
Is permutation
Search
Parcours simples
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
All of
Any of
None of
For each
Find
Find end
Find first
Adjacent Find
Count
Mismatch
Equal
Is permutation
Search
Parcours simples
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
templateltclass InputIterator class Predicategt
InputIterator find_if(InputIterator firstInputIterator last
Predicate pred)
Retourne le premier eacuteleacutement veacuterifiant le preacutedicat
Predicate
Fonctions
Classe surchargeant operator()
Lambda
Exemple Find first
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
Copy
Move
Swap
Transform
Replace
Fill
Generate
Remove
Unique
Reverse
Rotate
Random shuffle
Partitions
Transformations
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
templateltclass InputIterator class OutputIteratorclass UnaryOperationgt
OutputIterator transform(InputIterator firstInputIterator last
OutputIterator result
UnaryOperation op)
Exemple impression de tous les eacuteleacutements drsquoun conteneur
copy(pointsbegin() pointsend()
ostream_iteratorltCPointgt(cout n ))
Exemple Transform
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
Sort
Stable_sort
Partial_sort
Nth element
Binary search lower_bound upper_bound
Merge
Tri et assimileacutes
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
templateltclass RandomAccessIterator class Comparegt
void sort(RandomAccessIterator first
RandomAccessIterator last
Compare comp)
Trie les eacuteleacutements selon laquo comp raquo
Comp = ordre strict (lt ou gt et non ou )bool PlusHaut(CPoint amppt1 CPoint amppt2)
return pt1Y() gt pt2Y()
sort(pointsbegin() pointsend() PlusHaut)
Exemple sort
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
Function for_each(InputIterator first InputIterator last Function f)
InputIterator find_if(InputIterator first InputIterator last Predicate pred)
void sort(RandomAccessIterator first RandomAccessIterator last Compare comp)
Fonctions et preacutedicats
Fonctions simples bool PlusHaut(CPoint amppt1
CPoint amppt2)return pt1Y() gt pt2Y()
Classes surchargeant () class DistancePoint protected
const CPoint amp_ptrpublicDistancePoint(const CPoint ampptr)
_ptr(ptr)
bool operator()(CPoint amppt1 CPoint amppt2)
return _ptrDistance2(pt1)lt _ptrDistance2(pt2)
Et lambdas
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
Les Lambda Expressions deacutefinissent et construisent des classes fonctions anonymes
La Lamba Expressionfor_each(vbegin() vend() [](int n) cout ltlt n ltlt )
Est eacutequivalente agravestruct LambdaFunctor
void operator()(int n) const cout ltlt n ltlt
hellipfor_each(vbegin() vend() LambdaFunctor)
Le BA BA des lambdas
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
Une lambda peut contenir plusieurs instructions
void par deacutefaut -gt type pour preacuteciser le type de retour
[] sert agrave indiquer ce qursquoon doit capturer du contexte
Utilisation de variables exteacuterieures agrave la lambdaverase(remove_if(vbegin() vend() [x y](int n) return x lt n ampamp n lt y ) vend())
Lambda Stateless []
Les copies captureacutees laquo survivent raquo agrave leur contexte
Possibiliteacute de capture par reacutefeacuterence
Capture de toutes les variables [=] ou [amp]
Compleacutements
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
C++ C
44
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys(polys)
for (auto beg = polysbegin()beg = polysend()++beg)
if ((beg)-gtContains(pt))return beg
return nullptr
Polygon Search(int xint y)
Point pt
= new Point(xy)ListltPolygongt polys
= ReadPolys()return polysFirstOrDefault(p =gt pContains(pt))
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
C++ 98 C++ 2011
45
CPolygon Search(int x int y)CPoint pt(xy)vectorltCPolygongt polysReadPolys(polys)CPolygon ret = NULLfor (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg)-gtContains(pt)) ret = beg
for (vectorltCPolygongtiterator
beg = polysbegin()beg=polysend()++beg)
if ((beg) ampamp (bet = ret)) deletebeg
return ret
shared_ptrltCPolygongt Search(int xint y)
CPoint pt(xy)auto polys = ReadPolys()auto found = find_if(begin(polys)
end(polys)[pt](shared_ptrltCPolygongt pol) return pol-gtContains(pt)
)return (found = polysend())
found nullptr
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
Maintenant on peut eacutecrire celavectorltdoublegt v = 1 2 3456 9999
listltpairltstringstringgtgt languages = NygaardSimula RichardsBCPL RitchieC
mapltvectorltstringgtvectorltintgtgt years =
MauriceVincent Wilkes1913 1945 1951 1967 2000
Martin Ritchards 1982 2003 2007
David John Wheeler 1927 1947 1951 2004
Lrsquoutilisation de est possible via une fonction (souvent par un constructeur) qui accepte un argument stdinitializer_listltTgt
vector (stdinitializer_listltEgt s) initializer-list constructor
Initialisation des listes
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
VC++ amp C++11
VC11Beta
VC11RTM
OOBCTP
OOBRTM
Feb2012
+ C++11range-for
finaloverride
Out-Of-BandReleases
+ progressively roll out C++11 initializer lists template
aliases variadic templates constexpr noexcept =defaultdelete hellip
VC11DP
Sep2011
+ completeC++11 stdlib
threadmutexasync future hellip+ track changes
(lambdas ampamp hellip)
Techdays 2012
VC10RTM
Apr2010
+ lambdas moveampamp
auto decltypeauto fn decls
extern templatenullptr hellip Survey bitlymscpp11
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
Systeacutematiser lrsquousage des Smart Pointers = plus de delete
shared_ptr weak_ptr unique_ptr auto_ptr
make_shared
Oublier NULL et utiliser null_ptr
Capitaliser sur les conteneurs et algorithmes de la STL
Inteacutegrer le deacuteplacement dans les membres speacuteciaux
A retenir
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
Le standard C++
httpwwwopen-stdorgjtc1sc22wg21docspapers2011n3337pdf
Channel 9 Going Deep (STL TR1 etc)
httpchannel9msdncomShowsGoing+Deep
Channel 9 Going Native
httpchannel9msdncomEventsGoingNativeGoingNative-2012
C++ Sessions de la Build 2011
httpchannel9msdncomEventsBUILDBUILD2011sort=statusampdirection=ascampt5B05D=c2B2Btab_sortBy_status
Whats New for Visual C++ in Visual Studio 11 Developer Preview
httpmsdnmicrosoftcomen-uslibraryhh409293(v=vs110)aspx
Blog eacutequipe VC++
httpblogsmsdncombvcblog
Pour aller plus loin
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps
Chaque semaine les DevCampsALM Azure Windows Phone HTML5 OpenDatahttpmsdnmicrosoftcomfr-frdevcamp
Teacuteleacutechargement ressources et toolkits RdV sur MSDNhttpmsdnmicrosoftcomfr-fr
Les offres agrave connaicirctre90 jours drsquoessai gratuit de Windows Azure
wwwwindowsazurefr
Jusqursquoagrave 35 de reacuteduction sur Visual Studio Pro avec lrsquoabonnement MSDN
wwwvisualstudiofr
Pour aller plus loin
10 feacutevrier
2012Live Meeting
Open Data - Deacutevelopper des applications riches avec le protocole Open
Data
16 feacutevrier
2012Live Meeting
Azure series - Deacutevelopper des applications sociales sur la plateforme
Windows Azure
17 feacutevrier
2012Live Meeting Comprendre le canvas avec Galactic et la librairie threejs
21 feacutevrier
2012Live Meeting La production automatiseacutee de code avec CodeFluent Entities
2 mars
2012Live Meeting
Comprendre et mettre en oeuvre le toolkit Azure pour Windows Phone 7
iOS et Android
6 mars
2012Live Meeting Nuget et ALM
9 mars
2012Live Meeting Kinect - Bien geacuterer la vie de son capteur
13 mars
2012Live Meeting Sharepoint series - Automatisation des tests
14 mars
2012Live Meeting
TFS Health Check - veacuterifier la bonne santeacute de votre plateforme de
deacuteveloppement
15 mars
2012Live Meeting
Azure series - Deacutevelopper pour les teacuteleacutephones les tablettes et le cloud
avec Visual Studio 2010
16 mars
2012Live Meeting
Applications METRO design - Deacutesossage en regravegle dun template METRO
javascript
20 mars
2012Live Meeting
Retour dexpeacuterience LightSwitch Optimisation de laccegraves aux donneacutees
Inteacutegration Silverlight
23 mars
2012Live Meeting OAuth - la cleacute de lutilisation des reacuteseaux sociaux dans votre application
Prochaines sessions des Dev Camps