Effective Analysis Programming Part 1
From Gridkaschool
Contents
Literature on C++
books
- The C++ Programming Language, Bjarne Stroustrup
- Effective C++, Scott Meyers
- More Effective C++: 35 New Ways to Improve Your Programs and Designs
- Modern C++ Design, Andrei Alexandrescu
- The C++ Standard Library, Nicolai M. Josuttis
- C++ Templates, David Vanevoorde, Nicolai M. Josuttis
- Exceptional C++, Herb Sutter
- More Exceptional C++, Herb Sutter
links
- http://www.stroustrup.com/bs_faq2.html
- http://www.cplusplus.com/reference/
- http://www.parashift.com/c++-faq/
- http://herbsutter.com/gotw/
Standard Template Library
map
exercise 1: insert
#include <map> #include <iostream> using std::map; using std::cout; using std::endl; struct A { A(): _p(0) { cout<<"A::A()"<<endl; } A(int p): _p(p) { cout<<"A::A(int p)"<<endl; } A& operator=(A const& other) { _p=other._p; cout<<"A& A::operator=A const& other)"<<endl; return *this; } int _p; }; int main() { map<int,A> m; m[1]=A(42); m.insert(std::make_pair(4,A(11))); for(std::pair<int,A> p: m) { cout<<"m["<<p.first<<"]: "<<p.second._p<<'\n'; } return 0; }
- What is the output of this code, i.e. which constructors get called?
- What is the advantage of insert?
exercise 2: user-defind comparison
#include <map> #include <iostream> #include <complex> #include <cmath> using std::map; using std::cout; using std::endl; using std::complex; namespace gks { struct complex_compare { bool operator()(complex<double> const& a, complex<double> const& b) { return std::real(a)!=std::real(b) ? std::real(a)<std::real(b) : std::imag(a)<std::imag(b); } }; /* exponential of complex number; caches results in map */ complex<double> exp(complex<double> const& x) { static map<complex<double>,complex<double>,complex_compare> cache; map<complex<double>,complex<double>,complex_compare>::iterator it=cache.find(x); return it==cache.end() ? cache[x]=std::exp(x) : it->second; } } int main() { complex<double> z1 = gks::exp(complex<double>(0.,1.)); complex<double> z2 = gks::exp(complex<double>(1.,1.)); complex<double> z3 = gks::exp(complex<double>(0.,1.)); complex<double> z4 = gks::exp(complex<double>(0.,-1.)); cout<<z1<<endl; cout<<z2<<endl; cout<<z3<<endl; cout<<z4<<endl; return 0; }
- Familiarize yourself with the class std::complex representing complex numbers (http://www.cplusplus.com/reference/complex/)
- Why is the std::map cache static?
- What is returned by map::find? See http://www.cplusplus.com/reference/map/map/find/
- What is the size of the map cache at the end of the programm?
Complex numbers do not fulfill any order relation. That's why the less-than operator
- There is a problem with the implementation of complex_compare::operator(). Can you find it?
- The comparison of complex numbers defined in the class complex_compare does not fulfill the criteria of a order relation. Why? (optional math question)