2016-09-02 1 views
1

나는이지도가있는 경우C++ 정렬되지 않은지도에 갖다 두도록 잘못된 인수

std::unordered_map<std::string, int*> sockets; //a map holding all active sockets 

나는이 할 수있는 올 방법 :

sockets[_myId]=(int*)lp; //all ok - insert succeeds 

을하지만 나는이 작업을 수행 할 수 없습니다

if(!sockets.emplace(_myId,(int*)lp).second) { /*insert failed, act accordingly*/ } 

잘못된 인수 ' 후보자는 다음과 같습니다 : ? emplace (# 10000 (...) & & ...) ' 왜 이런 일이 발생하는지 이해할 수 없습니다. 어떤 도움을 Thx.

+0

시도를 (_myId, (int *) lp)) – vadikrobot

+0

@vadikrobot이 경우에는 emplace가됩니다. key와 value라는 두 개의 인수를 취한다. 당신은 삽입을 생각하고 있습니다. –

+1

재생산 할 수 없으며 저에게 좋습니다. 'std :: unordered_map 소켓; bool foo (const char * p, int n) { \t return sockets.emplace (p, & n) .second; }' –

답변

1

다음에 더 좋은 방법은 무엇입니까?

이것은 식별자와 소켓 번호를 매핑하는 정렬되지 않은 맵입니다.

BSD 소켓에서 소켓 디스크립터는 int (또는 적어도 하나의 것으로 변환 가능)이므로 그대로 둘 수 있습니다.

각 식별자와 연결된 소켓이 두 개 이상인 것으로 보입니다. 이것은 벡터를 주장합니다.

너무 :

using socket_vector = std::vector<int>; 

지금

using ident_to_sockets = std::unordered_map<std::string, socket_vector>; 

우리는 각 행선지에 소켓을 추가 할 수 있습니다 : (표준 : make_pair를 sockets.emplace하는

sockets[ident].push_back(sock); 
1
std::unordered_map<std::string, int*> something; 
std::string a; 
int* b; 

something[a] = b; 

// with emplace: 
something.emplace(std::make_pair(a, b)); 

// also 
something.emplace(std::unordered_map<std::string, int*>::value_type(a, b));