簡體   English   中英

map 帶雙鍵 C++

[英]map with double keys C++

我有不同的股票及其價格,我想將它們存儲在例如 std::map 或 std::unordered_map 中:

struct Stock
{
    ...
};

using stock_price_t = double;

std::map<stock_price_t, Stock> ordered_stocks;
std::unordered_map<stock_price_t, Stock> unordered_stocks;

在字典中使用雙鍵或存在更好的解決方案是個好主意嗎?

std::map使用double s 作為鍵沒有問題。 它使用<來比較鍵,當!(a < b) && !(b < a)時,兩個鍵是等效的。 沒關系。 當您期望浮點數准確而實際上並非如此時,問題確實會出現。

例如:

std::map<double,int> m{{0.3,0},{1.0,2},{2.0,2},{3.0,3}};
for (const auto& e : m) std::cout << e.first << " " << e.second << "\n";

Output 是:

0.3 0
1 2
2 2
3 3

但現在考慮一下:

auto it = m.find(0.1 + 0.2);
if (it == m.end()) std::cout << "not found\n";

搜索0.1 + 0.2不會找到關鍵0.3 ,因為double s 不准確,而 output 是

not found

TL;DR:不要使用浮點數作為價格或貨幣。 當您需要美分價格時,請使用int cents:

std::map<int, Stock> ordered_stocks;
for (const auto& e : ordered_stocks) {
      std::cout << "dollars: " << e.first / 100 << "\n";
      std::cout << "stock: " << e.second << "\n";
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM