我正在尝试使用动态编程来实现斐波那契。这是我的.h文件:
#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'
在我看来,这是一个非常简单的错误,但我不确定这些东西是什么意思。有人可以帮助我,我真的很想掌握这种语言,看起来它会非常有用。
答案 0 :(得分:1)
据我所知,搜索地图值的唯一方法是迭代。如果您正在尝试查看密钥是否存在,那么您可以使用
map.find()
答案 1 :(得分: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
中的相应值会自动更新
答案 2 :(得分:0)
valueFinder
只是std::map<int,int>
类型的迭代器,它与该类型的任何实例都没有关联。
要将它与实例(此处为fibonacci_storage)相关联,您必须将其分配给该实例,即
valueFinder = fibonacci_storage.begin();
可以使用source
查找元素valueFinder = fibonacci_storage.find(value);
其中value是您要搜索的密钥。现在,检查值是否在地图中:
if( valueFinder != fibonacci_storage.end() )
{
// value found
}
你已经完成了。
答案 3 :(得分:0)
要检查C ++映射中是否存在密钥,可以使用std :: map :: count。它返回0(密钥不存在)或1(密钥存在)。
要检查C ++映射中是否存在值,我认为您必须迭代所有对。
看来您的问题更多的是关于编译错误。
上面的代码中有几个问题。