比较两个地图并识别不同的元素

时间:2013-07-21 16:44:17

标签: c++

按值比较两个地图(std::map<std::string, std::unsigned int>)并识别不同的元素。

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

列表中每个文件的文件列表是以crc计算的。文件名未更改,crc changet。

2 个答案:

答案 0 :(得分:1)

如果您有两个地图,其中包含一些名为oldMapnewMap的不同条目,那么您可以使用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

这两个地图中找不到这两个条目。

答案 1 :(得分: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;