我想爲一組浮點值指定一個唯一對象。這樣做,我正在探索兩種不同的選擇:在C++中緩存浮點值
第一個選項是維持類中的靜態哈希表(std::unordered_map<double,Foo*>
),並避免所有重複的在第一時間創建。這意味着,不是調用構造函數,而是檢查值是否已經存在於散列中,如果是,則重新使用它。我還需要從析構函數中的哈希映射中刪除值。
第二種選擇是在創建過程中允許重複值,只嘗試一次對它們進行排序,並在所有值創建後檢測重複項。我想我會需要散列地圖進行排序。或者,一個有序的地圖('std :: map)是否也能正常工作?
是否有理由期望第一個選項(我更喜歡)在任何情況下都會比較慢?也就是說,如果我一次執行所有條目而不是一次執行一個條目,會發現重複條目要快得多嗎?
我知道當兌現浮點數時的陷阱,並且會阻止將非數字和無窮大添加到地圖中。對於相同的常量,一些重複的條目也不是問題,如果發生少數條目 - 它只會導致非常小的速度損失。
對於浮點數的*大*陷阱呢?他們不是確切的?你如何處理? – jalf 2012-02-17 11:51:37
@jalf浮點數是確切的。確切的值可能不是您所期望或想要的值,但每個浮點數都具有確切的值。關於將它們用作散列表中的鍵,它取決於數字的來源。 – 2012-02-17 12:01:22
嗯,我的'Foo'對象將包含浮點數的副本,所以我可以簡單地檢查,如果這個數字匹配散列鍵的。再次,一些重複的條目(不會很多)不是一個嚴重的問題。 – Joel 2012-02-17 12:10:18