C++具有过期时间的容器

C++ container with expiration time

本文关键字:时间 过期 C++      更新时间:2023-10-16

我想创建一个C++(11)容器(可以使用boost)来容纳数据库连接。我希望能够在容器中推送连接指针,但是 std::vector 不知道插入时间,所以我可以使用这样的东西。

  • 当连接开始执行时,它还将推入带有时间现在()的容器。

    如果连接完成数据库中的作业,则连接将是已从容器中删除。

理想情况下,我的类将有一个清理方法,该方法将定期检查连接在容器中是否超过特定时间间隔,即 30 秒。如果为 true,则连接将从数据库中释放。

任何想法,有什么标准解决方案吗?

您可以使用对向量。其中,每对的第一个元素是插入时间,第二个元素是连接指针。

std::vector<std::pair<int, ConnectionPtr*>> connections_vec;

此外,您可以使用 STL std::partition来摆脱过期的连接,如下所示:

connections_vec.erase(std::partition(connections_vec.begin(), 
                                     connections.vec.end(),
                                     [](auto &&p){return (time_now - p.first) > 30secs;}), 
                                     connections_vec.end());

有多种可能的解决方案可以满足您的需求。

您仍然可以使用 std::vector<>但包含您定义的结构,该结构包含数据库连接实例和时间,即(大致记下的代码):

struct TimedConnection {
  DBConnection& connection;
  time_t connected_time;
};
std::vector<TimedConnection> myConnections;
或者

,或者,使用 std::pair<DBConnection, time_t> 作为矢量项。

请注意,自定义结构选项将允许您为未来的发展或改进提供更大的自由度,因为它不限于 2 个数据作为std::pair<>

如果此类容器的唯一用途是定期检查是否有超过 X 秒前启动的数据库连接,您还可以查看 std::p riority_queue<>,可能在项目结构(或对)上使用自定义比较运算符。