int和tuple的静态STL映射返回0 < >为我的C++类构建日历。我有一个静态方法和静态容器的实用类。最值得注意的是:

int和tuple的静态STL映射返回0 < >为我的C++类构建日历。我有一个静态方法和静态容器的实用类。最值得注意的是:,c++,stl,stdmap,stdtuple,C++,Stl,Stdmap,Stdtuple,字典 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>> Di

字典

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
  }
我不确定我做错了什么。如有任何建议,将不胜感激

编辑:


你到底是怎么知道地图的?您的口述代码显示一个函数Dictionary::initMonths,它返回一个映射,但您的示例应用程序代码只调用Dictionary::init。如果这些函数实际上是相同的,这只是一个输入错误,那么您忘记了将initMonths的返回值赋给静态months变量


正如一个建议,这里有一个映射看起来真的有点过分了——实际上,在这种情况下,您不希望映射的属性将稀疏键安排在树状结构中。使用向量或固定数组,只通过索引访问,而不使用迭代器等,可能更简单、更快。

我在这里使用map的主要原因是绑定月数索引,月份的字符串名称和月份的天数都放在一个容器中。这在vector中仍然是可能的,甚至可能更简单:std::vector months12;月[0]=制造日期1月31日;/。。。。。。顺便说一句,你原来的问题解决了吗?是的,我已经解决了。元组向量是可行的,但它是少数几个问题之一——包括在promise是更好的选择时使用打包的_任务。我没有使用任何参数并返回一个容器,而是重写了init方法来引用promise并返回void。我还删除了Dictionary类中的静态声明,而是将Dictionary指针作为Calendar类的数据成员。现在很有魅力。我相信你会给我一个答案,因为它让我开始诊断几种疾病。谢谢。
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();
 }