是否有一个容器可以快速查找发布者-订阅者关系?

问题描述

我有一个想要建模的发布者-订阅者关系。发布者可以有多个订阅者,但每个订阅者只能从一个发布者获取数据。我认为矢量地图对此很有用:

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

发布者查找、插入和删除速度很快,订阅者插入也很快,并且很容易为发布者获取所有订阅者。但是从地图中查找和删除订阅者很麻烦。它需要迭代所有发布者,直到找到该订阅者。而且我仍然想要一种简单的方法来遍历所有订阅者,理想情况下没有双循环。

我想要一个具有这些属性的容器,其中每个操作都是单个函数调用或循环(在适当的情况下):

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

解决方法

我建议:

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);
    }
}

和类似的。