将地图转换为在STL中设置

时间:2015-10-02 05:19:08

标签: c++ stl

我的目标是使用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;

我不确定在这种情况下我的错误在哪里?

1 个答案:

答案 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)