我有以下数据结构。
QMap<int,QString> map;
map.insert(0x01,"HELLO");
map.insert(0x02,"FELLOW");
map.insert(0x83,"NESTLE");
map.insert(0x044,"KITKAT");
QString str="NESTLE";
我的要求是在传递字符串 - NESTLE时检索值-0x83。 基本上,基于str值,我想获得相应的键值,即在该示例中为0x83。我怎么能这样做?
答案 0 :(得分:3)
我会这样做:
[..]
QString str = "NESTLE";
int key = getKey(map, str); // should return 0x83 in your example.
[..]
int getKey(const QMap &map, const QString &value)
{
foreach (QString v, map) {
if (v == value)
return map.key(value);
}
return -1;
}
更新:
或者可以通过以下方式找到钥匙:
int key = map.key("NESTLE");
答案 1 :(得分:1)
有两种方法,具体取决于地图中的项目数量。
如果地图中的项目很少(例如&lt; 20),您可以使用map.key()
搜索密钥。这会对所有项目执行线性搜索,因此对于大型地图会因此类搜索的O(N)复杂性而表现不佳。
或者,您可以实现双向映射。下面显示的是一个非常简单的变体,仅适用于不同的T1和T2。请注意,没有非const索引运算符,因为两个映射都需要修改。这需要一个包装类。
template <typename T1, typename T2> class BiMap {
QMap<T1, T2> m_map1;
QMap<T2, T1> m_map2;
public:
typedef QMap<T1, T2>::iterator iterator1;
typedef QMap<T1, T2>::const_iterator const_iterator1;
typedef QMap<T2, T1>::iterator iterator2;
typedef QMap<T2, T1>::const_iterator const_iterator2;
iterator1 insert(const T1 & key, const T2 & value) {
m_map2.insert(value, key);
return m_map1.insert(key, value);
}
iterator2 insert(const T2 & key, const T1 & value) {
m_map1.insert(value, key);
return m_map2.insert(key, value);
}
const T1 & operator[](const T1 & key) const {
return m_map1[key];
}
const T2 & operator[](const T2 & key) const {
return m_map2[key];
}
};
BiMap<int,QString> map;
map.insert(0x01, "HELLO");
map.insert(0x02, "FELLOW");
map.insert(0x83, "NESTLE");
map.insert(0x044, "KITKAT");
int key = map["NESTLE"];