问题描述
我有一个想要建模的发布者-订阅者关系。发布者可以有多个订阅者,但每个订阅者只能从一个发布者获取数据。我认为矢量地图对此很有用:
std::map<publisher,std::vector<subscriber>>
发布者查找、插入和删除速度很快,订阅者插入也很快,并且很容易为发布者获取所有订阅者。但是从地图中查找和删除订阅者很麻烦。它需要迭代所有发布者,直到找到该订阅者。而且我仍然想要一种简单的方法来遍历所有订阅者,理想情况下没有双循环。
我想要一个具有这些属性的容器,其中每个操作都是单个函数调用或循环(在适当的情况下):
- 查找、插入、删除发布者/订阅者。 O(1) 或 O(lg N); N = 发布者/订阅者数量
- 发布者/订阅者的迭代。在); N = 发布者/订阅者数量
- 单个发布者的订阅迭代。查找 + O(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);
}
}
和类似的。