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 werden auf folgende Weise gespeichert:
Index Value
1 10
3 28
290 78
1110 90
Ich muss den Durchschnittswert aller Werte mit einem Index kleiner als eine bestimmte Zahl und aller Indexwerte größer als eine bestimmte Zahl berechnen. In C# mache ich das auf die folgende Weise:
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ß, das ist nicht sehr effizient und ziemlich mieser Code, aber ich wusste, dass ich diesen Teil des Algorithmus sowieso komplett in C++ umschreiben müsste, also beschloss ich, ihn schnell und schmutzig zu implementieren.
Jedenfalls portiere ich es jetzt nach C++ und da es auf einer mobilen Plattform laufen wird, ist die Leistung sehr wichtig. Mit meinen begrenzten C++/STL-Kenntnissen könnte ich höchstwahrscheinlich die Aufgabe erledigen, aber das Ergebnis wäre wahrscheinlich viel schlechter als der C#-Code.
Wenn Sie also einen guten und effizienten Weg kennen, diese Aufgabe in C++ zu bewältigen, sagen Sie es mir bitte.
EDIT: Ich danke Ihnen für alle Antworten. Wie ich in meinem Beitrag erwähnt habe, sind meine STL-Kenntnisse begrenzt, so dass es wirklich schwer für mich ist, eine Lösung zu wählen, zumal es viele verschiedene Meinungen gibt. Es wäre toll, wenn mir jemand bei der Entscheidung helfen könnte, indem er die hier geposteten Lösungen vergleicht. Um Ihnen ein wenig mehr Hintergrundinformationen zu geben:
Die Funktion wird etwa 500 Mal mit 1000 Werten in der Karte aufgerufen. Der wichtigste Aspekt ist die Stabilität, die Leistung ist der zweitwichtigste.