我的目标是使用set
代替map
。我有一个Product
类,其中包含map
map<time_t, double> priceHistory;
并在函数output
void Product::output() const
{
cout << "Id: " << id << endl
<< "Price: $"
<< fixed << setprecision(2)
<< price;
// Also output price history.
cout << " (";
cout << "History:";
// USE ITERATOR TO TRAVERSE map.
for (map<time_t, double>::const_reverse_iterator iter = priceHistory.rbegin();
iter != priceHistory.rend(); iter++)
{
// ADD CODE TO DISPLAY PRICE AND TIME OF CHANGE.
// PASS TIME TO HELPER FUNCTION displayTime.
cout << " " << iter->first;
displayTime(iter->second);
}
cout << ")" << endl;
}
所以我将map
更改为:
set<time_t> priceHistory;
并将集合实现为
for (set<time_t>::const_reverse_iterator iter = priceHistory.rbegin();
iter != priceHistory.rend(); iter++)
{
// ADD CODE TO DISPLAY PRICE AND TIME OF CHANGE.
// PASS TIME TO HELPER FUNCTION displayTime.
cout << " " << *iter;
displayTime(*iter);
}
但我现在在main中定义了priceHistory的错误:
Error 1 error C2676: binary '[' : 'std::set<time_t,std::less<_Kty>,
std::allocator<_Kty>>' does not define this operator or a conversion
to a type acceptable to the predefined operator
time_t currTime = time(NULL);
priceHistory[currTime] = newPrice;
我不确定在这种情况下我的错误在哪里?
答案 0 :(得分:3)
std::map
存储键值对。
map<time_t, double> priceHistory;
这意味着您可以在指定时间存储价格。
std::set
仅存储密钥。
set<time_t> priceHistory;
这意味着您现在只能存储时间。
你不能这样做:
priceHistory[currTime] = newPrice;
这将有效:
priceHistory.insert(currTime);
如果您仍然坚持使用std :: set,请创建一对{time,price}并将其保留在set中。
set<pair<time_t,double> > priceHistory;
如果你想进行一些数学运算,如联合,交集等, std::set
将是一个不错的选择。
标题<algorithm>
但是如果你想要一个非常快速的键值查找,请考虑使用unordered_map(hashtable)