【问题标题】:Finding max elem from a map1 not in map2从不在map2中的map1中查找最大元素
【发布时间】:2018-07-24 22:32:38
【问题描述】:

所以我有 2 个 STL 映射,我在其中从文件中读取数据。它将数据读入一个,直到读入的数据为 0,然后它移动到第二个映射并将数据存储到那个映射中。

我正在尝试在 map1 中找到不在 map2 中的最大元素。这是我的代码:

map<int, int> dataMap1;
map<int, int>:: reverse_iterator i;
map<int, int> dataMap2;
map<int, int>:: iterator j;

for(i = dataMap1.rbegin(); i != dataMap1.rend(); i++) {
    largestNum = i->first;
    j = dataMap2.find(largestNum);
    if(largestNum > j->first) {
        cout << largestNum << endl;
        break;
    } else {
        continue;
    }
}

但是,它并没有按预期工作。它有时会给我正确的输出,但有时它会给我错误的答案。

如果有人可以帮助我,我将不胜感激。

谢谢。

编辑:示例数据 - 2

4

3

6

5

9

0 // 上面这个存储在map1, 0下面的都存储在 地图2

1

4

5

3

【问题讨论】:

  • 您是否已采取措施确保j = dataMap2.find(largestNum); 可以找到largestNum?如果不能,find 将返回 dataMap2.end(),并且除了测试结束之外,您不能使用结束迭代器进行任何其他操作。 j-&gt;first 可能无效。
  • 重读问题。似乎关键是要找到两个地图中都不存在的元素。当你找到它时,它将通过测试j == dataMap2.end()
  • 不相关:如果map&lt;int, int&gt; dataMap1; 中的第二个int 与第一个int 相同,请考虑改用std::set
  • 我该怎么做?另外,有序映射是解决这个问题的最佳数据结构,还是有更好、更有效的数据结构来解决这个问题?
  • 要回答这个问题,我必须看看数据是什么样的以及你是如何使用它的。看看Algorithms Library。里面有一些简洁的东西,比如 std::set_intersectionmax_element 可以把工作变成单行。

标签: c++ input stl maps


【解决方案1】:

据我所知,if 测试出错了。

for (i = dataMap1.rbegin(); i != dataMap1.rend(); i++) {
    largestNum = i->first;
    j = dataMap2.find(largestNum);
    if (j == dataMap2.end()) { // if largestNum not in dataMap2
        cout << largestNum << endl;
        break;
    }
}

【讨论】:

  • 是的,我也想这么多,但如果是,我会改变什么?
  • 如果dataMap2.find()返回迭代器,它不等于dataMap2.end()那么j-&gt;first等于largestNum,所以你不需要做任何事情。
  • 当我使用不同的文件从中读取数据时,它仍然输出 5 即使那不是正确的答案。你知道它为什么会这样吗?
  • @JapFios 除非我能看到那个文件和你用来阅读它的代码。
【解决方案2】:

只需使用std::find_if:

auto it = std::find_if( dataMap1.rbegin(), dataMap1.rend(), [&dataMap2]( const auto &p ) {
    return dataMap2.count( p.first ) == 0;
} );

live example

【讨论】:

  • 当我使用不同的文件从中读取数据时,它仍然输出 5 即使那不是正确的答案。你知道它为什么会这样吗?
  • @JapFios 抱歉我的心灵感应机器今天坏了
猜你喜欢
  • 1970-01-01
  • 2022-07-06
  • 1970-01-01
  • 2020-05-08
  • 2013-05-07
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多