2015-06-19 94 views
0

我试图使用动态编程来实现斐波那契。这是我的.h文件:如何检查C++映射中是否存在值

#ifndef DYNAMICPROGRAMMING_H 
#define DYNAMICPROGRAMMING_H 
#include <map> 

class DynamicProgramming 
{ 
    public: 
     DynamicProgramming(); 
     ~DynamicProgramming(); 
     int Fibonacci(int value); 
    private: 
}; 

#endif // DYNAMICPROGRAMMING_H 

下面是我的.cpp文件中的相关部分:

int DynamicProgramming::Fibonacci(int value) 
{ 
    int result; 
    std::map<int,int>fibonacci_storage; 
    std::map<int,int>::iterator valueFinder; 
    if (value == valueFinder->second){ 
     return fibonacci_storage[value]; 
    } 

    if (value <= 2){ 
     result = 1; 
    } else { 
     result = Fibonacci(value - 1) + Fibonacci(value - 2); 
    } 
    fibonacci_storage.insert(std::pair<int,int>(value,result)); 
    return result; 
} 

我的错误是从该行未来:if (value == valueFinder->second)。这就是它说:

could not convert '((DynamicProgramming*)this)->DynamicProgramming::fibonacci_storage.std::map<_Key, _Tp, _Compare, _Alloc>::find [with _Key = int, _Tp = int, _Compare = std::less<int>, _Alloc = std::allocator<std::pair<const int, int> >, std::map<_Key, _Tp, _Compare, _Alloc>::iterator = std::_Rb_tree_iterator<std::pair<const int, int> >, std::map<_Key, _Tp, _Compare, _Alloc>::key_type = int]((*(const key_type*)(& value)))' from 'std::map<int, int>::iterator {aka std::_Rb_tree_iterator<std::pair<const int, int> >}' to 'bool'

它看起来对我来说,这是一个很简单的错误,但我不知道所有的东西手段。有人可以帮助我,我真的很想掌握这种语言,它似乎是非常有用的。

+1

您的错误与您的代码不符。 –

回答

0

valueFinder只是对于没有关联到该类型的任何实例的std::map<int,int>类型的迭代器。
它(这里fibonacci_storage)即

valueFinder = fibonacci_storage.begin(); 

找到元素可以source

valueFinder = fibonacci_storage.find(value); 

来完成,其中值是关键,你联想到一个实例,你必须将其分配给该实例,正在寻找。现在你检查是否值在地图上:

if(valueFinder != fibonacci_storage.end()) 
{ 
    // value found 
} 

你就完成了。

+0

这样做了,谢谢。 – Argus

1

据我所知,通过映射值来搜索的唯一方法就是遍历。如果您试图查看密钥是否存在,则可以使用

map.find() 
+0

这很有道理。但是,为什么OP得到错误? –

+0

如果你只想知道密钥是否存在,我会推荐map.find(),如果你需要迭代器到元素和map.count()。 –

+0

不需要将迭代器设置为地图的开头? – SirParselot

1

您的代码有几个问题。

最大的不是语法,它是缓存的位置:因为fibonacci_storage是一个局部变量,所以每个递归调用Fibonacci都会有自己的缓存,这意味着根本没有缓存。您需要将fibonacci_storage移动到您班级的private:部分。

至于固定语法变,用于实现高速缓存的搜索的共同关键是要的[]将结果存储在一个参考,这样的:

int DynamicProgramming::Fibonacci(int value) 
{ 
    int &result = fibonacci_storage[value]; 
    if (result) { 
     return result; 
    } 
    if (value <= 2){ 
     return (result = 1); 
    } 
    return (result = Fibonacci(value - 1) + Fibonacci(value - 2)); 
} 

可变result保持对所述值的参考在map的内部,因此当您在两个assign-return语句之一中更新它时,map中的相应值会自动更新。

Demo.

+1

一个很好的窍门,没有很好地描述。运营商[]在其他情况下可能会令人讨厌。 –

0

要检查的关键在C++的地图存在,您可以使用std ::地图::计数。它返回0(密钥不存在)或1(密钥存在)。

要检查是否在C++地图存在价值,我认为你必须遍历所有对。

看来你的问题更多的是关于编译错误。

上面的代码中有几个问题。

  • 你的迭代器valueFinder没有迭代任何东西。要迭代,您需要在地图上调用begin()方法。
  • 变量fibonacci_storage基本上是无用的,因为它不是对象的成员,因此每次调用斐波那契方法都有一个不同的变量实例。
  • 从技术上讲,您不必迭代,因为斐波那契数列的指数是地图中的键,并且斐波那契数列的值是地图中的数值。