int 和元组的静态 STL 映射 returns 0

static STL map of int and tuple returns 0

为我的 C++ 创建日历 class。我有一个静态方法和静态容器的实用程序 class。最值得注意的是:

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

当我尝试从另一个 class 访问此地图时出现问题:

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

你是如何初始化地图的?您的词典代码显示了一个函数 Dictionary::initMonths(),它 return 是一个地图,但您的示例应用程序代码只是调用 Dictionary::init()。如果这些函数实际上是相同的,而这只是一个拼写错误,那么您忘记将 initMonths 的 return 值分配给静态 months 变量。

作为一个建议,在这里有一个地图似乎有点矫枉过正 - 你实际上不希望地图 属性 在这种情况下它在树状结构中排列稀疏键。仅使用向量或固定数组并仅通过索引访问而不使用迭代器等可能更容易(并且更快,因为它的价值)