Ich konvertiere einen Algorithmus von C# nach C++. Ein kleiner Teil des Algorithmus besteht darin, Durchschnittswerte für bestimmte Bereiche in einem Wörterbuch zu berechnen.
Die Daten im Wörterbuch sind folgendermaßen gespeichert:
Index Wert
1 10
3 28
290 78
1110 90
Ich muss den Durchschnittswert aller Werte mit einem Index berechnen, der kleiner als eine bestimmte Zahl ist, und aller Indexwerte, die größer als eine bestimmte Zahl sind. In C# mache ich es folgendermaßen:
if (dictionary.Where(x => x.Key < areaWidth).Count() > 0)
{
avgValue = (int) dictionary.Where(x => x.Key < areaWidth).Average(
x => x.Value);
}
for (var i = 0; i < line.Length; i++)
{
if (i == areaWidth)
{
avgValue = -1;
i = line.Length - areaWidth;
var rightBorder = i - areaWidth;
if (dictionary.Where(x => x.Key > (rightBorder)).Count() > 0)
{
avgValue = (int) dictionary.Where(
x => x.Key > (rightBorder)).Average(
x => x.Value);
}
}
if (line[i] < avgValue * 0.8)
{
reallyImportantValue += (avgValue - line[i]);
}
}
Ich weiß, dass das nicht sehr effizient ist und ziemlich schlechter Code, aber ich wusste, dass ich diesen Teil des Algorithmus sowieso komplett in C++ neu schreiben müsste, also habe ich mich entschieden, es schnell und schmutzig zu implementieren.
Wie auch immer, ich portiere das jetzt nach C++ und weil es auf einer mobilen Plattform laufen wird, ist die Leistung sehr wichtig. Mit meinem begrenzten C++/STL-Wissen könnte ich die Aufgabe wahrscheinlich erledigen, aber das Ergebnis wäre wahrscheinlich viel schlechter als der C#-Code.
Also, wenn du einen guten und effizienten Weg kennst, diese Aufgabe in C++ zu erledigen, sag mir bitte Bescheid.
EDIT: Vielen Dank für all eure Antworten. Wie ich in meinem Post erwähnt habe, ist mein STL-Wissen begrenzt, so dass es für mich wirklich schwer ist, eine Lösung auszuwählen, besonders da es viele verschiedene Meinungen gibt. Es wäre großartig, wenn mir jemand bei der Entscheidung helfen könnte, indem er die hier geposteten Lösungen vergleicht. Um dir etwas mehr Hintergrundinformationen zu geben:
Die Funktion wird ungefähr 500 Mal mit 1000 Werten in der Map aufgerufen. Der wichtigste Aspekt ist Stabilität, Leistung ist der zweitwichtigste.