【问题标题】:Find the max and min element above a threshold in a container查找容器中阈值以上的最大和最小元素
【发布时间】:2016-06-08 18:20:58
【问题描述】:

我有一个看起来像这样的容器:std::map<size_t, std::set<char>>

我想根据std::set 的大小找到阈值x 以上的绝对最大元素和最小元素。

我可以使用以下行获取最大值和最小值:

auto minMaxElements = std::minmax_element(cbegin(map), cend(map), 
    [](const auto &lhs, const auto &rhs){
        return lhs.second.size() < rhs.second.size();
    });

是否可以使用 std::minmax_element 使最小元素高于阈值x

示例: 假设我有一个 std::map5 元素。 std::set 值的大小为1, 2, 1, 10, and 5。我将阈值设置为1,然后我希望最大元素给出包含std::set 大小为10 的迭代器,最小元素给出包含std::set 大小为2 的迭代器。

【问题讨论】:

  • 排序不是最有效的方法吗?
  • 地图由size_t 索引,我希望它保持这种状态。我不希望它使用值的大小来制作地图。
  • keymap 的可能值是什么?如果size_t 指定set 的大小,它是map 的值部分,那么map 不会存储所有集合。
  • 密钥与集合的大小无关。
  • 你可能会看一些range library,然后你可以在filtered视图上做std::minmax_element

标签: c++


【解决方案1】:

您可以使用std::find_if 来做到这一点

auto it = std::find_if(map.begin(), map.end(), 
   [x](const auto & l) -> bool { 
      return l.second.size() >= x;    // >= or >, depending upon requirement
   }
);

然后在你的std::minmax_element中使用这个迭代器

auto minMaxElements = std::minmax_element(it, map.end(), 
    [](const auto & lhs, const auto & rhs) {
        return lhs.second.size() < rhs.second.size();
    }
);

【讨论】:

  • 但如果我这样做了,难道我还有机会获得低于我的阈值的最小元素吗?就像,如果大小是:1、2、1、10 和 5(按该顺序存储在地图中)。如果阈值为 1.auto it 将指向 2,end 将指向 5。在该阈值范围内,最小值为 1,最大值为 10。
  • @user3666471 std::find_if 只会迭代到高于阈值x 的元素。尝试运行它并查看结果。
猜你喜欢
  • 2014-07-21
  • 1970-01-01
  • 2013-12-15
  • 1970-01-01
  • 2020-05-08
  • 2012-10-18
  • 2019-01-21
  • 2012-09-16
  • 2021-12-25
相关资源
最近更新 更多