首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重复键的bimap用法

重复键的bimap用法
EN

Stack Overflow用户
提问于 2013-06-12 06:08:57
回答 1查看 797关注 0票数 1

根据在此question中使用boost::bimap的建议,我有一个关于如何解决bimap中重复键的问题。

如果我有:<key1, value1>, <key1, value2>,是否可以在bimap中插入两次?

我看到了描述CollectionType_of的页面,默认类型是为bimap< CollectionType_of<A>, CollectionType_of<B> >设置的。因此,密钥在两端都是唯一的。更重要的是,我想知道有没有更好的方法来快速找到key1的value1,value2?但是key1并不好,因为它是以值作为关键字进行搜索的。

谢谢你的建议!

EN

回答 1

Stack Overflow用户

发布于 2013-06-12 07:09:03

您的案例需要一个自定义容器。它将有两个std::map<string, std::set<string>>地图。如下所示:

代码语言:javascript
复制
template <typename K, typename V>
class ManyToManyMap
{
public:
    typedef std::set<K> SetOfKeys;
    typedef std::set<V> SetOfValues;
    typedef std::map<K, SetOfValues> KeyToValuesMap;
    typedef std::map<V, SetOfKeys> ValueToKeysMap;

private: // I usually put this to the bottom. But it's here for readability.
    KeyToValuesMap keyToValues;
    ValueToKeysMap valueToKeys;

public:
    /* I leave it to requester to implement required functions */

    void insert(const K& key, const V& value)
    {
        keyToValues[key].insert(value);
        valueToKeys[value].insert(key);
    }

    void removeKey(const K& key)
    {
        KeyToValuesMap::iterator keyIterator = keyToValues.find(key);
        if (keyToValues.end() == keyIterator) {
            return;
        }
        SetOfValues& values = keyIterator->second;
        SetOfValues::const_iterator valueIterator = values.begin();
        while (values.end() != valueIterator) {
            valueToKeys[*valueIterator++].remove(key);
        }
        keyToValues.erase(keyIterator);
    }
    /* Do the reverse for removeValue() - leaving to OP */

    SetOfValues getValues(const K& key) const
    {
        KeyToValuesMap::const_iterator keyIterator = keyToValues.find(key);
        if (keyToValues.end() == keyIterator) {
             return SetOfValues(); // Or throw an exception, your choice.
        }
        return keyIterator->second;
    }
    /* Do the reverse for getKeys() - leaving to OP */
};

用法类似于:

代码语言:javascript
复制
typedef ManyToManyMap<string, string> LinksMap;
LinksMap links;
links.insert("seg1", "pic1"); // seg1 -> (pic1) and pic1 -> (seg1)
links.insert("seg1", "pic2"); // seg1 -> (pic1, pic2) and pic2 -> (seg1)
links.insert("seg2", "pic1"); // seg2 -> (pic1) and pic1 -> (seg1, seg2)
....
links.removeKey("seg1"); // pic1 -> (seg2) and pic2 -> ()

这种数据结构存在明显的缺陷,因为它没有清理到空集的映射。假设在最后一条语句中,pic2现在有一个空映射。您可以调整这个类,以确保从valueToKeyskeyToValues映射中删除此类到空集的映射,这分别取决于它是removeKey()还是removeValue()操作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17054692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档