2013-07-21 2 views
-1

сравнить две карты (std::map<std::string, std::unsigned int>) по значению и определить отдельные элементы.сравнить две карты и идентифицировать отдельные элементы

typedef std::map<std::string /* file name*/, unsigned int /*crc*/> mMap; 

список файлов для каждого файла в списке вычисляется crc. Имя файла не изменяется, crc changet.

+2

В чем вопрос? – Borgleader

+0

Взгляните на http://www.cplusplus.com/reference/algorithm/set_difference/. Это очень плохо спроектированный вопрос. – Chad

ответ

0

Я предполагаю, что у вас есть 2 карты, где имя файла является ключевым, а значение CRC - значением, и вы хотите проверить наличие новых файлов и/или изменение crc.

Почему бы не сделать что-нибудь подобное?

set<string> common; 
for (auto it = mapOld.begin(); it != mapEnd.begin(); ++it) 
    if (mapNew.find(it->second) == mapNew.end()) 
     cout << "file deleted " << it->second << endl; 
    else 
     common.insert(it->second); 
for (auto it = mapNew.begin(); it != mapEnd.begin(); ++it) 
    if (mapOld.find(it->second) == mapOld.end()) 
     cout << "file added " << it->second << endl; 
    else 
     common.insert(it->second); 
for (auto it = common.begin(); it != common.end(); ++it) 
    if (mapOld[*it] != mapNew[*it]) 
     cout << "CRC changed for " << *it << endl; 
1

Если у вас есть две карты, с некоторыми различных записей, называемых oldMap и newMap, то вы можете использовать std::set_difference, чтобы получить уникальные записи из обеих карт. См. Следующий пример того, как это можно сделать.

#include <map> 
#include <string> 
#include <algorithm> 
#include <utility> 
#include <iterator> 
#include <iostream> 

int main() { 
    // Two maps containing some values. 
    std::map<std::string, int> oldMap { {"test1", 1}, {"test2", 2}, {"test3", 3} }; 
    std::map<std::string, int> newMap { {"test2", 2} }; 

    // Create new map that holds distinct pairs. 
    std::map<std::string, int> diffMap; 

    // Add distinct pairs to diffMap. 
    std::set_difference(begin(oldMap), end(oldMap), 
         begin(newMap), end(newMap), 
         std::inserter(diffMap, begin(diffMap))); 

    // Output result 
    for (auto& p : diffMap) { 
     std::cout << p.first << " " << p.second << std::endl; 
    } 
} 

Выход:

test1.txt 1 
test3.txt 3 

Эти две записи, которые не найдены в обеих картах.

Смежные вопросы