用双键映射 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;
在字典中使用双键是个好主意还是有更好的解决方案?
A std::map
使用 double
作为键没有问题。它使用 <
来比较键,当 !(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";
输出为:
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
不准确,输出为
not found
TL;DR:不要对价格或货币使用浮点数。当您需要美分价格时,请使用 int
美分:
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";
}
我有不同的股票及其价格,我想将它们存储在,例如 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;
在字典中使用双键是个好主意还是有更好的解决方案?
A std::map
使用 double
作为键没有问题。它使用 <
来比较键,当 !(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";
输出为:
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
不准确,输出为
not found
TL;DR:不要对价格或货币使用浮点数。当您需要美分价格时,请使用 int
美分:
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";
}