首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何找到不在另一个map的key中的map的key?

如何找到不在另一个map的key中的map的key?
EN

Stack Overflow用户
提问于 2014-10-15 14:41:11
回答 3查看 150关注 0票数 1

我已经声明了两个映射m1m2

M1的键在m2的键中。但并不是所有的m2密钥都在m1的密钥中。

有没有人能帮我找出与m1的密钥相比,m2中不常见的密钥?

示例

m1包含:

代码语言:javascript
复制
3=> 1  2  4
6=> 3  4 6

m2包含:

代码语言:javascript
复制
3 =>  3  5  6
6 =>  6  4  8
8 =>  2  4  3
10 => 2  5  7  9

输出将是8和10。

EN

回答 3

Stack Overflow用户

发布于 2014-10-15 16:16:36

你可以通过std::set_difference来完成。示例:

代码语言:javascript
复制
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;

结果:

代码语言:javascript
复制
[8,2 4 3][10,2 5 7 9]

LIVE

票数 3
EN

Stack Overflow用户

发布于 2014-10-15 17:06:37

下面是一个解决方案,它通过定义一个新的key_iterator来处理键,它只返回键元素。该解决方案的灵感来自于this post

代码语言:javascript
复制
#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;
}

打印以下代码

代码语言:javascript
复制
8 10

Live example

如果有人想出了一个更好的语法来调用std::set_difference,请继续。

票数 1
EN

Stack Overflow用户

发布于 2014-10-15 14:47:33

您没有指定编程语言,所以这里有一些伪代码:

代码语言:javascript
复制
m2.keySet() - m1.keySet()

像Python这样的语言有一个处理集合的-操作符,所以上面就是所需要的全部内容。

下面是一些实际的Python代码:

代码语言:javascript
复制
>>> m1 = {'x':4, 'y':3}
>>> m2 = {'x':4, 'y':3, 'z':5}
>>> set(m2.keys())-set(m1.keys())
set(['z'])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26376033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档