【发布时间】:2010-11-03 17:46:29
【问题描述】:
我正在将算法从 C# 转换为 C++。该算法的一小部分是计算字典中某些区域的平均值。
字典中的数据存储方式如下:
Index Value
1 10
3 28
290 78
1110 90
我需要计算所有索引值小于某个数字的值和所有大于某个数字的索引值的平均值。在 C# 中,我使用以下方式:
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]);
}
}
我知道这不是很有效且相当糟糕的代码,但我知道无论如何我都必须用 C++ 完全重写这部分算法,所以我决定快速而肮脏地实现它。
无论如何,我现在将它移植到 C++,因为它将在移动平台上运行,所以性能非常重要。以我有限的 C++/STL 知识,我很可能完成这项工作,但结果可能比 C# 代码差得多。
所以如果你知道用 C++ 完成这项任务的好方法,请告诉我。
编辑:感谢您的所有回答。正如我在帖子中提到的,我的 STL 知识是有限的,所以我很难选择一个解决方案,特别是因为有很多不同的意见。如果有人可以通过比较此处发布的解决方案来帮助我做出决定,那就太好了。为您提供更多背景信息:
该函数将被调用大约 500 次,地图中有 1000 个值。最重要的方面是稳定性,性能是第二重要的。
【问题讨论】:
-
您的哪些部分有问题?
-
@gregg 我认为答案应该是使用来自 STL 的
。 -
使用地图计算两个平均值。我可以遍历所有值并计算平均值,但我真的怀疑这是最好的解决方案。
-
这里有一个链接,你可以在这里提高你的C++/STL知识cplusplus.com/reference/stl/map