006
15.03.2006, 20:28 Uhr
virtual
Sexiest Bit alive (Operator)
|
ad 1) Hängt davon ab. Soweit ich verstanden habe, kennst Du zwar die Obergrenze der Möglichen Elemente im Array/Vector, jedoch nicht zwingend die tatsächliche. Wenn dem so ist, dann ist ein STL Container ala Vector die bessere Wahl, weil Du sonst überall die tatsächliche Anzahl der Arrayelemente mit an die funktion übergeben müsstest. Das ist sehr umständlich. Und da ein vector ja intern auch einfach nur ein Array ist, ist durch den Umstief auf ein "echtes" Array kein deutlicher Performancegewinn zu erwarten.
ad 2) Zwar verhalten sich Iteratoren wie Pointer, aber Iteratoren haben in C++ schon eine gewisse Bedeutung. Man kann damit seine sachen zaubern. Nehmen wir mal Deine Routine, die ich ja schon auf Iteratoren umgestellt habe. Der nächste logische Schritt wäre, Coderedundanzen zu vermeiden und einfach die STL machen lassen. Denn sowas wie Aufsummieren kann die ja schon. Ich schreibe also nochmal um:
C++: |
// Nur zur vereinfachung typedef std::vector<double> double_vector; typedef double_vector::const_iterator const_double_iterator;
// Deine Ursprüngliche Funktion inline double calc_sumqua(const double_vector& col){ // numeric includieren! return inner_product(v.begin(), v.end(), v.begin(), 0.0); // Unter der Annahmen, daß sqr(v)==v*v ist }
|
Letztlich würde ich das ganze dann also sowieso schreiben als:
C++: |
template<typename I> inline double calc_sumqua(I begin, I end){ return inner_product(begin, end, begin, 0.0); }
|
Und kann das dann immer gleich anwenden, egal, ob ich mich nun für ein Array, einen Vector einer Liste entscheide:
C++: |
std::list<double> l; std::vector<double v; double a[..];
calc_sumqua(l.begin(), l.end()); // Aufruf liste calc_sumqua(v.begin(), v.end()); // Aufruf vector calc_sumqua(a, a+sizeof(a)/sizeof(*a)); // Aufruf Array
|
In diesem Zusammenhang sei noch darauf hingewiesen, daß es mit valarrays einen weiteren, auf numerische Operationen optimierten Container gibt. -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) |