2012-04-12 1 views

답변

2

iter 여전히 mapend()를 가리키는 것입니다 고급 회신

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

감사 : 또한 나는 삽입물의 두 가지 유형의 차이가 무엇인지 이해하려면 .

이 시도 :

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

답장 오류를 보내 주셔서 감사합니다 :: 호출은 "연산자 ="에 대한 매개 변수 목록과 일치하지 않습니다. "암시 적 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

+0

사과는'insert' 메소드가 첫 번째 요소로서 반복자를 가진 쌍을 반환한다는 것을 사과드립니다 - 나는 나의 대답을 편집했습니다. – trojanfoe

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

원래 코드의 문제는 예 : .end() 인 경우에도 iter입니다.


또는, 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()) ; 

이 당신에게 삽입 당 하나의 로그 (N) 검색을 저장, 하나 개의 작업에 .find().insert()을 결합합니다.