【问题标题】:Is there a variant of min_element which takes a projection function?是否有带有投影函数的 min_element 变体?
【发布时间】:2013-07-18 09:59:38
【问题描述】:

std::min_element 将返回由operator<(T,T) 或自定义谓词bool Pred(T,T) 定义的最小元素。是否有类似的函数返回投影函数f(T)->R 取最小值的元素?

显然我可以定义bool Pred(t1,t2) { return f(t1) < f(t2); },但是当 f 是 lambda 时,这有点不方便。

【问题讨论】:

  • 计算f 的导数。 好吧好吧,我知道那是个糟糕的玩笑
  • 但是当银行使用衍生品时,它引发了金融危机更糟糕的笑话 :P
  • 如果 f 是一个 lambda,你可以将它传递给一个 C++1y 高阶多态 lambda []( auto f ) { return [](auto t1, auto t2){ return f(t1) < f(t2); }; } (认为我平衡了括号。)当然这是计算量的两倍根据需要。
  • 您是否正在寻找一种无需多次编写 投影 R(T) 且不会弄乱外部范围的方法?
  • @refp:这就是问题的要点。

标签: c++ algorithm c++11 iterator projection


【解决方案1】:

为什么不使用Boost.Iterator library 中的boost::transform_iterator(以前称为projection_iterator_adaptor

auto Pred = [](some_value_type const& x){ /* your lambda here */ };
auto result = std::min_element(
    boost::make_transform_iterator(begin(container), Pred),    
    boost::make_transform_iterator(end(container), Pred)
).base(); 
//^^^^^^^  <-- to get back an iterator to the original sequence

与编写特殊的 less 谓词相比,这样做的优点是您可以将这种方法重复用于所有其他算法(例如,对于 std::max_element,您需要一个特殊的更大谓词等)。

【讨论】:

    【解决方案2】:

    为什么不直接定义一个谓词生成器less_by,它接受一个 lambda,返回一个为您完成工作的函子?

    template <typename Proj>
    struct less_by_t {
        Proj p;
    
        template <typename T>
        bool operator ()(T const& a, T const& b) const {
            return p(a) < p(b);
        }
    };
    
    template <typename Proj>
    less_by_t<Proj> less_by(Proj p) {
        return {p};
    }
    
    auto result = std::min_element(begin, end, less_by([](T const& x){return …;}));
    

    【讨论】:

    • 不错,但是如果 Proj 很贵呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    • 1970-01-01
    • 2019-03-02
    • 2014-05-11
    • 2016-01-15
    相关资源
    最近更新 更多