如何找到不在另一张地图键中的地图键?

时间:2014-10-15 06:41:11

标签: c++ map

我已宣布两张地图m1m2

映射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。

3 个答案:

答案 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]

LIVE

答案 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

Live example

如果有人想出一个更好的语法来调用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'])