2015-06-19 88 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基本上是無用的,因爲它不是對象的成員,因此每次調用斐波那契方法都有一個不同的變量實例。
  • 從技術上講,您不必迭代,因爲斐波那契數列的指數是地圖中的鍵,並且斐波那契數列的值是地圖中的數值。