按值比较两个地图(std::map<std::string, std::unsigned int>
)并识别不同的元素。
typedef std::map<std::string /* file name*/, unsigned int /*crc*/> mMap;
列表中每个文件的文件列表是以crc计算的。文件名未更改,crc changet。
答案 0 :(得分: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
这两个地图中找不到这两个条目。
答案 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;