2015-10-02 3 views
1

Моя цель - использовать set вместо map. У меня есть Product класс, содержащий mapПреобразование карты в набор STL

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); 
    } 

, но сейчас я получаю сообщение об ошибке в основном, где определена 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; 

Я не уверен, где моя ошибка (ы) в этом случае?

+4

'std :: map' сохраняет {ключ, значение} пары. 'std :: set' хранит только ключи. Переключившись на 'std :: set', у вас больше нет места для хранения' newPrice'. Так что либо держите карту, либо отбрасывайте 'newPrice', как в' priceHistory.insert (currTime) '(конечно, без цен, это не будет большой ценой). –

+1

«Моя цель - использовать набор вместо карты» - это как сказать «моя цель - использовать молот вместо отвертки» - они разные инструменты для разных задач, либо вы меняете даже задачу, которую пытаетесь решить, либо вы будете терпеть неудачу. –

ответ

3

A std::map хранит пары ключ-значение.

map<time_t, double> priceHistory; 

Это значит, что вы можете сохранить цены в указанное время.

std::set только сохраняет ключи.

set<time_t> priceHistory; 

Это означает, что вы можете хранить только время.

Вы не можете сделать это:

priceHistory[currTime] = newPrice; 

это будет работать:

priceHistory.insert(currTime); 

Если вы по-прежнему настаиваете на использование зОго :: набора, сделать пару {время, цены} и утверждает, что в комплекте.

set<pair<time_t,double> > priceHistory; 

std::set будет хорошим выбором, если вы хотите, чтобы выполнить некоторые математические операции, такие как объединение, пересечение и т.д. Эти операции доступны в заголовке <algorithm>

Но если вы хотите что-то действительно быстро для ключа , поиск стоимости, рассмотреть возможность выбора для unordered_map(hashtable)

Смежные вопросы