1

如果我有这张地图

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(...) && ...) ' 我不明白为什么会这样。感谢您提供任何帮助。

4

2 回答 2

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));
于 2016-09-02T22:12:45.613 回答
1

那有什么更好的写法呢?

这是一个无序映射,将某个标识符映射到多个套接字。

在 BSD 套接字中,套接字描述符是一个 int(或至少可以转换为一个),所以让我们继续使用它。

似乎每个标识符关联的套接字不止一个。这证明了一个向量。

所以:

using socket_vector = std::vector<int>;

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

现在我们可以将套接字附加到每个标识:

sockets[ident].push_back(sock);
于 2016-09-02T21:07:54.773 回答