我已宣布两张地图m1
和m2
。
映射m1的键位于m2的键中。但m2的所有键都不在m1的键中。
任何人都可以帮我找到m2中不常见的密钥与m1的密钥相比吗?
实施例
m1包含:
3=> 1 2 4
6=> 3 4 6
m2包含:
3 => 3 5 6
6 => 6 4 8
8 => 2 4 3
10 => 2 5 7 9
输出为8和10。
答案 0 :(得分:3)
您可以std::set_difference执行此操作。例如:
std::map<int, std::string> m1;
m1[3] = "1 2 4";
m1[6] = "3 4 6";
std::map<int, std::string> m2;
m2[3] = "3 5 6";
m2[6] = "6 4 8";
m2[8] = "2 4 3";
m2[10] = "2 5 7 9";
std::map<int, std::string> m3;
std::set_difference(m2.begin(), m2.end(), m1.begin(), m1.end(), std::inserter(m3, m3.begin()), m1.value_comp());
for (auto i = m3.begin(); i != m3.end(); ++i) {
std::cout << "[" << i->first << "," << i->second << "]";
}
std::cout << std::endl;
结果:
[8,2 4 3][10,2 5 7 9]
答案 1 :(得分:1)
这是一个通过定义新的key_iterator
来处理密钥的解决方案,它只返回关键元素。 this post启发了解决方案。
#include <iostream>
#include<algorithm>
#include<map>
#include<string>
using namespace std;
typedef std::map<int,std::string> MapType;
typedef MapType::iterator IteratorType;
struct key_iterator : public IteratorType
{
key_iterator() : IteratorType() {}
key_iterator(IteratorType it) : IteratorType(it) {}
int* operator->() {return (int* const)& IteratorType::operator->()->first;}
int operator*() {return IteratorType::operator*().first;}
};
int main() {
std::map<int,std::string> m1;
m1[3]="1 2 4";
m1[6]="3 4 6";
std::map<int,std::string> m2;
m2[3]="3 5 6";
m2[6]="6 4 8";
m2[8]="2 4 3";
m2[10]="2 5 7 9";
std::vector<int> v;
key_iterator it1_begin=m1.begin();
key_iterator it1_end=m1.end();
key_iterator it2_begin=m2.begin();
key_iterator it2_end=m2.end();
std::set_difference(it2_begin, it2_end, it1_begin, it1_end, std::inserter(v,v.begin()));
for(auto i : v)
std::cout<<i<<" ";
std::cout<<std::endl;
// your code goes here
return 0;
}
此代码打印
8 10
如果有人想出一个更好的语法来调用std::set_difference
,请继续。
答案 2 :(得分:0)
你没有指定编程语言,所以这里有一些伪代码:
m2.keySet() - m1.keySet()
像Python这样的语言有一个-
运算符可以在集合上运行,所以上面就是所需要的。
以下是一些实际的Python代码:
>>> m1 = {'x':4, 'y':3}
>>> m2 = {'x':4, 'y':3, 'z':5}
>>> set(m2.keys())-set(m1.keys())
set(['z'])