2013-10-03 80 views
1

如果我有一個std :: map和std :: unordered_map我怎麼能在double上使用指針,這樣當unordered_map更新特定鍵的double值時,這已經在std :: map中反映出來了「鍵」?map和unordered_map包含指向double的指針?

所以:

unordered_map [ 「1」] = 6原因映射[ 「1」]是6還....

+0

你可能會喜歡接受的解決方案,如果他們中的一個是有幫助的。 – goji

回答

1

也許是這樣的:

std::unordered_map<std::string, double> um; 
std::unordered_map<std::string, double*> om; 

om["1"] = &um["1"]; 

從現在*om["1"]始終是um中相應元素的值。只要確保你永遠不會從無序地圖中刪除元素。

(來源:iterator and reference invalidation rules

+0

即使重新散列也會使迭代器失效,而引用不會呢?不只是擦除。 – goji

+0

@Troy:rehashing使迭代器失效,但不引用。 (因爲它不會移動數據,但會改變迭代順序。) – rici

+0

@rici很高興知道;) – goji

4

沒有理由爲什麼你不能使用指針。

例子:

#include <iostream> 
#include <map> 
#include <unordered_map> 
#include <memory> 

int main() 
{ 
    std::unordered_map<std::string, std::shared_ptr<double>> umap; 
    std::map<std::string, std::shared_ptr<double>> omap; 

    std::shared_ptr<double> value(new double(1234.5)); 

    umap.emplace("key", value); 
    omap.emplace("key", value); 

    std::cout << "umap " << *umap["key"] << "\n"; 
    std::cout << "omap " << *omap["key"] << "\n"; 

    *umap["key"] = 9999.1; 
    std::cout << "omap " << *omap["key"] << "\n"; 
} 

輸出:

umap 1234.5 
omap 1234.5 
omap 9999.1 
相關問題