0

我有以下程序并在插入地图时出现问题:

      static std::map<std::string,void *> name_data_map;
      std::map<std::string,void *>::iterator iter=name_data_map.find(name) ;


    if(  iter == name_data_map.end() )
    {
            tmp_data = (void *) malloc ( mt_get_dkstat_size() );
            errorCode = getsproxy(tmp_data , name );
            name_data_map.insert(pair<std::string,void *>(name,tmp_data) );

    }


   memcpy(*data, iter->second,  mt_get_dkstat_size() ) ;

插入后,tmp_data正在损坏。而且我想了解这两种插入有什么区别:

name_data_map.insert(pair<std::string,void *>(name,tmp_data) );
name_data_map.insert(make_pair(name,tmp_data) );

感谢您的高级回复

4

2 回答 2

2

iter如果它还不存在,它仍然会指向end()你的。map

尝试这个:

static std::map<std::string,void *> name_data_map;
std::map<std::string,void *>::iterator iter=name_data_map.find(name) ;


if (iter == name_data_map.end())
{
        tmp_data = (void *)malloc(mt_get_dkstat_size());
        errorCode = getsproxy(tmp_data, name);
        // Fix:
        std::pair<std::map<std::string,void>::iterator,bool> ret;
        ret = name_data_map.insert(pair<std::string,void *>(name,tmp_data));
        iter = ret.first;
}

memcpy(*data, iter->second, mt_get_dkstat_size());

编辑:要回答您关于这两种方法之间差异的问题,它们与make_pair实现为基本相同:

template <class T1,class T2>
  pair<T1,T2> make_pair (T1 x, T2 y)
  {
    return ( pair<T1,T2>(x,y) );
  }
于 2012-04-12T14:54:18.907 回答
1

试试这个:

void *tmp_data;
if(  iter == name_data_map.end() ) {
        tmp_data = (void *) malloc ( mt_get_dkstat_size() );
        errorCode = getsproxy(tmp_data , name );
        name_data_map[name] = tmp_data;
} else {
    tmp_data = iter->second;
}

memcpy(*data, tmp_data,  mt_get_dkstat_size() ) ;

您的原始代码的问题是您取消引用iter,即使它等于.end().


或者,如果您更喜欢使用insert而不是operator[],请尝试以下操作:

auto pair = name_data_map.insert(std::make_pair(name, (void*)0));
if(pair.second) {
    pair.first->second = (void*)malloc( mt_get_dkstat_size() );
    errorCode = getxproxy(tmp_data, name);
}

memcpy(*data, pair.first->second,  mt_get_dkstat_size() ) ;

这会将.find()and.insert()合并到一个操作中,每次插入为您节省一个 log(N) 搜索。

于 2012-04-12T15:07:27.610 回答