我有一个想要建模的发布者-订阅者关系。发布者可以有多个订阅者,但每个订阅者只能从单个发布者获取数据。我认为向量映射会很好:
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);
}
}
和相似。