如果我理解正确,您有连接/超时对,并且您希望能够通过连接和超时访问这些对。 通过连接,因为您必须在接收数据包时更改超时,并且由于需要知道下一个超时连接是什么而超时。
如果您对提升没有任何反应,请参阅multi_index。
如果你想推出自己的,你可以保留两组指针,给人以设置不同的比较功能:
class Connection {
...
public:
int GetTimeout() const;
int GetID() const;
};
class TimeIsLess {
public:
bool operator()(const Connection*c1, const Connection*c2) const {
return c1->GetTimeout() < c2->GetTimeout();
}
}
class IdIsLess {
public:
bool operator()(const Connection*c1, const Connection*c2) const {
return c1->GetId() < c2->GetId();
}
}
std::set<Connection*,TimeIsLess> connectionsByTime;
std::set<Connection*,IdIsLess> connectionsById;
要创建连接:
...
Connection * c = new Connection(id, timeout);
connectionsByTime.insert(c);
connectionsById.insert(c);
...
要获得下一个连接将超时,只是得到第一个:
auto nextToTimeout = connectionsByTime.begin();
if (nextToTimeout != connectionsByTime.end())
{
if ((*nextToTimeout)->GetTimeout() < now)
{
// Close the connection
}
}
要删除连接,你的h ave从一组中删除指针,并从另一组中删除并删除指针。
我编译没有它,所以不要钉箱上的错别字(:
没错这就是罚款;) –
很相似:http://stackoverflow.com/questions/7075472/scalable-algorithm-to- detect -stale-data/7084735#7084735 –
小心保持迭代器指向你要修改的列表。在这种情况下,将项目移动到列表的末尾将会使地图持有的迭代器无效。 – Gabriel