2012-04-12 41 views
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)); 

感謝您的回覆先進

+0

memcpy(* data,...)中的'* data'是什麼? – hmjd 2012-04-12 14:55:35

+0

地圖的值類型是'std :: pair '。 – 2012-04-12 15:02:19

+0

*數據類型是:void **數據。通過參考調用。 – user1044923 2012-04-12 15:05:44

回答

2

iter仍然指向您mapend(),如果它不存在。

試試這個:

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)); 
    } 
+0

感謝回覆錯誤::呼叫與「operator =」的任何參數列表不匹配。 「隱式的std :: _樹,std :: allocator >,void *,std :: less ,std :: allocator >>,std :: allocator ,std :: allocator >,void *>>,0 >>> :: iterator :: operator =(const std :: _ Tree ,std :: allocator >,void *,std :: less user1044923 2012-04-12 15:01:06

+0

道歉;'insert'方法返回一個帶迭代器的對作爲第一個元素 - 我編輯了我的答案。 – trojanfoe 2012-04-12 15:07:11

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

你原來的代碼的問題是你deref即使當它等於.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().insert()合併爲一個操作,節省您每次插入一個日誌(N)搜索。