Статическая STL карта int и кортеж возвращает 0

Создание календаря для моего класса C++. У меня есть служебный класс статических методов и статических контейнеров. Наиболее заметно:

Dictionary.h

static std::map<int,std::tuple<std::string,int>>months;
static std::map<int,std::tuple<std::string,int>>::iterator mitr;

Эта карта содержит в качестве ключей месяцы 0-11. Значение кортежа содержит строковое представление каждого месяца и количество дней каждого месяца. Например:

Dictionary.cpp

map<int,tuple<string,int>> Dictionary::initMonths(){
   map<int,tuple<string,int>>m;
   map<int,tuple<string,int>>::iterator mapitr = m.begin();
   m.insert(mapitr, make_pair(0,make_tuple("January",31)));
   m.insert(mapitr, make_pair(1,make_tuple("February",28)));
   // insert remaining months...
   return m;
}

Проблема возникает, когда я пытаюсь получить доступ к этой карте из другого класса:

Calendar.cpp

Calendar::Calendar(){
  Dictionary::init();
  time_t t = chrono::system_clock::to_time_t(chrono::system_clock::now());
  tm* t2 = localtime(&t);
  int mo = (t2->tm_mon);
  Dictionary::mitr = Dictionary::months.find(mo);
  cout<<(*Dictionary::mitr).first<<endl; // => 0
  cout<<get<0>((*Dictionary::mitr).second)<<endl; // nothing
  }

Я не уверен, что я делаю не так здесь. Мы ценим любые предложения.

РЕДАКТИРОВАТЬ:

void Dictionary::init(){
  packaged_task<map<int,tuple<string,int>>()>task3(initMonths);
  future<map<int,tuple<string,int>>>fu3 = task3.get_future();
  guarded_thread t3(std::move(task3));
  map<int,tuple<string,int>>months = fu3.get();
 }   

1 ответ

Решение

Как именно вы инициируете карту? Ваш код Dictonary показывает функцию Dictionary::initMonths(), который возвращает карту, но код вашего примера приложения просто вызывает Dictionary::init(), Если эти функции на самом деле одинаковы и это просто опечатка, то вы забыли присвоить возвращаемое значение initMonths статическому months переменная.

Так же, как предложение, наличие карты здесь немного похоже на излишнее - вы на самом деле не хотите, чтобы свойство map в этом случае располагало разреженные ключи в древовидной структуре. Возможно, было бы проще (и быстрее, чего бы это ни стоило) просто использовать вектор или фиксированный массив и просто осуществлять доступ по индексу, без итератора и т. Д.

Другие вопросы по тегам