Konwertuję algorytm z C# na C++. Niewielką częścią algorytmu jest obliczanie średnich wartości dla niektórych obszarów w słowniku.Wydajny sposób obliczania wartości średniej z rozłącznych podzakresów mapy STL
Dane w słowniku przechowywane są w następujący sposób:
Index Value
1 10
3 28
290 78
1110 90
muszę obliczyć średnią wartość wszystkich wartości z indeksem mniejszej niż określona liczba i wszystko wskaźnik wartości większe od pewnej liczby . W języku C# zrobić to w następujący sposób:
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]);
}
}
wiem, że nie jest bardzo wydajny i kod bardzo brzydko, ale wiedziałem, że muszę całkowicie przepisać tej części algorytmu w C++ tak, więc postanowiłem zaimplementować to szybko i brudno.
W każdym razie teraz przesyłam to do C++ i ponieważ działa na platformie mobilnej, wydajność jest bardzo ważna. Z moją ograniczoną znajomością C++/STL mogłem najprawdopodobniej wykonać zadanie, ale wynik byłby prawdopodobnie znacznie gorszy niż kod C#.
Więc jeśli znasz dobry i skuteczny sposób wykonania tego zadania w C++, proszę powiedz mi.
EDYCJA: Dziękuję za wszystkie odpowiedzi. Jak wspomniałem w moim poście, moja wiedza STL jest ograniczona, więc bardzo trudno jest mi wybrać rozwiązanie, zwłaszcza, że istnieje wiele różnych opinii. Byłoby wspaniale, gdyby ktoś mógł mi pomóc w podjęciu decyzji, porównując przedstawione tutaj rozwiązania. Aby podać trochę więcej informacji podstawowych:
Funkcja zostanie wywołana około 500 razy z 1000 wartości na mapie. Najważniejszym aspektem jest stabilność, wydajność jest najważniejsza.
Z jakimi częściami masz problemy? –
Gdzie jest STL w tym? – gregg
@gregg Myślę, że odpowiedź będzie używać ze STL. –
Flexo