如何从插入QMap的字符串中找到相应的键值?

时间:2014-02-06 14:52:18

标签: qt

我有以下数据结构。

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。我怎么能这样做?

2 个答案:

答案 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"];