C++ C++;地图问题

C++ C++;地图问题,c++,algorithm,map,C++,Algorithm,Map,我有一个基于积分位置的算法。(也就是说,算法的输出基于曲线位置,并且每个结果都受先前结果的值的影响) 为了避免每次重新计算,我希望以给定的采样率进行预计算,然后执行查找,或者返回预计算的结果(如果我直接在其中一个上着陆),或者在两个相邻的结果之间进行插值 这对我来说是微不足道的,但是我的C++是很生锈的(甚至从来没有那么好)。 地图是正确的构造吗?你能给我举个例子,说明我是如何进行查找的吗?(我正在考虑以毫米为单位进行预计算,这意味着键可以是int,值可以是double) 更新好的,也许我需要的

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

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

<>这对我来说是微不足道的,但是我的C++是很生锈的(甚至从来没有那么好)。 地图是正确的构造吗?你能给我举个例子,说明我是如何进行查找的吗?(我正在考虑以毫米为单位进行预计算,这意味着键可以是int,值可以是double)

更新好的,也许我需要的是一本分类词典。(卷起袖子),伪代码:

//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);
    }
}
//初始化
fun MyFunction(int位置,double previousresult)返回double{/*etc*/};
双lastresult=0.0;
for(int s=通过sampledist从起始位置到结束位置)
{
lastresult=MyFunction(s,lastresult);
MapOrWhatever.Add(s,lastresult);
}
//用于查找
fun GetValueAtPosition(int位置)返回双精度
{
检查位置IsInRangelSeException(位置);
if(地图或任何容器(位置))
返回地图或任何位置;
其他的
{
int i=0;
//或者可能是位置%sampledist的聪明之处。。。
而(maporWhather.Keys[i]

认为。。。也许如果我保持一个常量sampledist,我可以使用一个数组并对它进行索引…

如果保证你的值不是连续的,那么std::map在这里存储起来是合理的

#include <map>

// ...

std::map<int, double> memo;
memo.insert(std::make_pair(5, 0.5));
double x = memo[5]; // x == 0.5  
#包括
// ...
地图备忘录;
备注.插入(标准:制作成对(5,0.5));
双x=备忘录[5];//x==0.5

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

另一张海报没有提到的重要注意事项是,如果您使用[]搜索地图中不存在的键,地图将创建一个对象,这样就有了一些东西

编辑:有关此信息,请参见此处的文档


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

如果你考虑一个映射,也要考虑向量。对于在应用程序运行期间没有太大变化(甚至根本没有变化)的值,预先排序的

std::vector
(使用
O(N)
lookup)比使用
std::map
(使用
O(logn)
查找)执行查找的速度更快,尽管有这些理论


你需要尝试和测量

哈希映射是最适合快速查找的STL算法。但是,填充要比映射或向量花费多一点时间,而且它也不会被排序。任何值搜索都需要固定的时间

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;
std::hash\u映射备忘录;
备注.插入(标准:制作成对(5,0.5));
备注.插入(标准:制作成对(7,0.8));
.
.
.
hash_map::迭代器cur=memo.find(5);
hash_map::迭代器prev=cur;
hash_map::iterator next=cur;
++其次;
--上;
用(*next).second(),(*prev).second()值插入当前值。

参考:

你可以用地图

typedef std::map<int,const double> mapType;
typedef std::map mapType;
地图的性能如下所示:

map::find 复杂性 大小是对数的

小心地图中的操作员[]

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


如果x与容器中任何元素的键不匹配,则函数将插入具有该键的新元素,并返回对其映射值的引用。请注意,即使没有为元素指定映射值(元素是使用其默认构造函数构造的),这始终会将贴图大小增加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);
}
矢量存储;
//将值存储在向量中
双lastresult=0.0;

对于(int s=startposition,index=0;s)尽管下面的答案获得了很高的票数,但我不相信您已经提供了足够的关于这个问题的信息。我不确定您是在描述一个记忆问题还是一个字符串索引问题。如果您需要完整的上下文(即制作波形),那么这个问题不是“使用地图??”问题在于,您需要找到一种有效存储和搜索整个字符串的方法,而仅仅存储值在这里对您没有帮助…基本上,我需要更多信息。不知道是否还有其他人需要。现在,我建议您检查后缀树,看看这是否更接近您的需要。同意San Jacinto的观点。可以提供帮助的一点是如果你确信C语言中的解决方案是什么(C语言比C++更接近C++),你将如何实现它?你将如何迭代你的树(在2D?)要确定给定点是否有解决方案?查找最接近的两个预计算点以用于插值?地图非常适合直接搜索,但它只在一维中搜索(无论您提供的排序算法如何使用)关键字:“如果不连续”…听起来是这样的。而且,只是为了分析一下…这个短语应该是“保证不连续”而且,我想我们都忽略了我们的意思是“连续”而不是“连续”这只适用于小N—这里与理论没有冲突,因为大O表示法描述了高NIf的相对性能—它是预排序的,您使用的查找方法利用了