- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
根据这个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/
我有以下代码: #include #include #include using namespace boost::bimaps; using namespace boost; struct E
我有以下内容: struct foo_and_number_helper { std::string foo; uint64_t number; }; struct foo_and_numbe
我有一个这样的双图: using MyBimap = boost::bimaps::bimap, boost::bimaps::unordered_set_of>; 我想从静态初始化列表构造它
我正在审查 Google Guava API 的功能,并遇到了一种我在“现实世界编程”经验中从未见过的数据结构,即 BiMap。这种构造的唯一好处是能够快速检索给定值的 key 吗?是否存在使用 Bi
我有一个像这样的无序 bimap: using SymPressMap = boost::bimap, boost::bimaps::unordered_se
如果不使用 BiMap 的 .inverse() 函数,您将如何进行反向映射? 我得到了: public static Map> reverseMapping(Map mapping) 我尝试过类似的
根据这个question中使用boost::bimap的建议, 我有一个关于如何解决 bimap 中重复键的问题。 如果我有: , ,是否可以在bimap中插入两次? 我看到了描述 Collecti
我使用了很多形式的容器 boost::bimap, boost::bimaps::set_of > 我在一个头文件中定义它们,这个头文件包含在很多 cpp 文件中(这是在我尽可能限制头文件的公开之后)
我正在尝试获取通过其键访问的值。到目前为止,我有一个我尝试过的最小示例,并且仅适用于左侧访问。 #include #include #include #include #include #i
我想访问 bimap 中重复元素的所有键。我在下面有一些示例代码 #include #include #include #include #include #include namespa
好的,所以我声明了一个 boost::bimap: boost::bimap object_list; 其中 object 和 position 分别是一个类和一个结构。 在 bimap 中存储的当前
Java 编程 迭代 map 的问题 Iterator iterator = plugin.inreview.keySet().iterator(); while (iterator.hasNext(
设 T_1 和 T_2 是两种类型,f: Dom(T_1) -> Dom(T_2) 是一个非双射的单射函数;为了便于讨论,假设我将 f 表示为不同的对,而不是用于计算它的代码。现在,我需要能够相对快速
我正在寻找双向无序 map 。目前,我只有这个。问题是,我不能使用 []。我认为 boost 默认为列表类型。但我想要一个 HashMap 。这怎么可能? #include #include bo
我正在尝试为 C++ 中的枚举创建一个简单的双向查找工具。我的单向查找工作正常... enum MyEnum { One, Two, Three }; const boost:
我正在模板化类中嵌入 boost::bimap,经过多次试验和错误,我发现了一些可以编译的东西和一些不能编译的东西。我正在使用 g++ (GCC) 4.9.2 20150212 (Red Hat 4.
我对BiMap仍然很困惑在 Google collections/Guava 。据称,这两个 bimap 有相同的数据支持;对其中一个的任何更改都会出现在另一个中。 浏览了一下源码,发现Forward
我刚刚读过这篇文章 http://www.ctl.ua.edu/math103/mapcolor/mapcolor.htm 我不明白,如何将此 map (在 bimap 中)转换为图形结构。 进入 如
我想序列化 BiMap与 xStream .由于我不喜欢 xStream 为 BiMap 自动生成的代码,我认为将 BiMap 转换为 HashMap 并仅序列化 HashMap 可能是个好主意,反序
我正在尝试使用 boost::bimap 来满足我的一项要求。下面是示例代码 typedef bimap, multiset_of, set_of_relation<>
我是一名优秀的程序员,十分优秀!