Difference between revisions of "Effective Analysis Programming Part 1"

From Gridkaschool
m
(exercise 2: user-defind comparison)
Line 93: Line 93:
 
return 0;
 
return 0;
 
}
 
}
  +
* Why is the std::map cache static?
  +
* What is the size of the map cache at the end of the programm?
  +
* 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)

Revision as of 11:21, 16 August 2013

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

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;
}
  • Why is the std::map cache static?
  • What is the size of the map cache at the end of the programm?
  • 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)