int和tuple的静态STL映射返回0

时间:2017-04-03 01:54:06

标签: c++ stl stdmap stdtuple

为我的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 个答案:

答案 0 :(得分:1)

你是如何准备地图的?您的Dictonary代码显示了一个函数Dictionary::initMonths(),它返回一个映射,但您的示例应用程序代码只调用Dictionary::init()。如果这些函数实际上是相同的并且这只是一个拼写错误,那么您忘记将initMonths的返回值赋给静态months变量。

正如一个建议,这里有一张地图似乎有点像矫枉过正 - 你实际上并不想要地图的属性,在这种情况下它会在树状结构中排列稀疏键。使用向量或固定数组并且只需通过索引进行访问(不使用迭代器等)可能更容易(也更快,对于它的价值而言)。