[英]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.