是否有一个容器用于对发布者-订阅者关系进行建模并进行快速查找?



我有一个想要建模的发布者-订阅者关系。发布者可以有多个订阅者,但每个订阅者只能从单个发布者获取数据。我认为向量映射会很好:

std::map<publisher, std::vector<subscriber>>

快速查找、插入和删除发布者,快速插入订阅者,并且很容易为发布者获取所有订阅者。但是从地图中查找和删除订阅者是很麻烦的。它需要迭代所有发布者,直到找到该订阅者。我还想要一种简单的遍历所有订阅者的方法,最好不要使用双循环。

我想要一个具有以下属性的容器,其中每个操作都是一个函数调用,或循环,在适当的地方:

  • 查找、插入、删除发布者/订阅者。O(1)或O(lgn);N =发布者/订阅者数量
  • 发布者/订阅者迭代。O (N);N =发布者/订阅者数量
  • 单个发布者的订阅迭代。查找+ 0 (N);N =该发布者的订阅者数量。

是否有现成的容器可以做到这一点,还是我必须自定义一个?

我建议:

struct SubscriptionRecords {
std::unordered_map<publisher, std::unordered_set<subscriber>>
subscribers;
std::unordered_map<subscriber, publisher>
subscriptions;
};

然后是一些示例方法:

void add_subscription(publisher p, subscriber s) {
auto res = self->subscriptions.insert(s);
assert(res->second);  // At most one subscription.
self->subscribers[p].insert(s);
}
void remove_subscriber(subscriber s) {
auto sp = self->subscriptions.find(s);
if (sp != self->subscriptions.end()) {
self->subscribers[*sp].erase(s);
self->subscriptions.erase(sp);
}
}

和相似。

最新更新