C ++地图问题

时间:2009-09-27 20:38:25

标签: c++ algorithm map

我有一个基于位置的积分算法。 (也就是说,算法的输出基于曲线位置,并且每个结果都受到先前结果的值的影响)。

为了避免每次重新计算,我想以给定的采样率预先计算,然后执行查找并返回预先计算的结果(如果我直接落在一个上),或者在两个相邻结果之间进行插值

对于我来说,这对F#或C#来说是微不足道的,但我的C ++非常生疏,(甚至没有那么好)。

地图是否使用正确的构造?你能不能给我一个如何进行查询的例子呢? (我想在milimetres中预先计算,这意味着键可能是一个int,值将是一个双倍)。

更新好的,也许我需要的是一个排序字典。 (卷起袖子),伪代码:

//Initialisation
fun MyFunction(int position, double previousresult) returns double {/*etc*/};
double lastresult = 0.0;
for(int s = startposition to endposition by sampledist)
{
    lastresult = MyFunction(s, lastresult);
    MapOrWhatever.Add(s, lastresult);
}
//Using for lookup
fun GetValueAtPosition(int position) returns double
{
    CheckPositionIsInRangeElseException(position);
    if(MapOrWhatever.ContainsKey(position)) 
        return MapOrWhatever[position];
    else
    {
        int i = 0;
        //or possibly something clever with position % sampledist...
        while(MapOrWhatever.Keys[i] < position) i+=sampledist;
        return Interpolate(MapOrWhatever, i, i+sampledist, position);
    }
}

想想......也许如果我保持一个恒定的采样员,我可以使用一个数组并将其编入索引......

6 个答案:

答案 0 :(得分:4)

如果保证您的值不是连续的,那么std :: map对于memoization来说听起来很合理。

#include <map>

// ...

std::map<int, double> memo;
memo.insert(std::make_pair(5, 0.5));
double x = memo[5]; // x == 0.5  

答案 1 :(得分:2)

如果你考虑一张地图,也要考虑一个矢量。对于在应用程序运行期间未发生太大变化(甚至根本没有变化)的值,预​​先排序的std::vector< std::pair<Key,Value> >(具有O(N)查找)通常比查找{std::map<key,Value>查找更快1}}(使用O(log N)查找) - 尽管有所有理论。

你需要尝试和衡量。

答案 2 :(得分:1)

只要速度不是太关键,

std :: map可能就好了。如果查找速度很关键,你可以尝试上面提到的向量,直接找到你需要的元素(不要使用二进制搜索,因为你可以从位置计算索引)。类似的东西:

vector<double> stored;

// store the values in the vector
double lastresult = 0.0;
for(int s = startposition, index = 0; s <= endposition; s+=sampledist, ++index)
{
    lastresult = MyFunction(s, lastresult);
    stored[index] = lastresult;
}

//then to lookup
double GetValueAtPosition(int position) returns double
{
 int index = (position - startposition) / sampledist;
 lower = stored[index];
 upper = stored[index+1];
 return interpolate(lower, upper, position);
}

答案 3 :(得分:0)

请参阅我的评论,但这里是地图文档

http://www.cplusplus.com/reference/stl/map/

和另一张海报没有提及的重要说明是,如果你使用[]来搜索地图中不存在的关键字,地图会创建一个对象,以便那里有东西。

编辑:请参阅此处的文档以获取此信息http://msdn.microsoft.com/en-us/library/fe72hft9%28VS.80%29.aspx

而是使用find(),它返回一个迭代器。然后针对map.end()测试这个迭代器,如果它相等则没有匹配。

答案 4 :(得分:0)

参考:http://www.cplusplus.com/reference/stl/map/

您可以使用地图,

typedef std::map<int,const double> mapType;

地图的表现如下:

map :: find 复杂 对数大小。

谨防地图中的Operator []

如果x匹配容器中元素的键,则该函数返回对其映射值的引用。

如果x与容器中任何元素的键不匹配,则该函数会使用该键插入一个新元素,并返回对其映射值的引用。请注意,即使没有为元素指定映射值(使用其默认构造函数构造元素),这也会始终将映射大小增加1。

答案 5 :(得分:-1)

HASH_MAP是用于快速查找的最佳STL算法,而不是任何其他算法。但是,填充比map或vector需要更多的时间,并且它没有排序。任何值搜索都需要一段时间。

std::hash_map<int, double,> memo;
memo.insert(std::make_pair(5, 0.5));
memo.insert(std::make_pair(7,0.8));
.
.
.
hash_map<int,double>::iterator cur  = memo.find(5);
hash_map<int,double>::iterator prev = cur;
hash_map<int,double>::iterator next = cur;    
  ++next;
  --prev;

用(* next).second(),(* prev).second()值插值当前值..