2014-02-06 40 views
1

我有以下數據結構。如何從插入QMap的字符串中找到對應的鍵值?

QMap<int,QString> map; 

map.insert(0x01,"HELLO"); 
map.insert(0x02,"FELLOW"); 
map.insert(0x83,"NESTLE"); 
map.insert(0x044,"KITKAT"); 

QString str="NESTLE"; 

我的要求是當字符串檢索值-0x83 - 雀巢通過。 基本上,基於str值,我想在本例中得到相應的鍵值,即0x83。我該怎麼做?

回答

2

我這樣做:

[..] 
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; 
} 

UPDATE:

或鍵可以簡單地發現,通過:

int key = map.key("NESTLE"); 
+4

爲什麼我們在這裏迭代?爲什麼不只是map.key(str); ? –

+0

@SHREYASJOSHI,是啊:)比你自己的問題回答。 – vahancho

1

有兩種方法,這取決於有多少項在地圖中。

如果地圖上的項目很少(如< 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"]; 
+1

根據需求,還可以使用現有的實現,如Boost bimap:http://www.boost.org/doc/libs/1_42_0/libs/bimap/doc/html/index.html –

相關問題