gpt4 book ai didi

c++ - 重复键的 bimap 使用

转载 作者:行者123 更新时间:2023-11-30 04:17:32 25 4
gpt4 key购买 nike

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

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

我看到了描述 CollectionType_of 的页面, 默认类型是 bimap< CollectionType_of<A>, CollectionType_of<B> > 的集合.所以 key 在双方都是唯一的。另外,我想知道有没有更好的方法可以快速找到key1的value1,value2?但是 key1 不好,因为以值作为键进行搜索。

感谢您的建议!

最佳答案

您的箱子需要一个定制容器。它会有两张 std::map<string, std::set<string>> 的 map .像这样:

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 */
};

用法类似于:

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 现在有一个空映射。您可以调整此类以确保从 valueToKeys 中删除此类到空集的映射。或 keyToValues map ,取决于它是否是 removeKey()removeValue()分别操作。

关于c++ - 重复键的 bimap 使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17054692/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com