std :: map丢失了我的数据?

时间:2011-03-14 16:46:19

标签: c++ map reference pass-by-reference

我正在使用boost :: any将一些数据包含在类方法getValue的地图中。在getValue中,一切正常,数据在地图中适当等。第二个我离开getValue并尝试使用这些数据,它不再在地图中。

这让我很难过,我可能忘记在关键位置使用引用,但我找不到它。

相关代码如下:

test.c的      //我们不想实际记录计时器,如果他愿意,用户可以这样做。       timeval tmp;

  tmp.tv_sec = 0;
  tmp.tv_usec = 0;

  gettimeofday(&tmp, NULL);
  getValue<timeval>(timerName) = tmp;
  std::cout << tmp.tv_usec << " : " << getSingleton().globalValues.count(key) << std::endl; //Count returns 0 here, for a given key X_X

test.h

 /* Grab the value of type T found while parsing.  Should use checkValue first.*/
  template<typename T>
  static T& getValue(const char* identifier) {
    //Used to ensure we have a valid value
    T tmp;
    //Used to index into the globalValues map
    std::string key = std::string(identifier);
    std::map<std::string, boost::any>& gmap = getSingleton().globalValues;

    if(checkValue(identifier)) //If we have the option, set it's value
      tmp = getSingleton().vmap[identifier].as<T>();  //vmap is correct, it specifies default values passed in via command line.  

    //We may have whatever is on the commandline, but what if
    //The programmer has made modifications?
    if(!gmap.count(key))  //The programmer hasn't done anything, lets register it then
      gmap[key] = boost::any(tmp);

    std::cout << "gmap " << key << std::endl;        
    std::cout << getSingleton().globalValues.count(key) << std::endl; //count returns 1 here, for a given key.
    return boost::any_cast<T&>(gmap[key]);
  }

...

test.h

 //Map of global values, stored here instead of in OptionsHierarchy
  //For ease of implementation
  std::map<std::string, boost::any> globalValues;

2 个答案:

答案 0 :(得分:0)

在这些行中,您使用vmap代替gmap。是吗?

if(checkValue(identifier)) //If we have the option, set it's value
  tmp = getSingleton().vmap[identifier].as<T>();

此外,我注意到您正在使用count来检查项目是否存在。一般来说,除非您确实需要计数,否则会导致执行的工作量超过find,但对std::map而言,将count优化为find可能足够聪明。既然如果它不存在就要插入,而当它不存在时,则只需使用insert,因为这正是行为insert将给你的。

答案 1 :(得分:0)

我解决了这个问题,请注意我如何将getValue中的键定义为std :: string(identifier)。在test.c中,我将键定义为sanitizeString(..),它显然返回了一个不同的键。当然,你们看不到那么糟糕。