Как хранить gregorian_date как ключ unordered_map в c ++? - PullRequest
0 голосов
/ 14 мая 2018

Как использовать unordered_map, в котором gregorian_date будет использоваться как ключ ?

unordered_map<boost::gregorian::date,int>date_map;
boost::gregorian::date sample_date{2018,01,01};    
date_map[sample_date]=1;

Может кто-нибудь, пожалуйста, помогите мне.

1 Ответ

0 голосов
/ 14 мая 2018

Ваш вопрос тесно связан с unordered_map с григорианскими датами , за исключением того, что вы используете std::unordered_map вместо boost::unordered_map. Вам необходимо решить ту же проблему: если вы хотите использовать какой-либо тип данных в качестве ключа в unordered_map, вам необходимо предоставить специализацию std::hash для этого типа (в вашем случае ::boost::gregorian::date). Основываясь на ответе на вопрос, который я связал, вы можете использовать эту специализацию:

#include <boost/date_time/gregorian/gregorian.hpp>
#include <unordered_map>

namespace std {

// Note: This is pretty much the only time you are allowed to
// declare anything inside namespace std!
template <>
struct hash<boost::gregorian::date>
{
  size_t operator () (const boost::gregorian::date& date) const
  {
    return std::hash<decltype(date.julian_day())>()(date.julian_day());
  }
};

}

int main()
{
  std::unordered_map<boost::gregorian::date, int> date_map;
  boost::gregorian::date sample_date{2018, 1, 1};
  date_map[sample_date] = 1;
}
...