Если я правильно понимаю, у вас есть пары соединение / время ожидания, и вы хотите иметь возможность доступа к этим парам по соединению, а также по времени ожидания.По соединению, потому что вы должны изменить время ожидания при получении пакета, и по истечении времени ожидания, потому что вам нужно знать, какое будет следующее соединение с временем ожидания.
Если вы не имеете ничего против повышения, взгляните на 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
}
}
Чтобы удалить соединение, вам нужно удалить указатель из одного набора,и удалите И удалите указатель из другого набора.
Я не скомпилировал ничего из этого, так что не приставайте к опечаткам (: