如果我理解正確,您有連接/超時對,並且您希望能夠通過連接和超時訪問這些對。 通過連接,因爲您必須在接收數據包時更改超時,並且由於需要知道下一個超時連接是什麼而超時。
如果您對提升沒有任何反應,請參閱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