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破損しています。また、2 種類のインサートの違いを理解したいと思います。

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

高度な返信をありがとう

4

2 に答える 2

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()が 1 つの操作に結合され、挿入ごとに 1 つの log(N) 検索が節約されます。

于 2012-04-12T15:07:27.610 に答える