Challenge Accepted: C++ Standard Template Library ELTE Informatikai Kar, Programozási Nyelvek és Fordítóprogramok Tanszék patakino@elte.hu Szakmai Esti Mesék
C++ Standard Template Library Felépítése konténerek: vector, set, map, stb. algoritmusok: copy, find_if, sort, stb. Előnyök Műveletigény garanciák
21 nap alatt...
Olvasnivalók
Általános nehézségek Fordítási hibaüzenetek Hordozhatósági problémák Teljesítmény csökkenés Memória szivárgás Korrupt, inkorrekt konténerek Egyéb futási idejű hibák Különös viselkedés
Fordítási hibaüzenetek std::list<int> a; std::sort( a.begin(), a.end() );
Fordítási hibaüzenetek
Fordítási hibaüzenetek C++ templates: megszorítás nélküli template <class T> const T& max( const T& a, const T& b ) { return a < b? b : a; } Concept Concept lite
Hiányzó fordítási hibaüzenetek class complex { //... public: complex( double re, double im ) { //... } }; // operator< nélkül, szokás szerint //... std::set<complex> d; // Lefordul
Hiányzó fordítási hibaüzenetek class complex { //... public: complex( double re, double im ) { //... } }; // operator< nélkül, szokás szerint //... std::set<complex> d; d.insert( complex( 1.11, 2.22 ) );
Fordítási hibaüzenet
Prófécia
Egyezőség Mikor egyezik meg két érték (a és b)? Egyenlőség: a == b Ekvivalencia: (!( a < b ) &&!( b < a ))
Rendezések struct descending { }; bool operator()( int a, int b ) const { return!( a < b ); }
Rendezések const int not_found = 404; std::set<int, descending> s; s.insert( not_found ); s.insert( not_found ); std::cout << s.size(); // 2 std::cout << s.count( not_found ); // 0 std::multiset<int, descending> m; m.insert( not_found ); m.insert( not_found ); std::cout << m.size(); // 2 std::cout << m.count( not_found ); // 0
A probléma háttere Ekvivalencia az előző rendezés szerint!(404 >= 404) &&!(404 >= 404), ami szerint a 404 nem ekvivalens a 404-gyel. A funktor nem teljesíti a szigorú részben rendezés feltételét
Algoritmusok előfeltételei/feltevései Rendezett intervallumok algoritmusai: lower_bound, upper_bound, equal_range, binary_search unique, stb. copy, transform, stb.
Keresés rendezett konténerekben std::set<int> s; int x; //... std::set<int>::iterator i = std::find( s.begin(), s.end(), x ); std::set<int>::iterator it = s.find( x );
Hiba detektálás Statikus elemzés Template metaprogramming Runtime validáció Megfontolások Compiler- és könyvtárfüggetlenség Műveletigény garanciák Külön tool vagy fordítóprogram feladat Fordítás és futási idő növekedés Könyvtári módosítást igényel-e
Téziseim Formális eszközök Fordítási idejű megoldások Futási idejű megközelítések
Visual Studio warning warning C4100: t : unreferenced formal parameter... see reference to function template instantiation void warning<copy_algorithm_without_inserter_iterator>(t) being compiled with [ T=COPY_ALGORITHM_WITHOUT_INSERTER_ITERATOR ]
g++ warning In instantiation of void warning(t) [ with T = COPY_ALGORITHM_WITHOUT_INSERTER_ITERATOR ] :... instantiated from here... warning: unused parameter t
Fordítási ellenőrzések believe-me mark transform, copy... vector<bool>, COAP find, count algoritmusok: rendezett adatszerkezeten nincs believe-me mark...
Futási idejű ellenőrzések struct descending : strict_weak_ordering<int, descending> { }; bool operator()( int a, int b ) const { return!( a < b ); }
Futási idejű ellenőrzések Funktorok tulajdonságai Másoló algoritmusok javítása Algoritmus előfeltételek stb.
Összefoglalás C++ Standard Template Library előnyök / hibalehetőségek Megközelítések statikus elemzés template metaprogramming runtime validáció