2015-11-02 313 views
0

比較兩個QMaps並刪除不在第一個地圖中的條目並將地圖二的條目添加到第一個地圖的最佳方法是什麼?假設我有一張{1,2,3}的地圖和一張{1,2,4}的地圖,我想保留在第一張地圖{1,2,4}。謝謝。比較兩個QMaps

+1

'Map'具有鍵/值。 ..你想要比較哪一個? – Jarod42

+0

我想比較一下密鑰。 – adapto

回答

2

根據你的榜樣映射這樣的:

void removeNonUniqueThenAppend(QMap<QString, QString>& map1, QMap<QString, QString> map2) 
{ 
    QMap<QString, QString>::iterator iterator = map1.begin(); 

    while (iterator != map1.end()) { 
     if (!map2.contains(iterator.key())) { 
     iterator = map1.erase(iterator); 
     } 
     else { 
     map2.remove(iterator.key()); 
     ++iterator; 
     } 
    } 

    map1.unite(map2); 
} 
+0

這很好,但你需要建立一個新的地圖。我會嘗試適應這一點,以便將結果存儲在第一張地圖中。謝謝。 – adapto

+0

它是'O(n log n)',而它可以在'O(n)'中完成。 – Jarod42

+0

我在這裏沒有看到可能的'O(n)'。 – adapto

1

您可以適應以下Qt的:

template <typename K, typename V> 
void my_merge(std::map<K, V>& m1, const std::map<K, V> m2) 
{ 
    auto it1 = m1.begin(); 
    auto it2 = m2.begin(); 

    while (it1 != m1.end() && it2 != m2.end()) { 
     if (*it1 < *it2) {  // Only in m1 
      it1 = m1.erase(it1); 
     } else if (*it2 < *it1) { // Only in m2 
      m1.insert(it1, *it2); // with hint. 
      ++it2; 
     } else {     // In both 
      ++it1; 
      ++it2; 
     } 
    } 
    m1.erase(it1, m1.end()); 
    m1.insert(it2, m2.end()); 
} 

Demo

Demo with hint

+0

謝謝。這正是我期待的。 – adapto