2012-11-18 79 views
0
class foo{ 

public: 
    int a, b, c; 
    double val; 

    foo(int a){ 
     ... 
    } 

... 
} 

運營商現在我想做的事:重載[]在C++ STL地圖

map <foo*, double> mymap; 

foo fa(2); 
foo fb(4); 

mymap[fa] = 1.0; 
mymap[fb] = 2.0; 

顯然,我得到的[]是未定義Foo類型的錯誤。但是,我該如何重載這個操作符?就此而言,我如何獲得指向foo的指針?因爲我假設它沒有定義,因爲foo是一個自定義類

+0

「我如何獲得指針」應該是C++教科書或課程材料的一部分。 「爲什麼我需要一個指針」是一個完全不同的問題:-) –

回答

1

沒有必要在這裏加載任何東西。您的地圖期望指向foo,因此您需要將指針傳遞給foo。您可以修復你的代碼是這樣的:

mymap[&fa] = 1.0; 
mymap[&fb] = 2.0; 

當心你必須絕對確保foo對象將生活,只要或大於地圖長,否則後者將結束與懸擺指針。舉例來說,這可能會流下眼淚:

map <foo*, double> mymap; 

{ 
    foo fa(2); 
    foo fb(4); 
    mymap[&fa] = 1.0; 
    mymap[&fb] = 2.0; 
} // fa and fb cease to exist 

// state of mymap is messed up here. 
+2

然而,通過引用操作符插入指向本地對象的指針通常是一個非常糟糕的主意。順便說一句,我知道地圖是在相同的範圍內的對象,所以它不應該是一個問題,但如果用法改變它真的需要考慮 – emartel

+0

@emartel地圖和'foos'在相同的範圍內,所以它是相當安全的。 – juanchopanza

+2

是的,這就是爲什麼我編輯我的評論,指出我知道這一點,但如果OP沒有意識到,他知道 – emartel

3

關鍵必須是foo*。所以,你需要這樣寫:

mymap[&fa] = 1.0; 
mymap[&fb] = 2.0; 

但請記住,如果fafb是本地對象,那麼當你從函數返回,他們將被銷燬。所以你不應該返回函數mymap,因爲一旦函數返回,用作鍵的對象就不存在了。

0

保持和使用指向地圖內某些本地對象的指針可能是extemely危險。首先,當對象超出範圍時,您可能會通過取消引用std::map鍵來使應用程序崩潰。此外,它真的很難使用,並且在大多數情況下不是程序員的意圖。你的情況:

auto it = mymap.find(&foo(2)) 

不會編譯:

foo fc(2); 
auto it = mymap.find(&fc); 

將找不到容器內任意值(fa具有相同的價值,但不同的指針)。它真的是你想要的嗎?

這就是爲什麼我會建議重新定義您的std::mapstd::map<foo, double> mymap;這將保持和比較foo的價值。要使其工作,您需要執行foo::operator<()或提供您自己的求解算法作爲模板參數std::map。第一種情況如下:

class foo { 
    int a, b, c; 
    double val; 
public: 
    foo(int a) {} 
    bool operator<(const foo &other) const 
    { return a < other.a && b < other.b && c < other.c; } 
}; 


int main() 
{ 
    std::map<foo, double> mymap; 

    foo fa(2); 
    foo fb(4); 

    mymap[fa] = 1.0; 
    mymap[fb] = 2.0; 

    auto it = mymap.find(foo(2)); 
}