【问题标题】:c++11 insert into collection with a lambda functional mapc++11 使用 lambda 函数映射插入集合
【发布时间】:2015-09-21 20:49:03
【问题描述】:

std 集合不提供功能性映射接口来填充集合,这有点令人恼火

std::vector< int > oldV = {1,3,5};
std::vector< int > newV = (oldV % [&](int v)-> int{ return v+1; });
newV.insert( oldV.begin(), oldV.end(), [&](int v)-> int{ return 2*v; });

是否有一个简单的头库可以实现带有std 集合的函数式编程的包装器?

【问题讨论】:

    标签: c++11 dictionary lambda functional-programming


    【解决方案1】:

    我看不出有什么方法可以同时适用于std::vectorstd::unordered_set 之类的东西,而无需为每个容器重复操作符定义。在向量的情况下,它会是这样的:

    #include <iostream>
    #include <vector>
    
    
    template <typename T, typename Lambda>
    std::vector< T > operator |(const std::vector< T >& input, Lambda map)
    {
            std::vector< T > output;
            for (const T& elem : input)
                    output.push_back( map(elem) );
            return std::move(output);
    };
    
    int main()
    {
            std::vector< int > oldV = {1,3,5};
            std::vector< int > newV = oldV | [&](int v) -> int { return v + 1; };
            for(int i=0; i< newV.size() ; i++)
            {
                    std::cout << newV[i] << std::endl;
            }
    };
    

    对于std::unordered_set,您只需将push_back 替换为insert

    这里的 pipe operator 具有与 Unix/Linux shell 和某些语言相同的众所周知的语义

    【讨论】:

      【解决方案2】:

      您可以使用std::generatestd::transform 来执行此操作。

      【讨论】:

        猜你喜欢
        • 2012-11-10
        • 2012-01-14
        • 1970-01-01
        • 1970-01-01
        • 2019-01-24
        • 2015-03-18
        • 2010-09-07
        • 2011-02-02
        • 1970-01-01
        相关资源
        最近更新 更多