Wie verwende ich die Akkumulationsfunktion, um eine Reihe von Werten in einem Variablenarray zu summieren?


kj.arch

Ich habe an einem Programm gearbeitet, bei dem ich in der Lage sein muss, Zeilen in einem zweidimensionalen Array zu summieren, dessen Anzahl von Spalten Variablen sind. Ich sollte auch hinzufügen, dass die Zeilen in zwei Teile (Teil A und Teil B ) "aufgeteilt" sind , deren Größe von der Benutzereingabe abhängt.

Ich kann natürlich eine Zeile nur mit einer for- Schleife summieren , aber ich wollte eine elegantere Lösung, die auch im gesamten Programm einfacher einzurichten ist. Ich bin über die accumulateFunktion aus der numerischen Bibliothek gestolpert , aber alle Beispiele, die ich finden konnte, waren ausschließlich für eindimensionale Arrays.

Hier ist ein Beispiel für meinen Problemcode:

total = partNum[PART_A] + partNum[PART_B];

partStart[PART_A] = 0;
partEnd[FUNC_A] = partNum[PART_A];
partStart[PART_B] = partNum[PART_A];
partEnd[FUNC_B] = total;

double stat[5][total];
double mass_sum = 0.0

func = PART_A;

accumulate(stat[MASS][partStart[func]], stat[MASS][partStart[func]], mass_sum);

Ich erhalte jedoch einen Buildtime-Fehler, der besagt, dass:

Indirektion erfordert Zeigeroperand ('double' ungültig')

Ich gehe davon aus, dass dies ein Syntaxfehler ist, aber das Ändern der Definition von Start und Ende des Arrays hat nichts zur Behebung des Fehlers beigetragen.

Holt

Die beiden ersten Argumente von accumulatesind Iteratoren, die die Funktion verwendet, um über den Bereich zu iterieren, aber Sie übergeben das tatsächliche Element des Arrays

Iterator in C++ ist ein Konzept, das erfordert, dass bestimmte Operationen für Ihr Objekt gültig sind, wie im Standard definiert. Zum Beispiel Zeigertypen in der Regel die passen LegacyRandomAccessIterator , was bedeutet , dass Sie im Grunde sie als Array-ähnliches Objekt verwenden können (Sie können sie mit erhöhen ++, können Sie indirekt sie mit *, können Sie ein Element in der Position Zugriff imit [], etc.). Ich werde nicht auf alle Details eingehen, was Iteratoren in C++ sind, da es sich um ein ganzes Thema handelt und Sie viele Referenzen finden können, insbesondere auf den beiden von mir bereitgestellten Links.

Zurück zu Ihrem Problem, Sie möchten accumulatedem Anfang und dem Ende Ihrer Zeile oder dem Anfang und dem Ende Ihrer Unterbereiche einen Iterator geben . Dazu gibt es zwei Möglichkeiten:

  • Nehmen Sie die Adresse des Elements stat[MASS][partStart[func]], dh , &stat[MASS][partStart[func]]die Ihnen den Anfang des Bereichs und dann &stat[MASS][partEnd[func]]das Ende des Bereichs gibt. Dies funktioniert, weil statas ist double stat[5][total]und der Zugriffsoperator ( []) Ihnen eine Referenz (a double&) gibt, deren Adresse Sie übernehmen können, und die Elemente in der Zeile im Speicher zusammenhängen (das würde für eine Spalte nicht funktionieren).
  • Verwenden Sie stat[MASS] + partStart[func]und stat[MASS] + partEnd[func]. In diesem Fall nehmen Sie den Anfang der Zeile ( stat[MASS]), der (oder implizit in) ein Zeiger auf double ( double*) ist, und erhöhen diesen Zeiger um partStart[func]oder partEnd[func], wodurch Sie die Adressen der gewünschten Elemente in der Zeile erhalten.

Also im Grunde genommen:

std::accumulate(&stat[MASS][partStart[func]], &stat[MASS][partEndfunc]], mass_sum);
// or
std::accumulate(stat[MASS] + partStart[func], stat[MASS] + partEnd[func], mass_sum);

Verwandte Artikel