2015-11-02 6 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