C ++模拟映射函数

时间:2014-07-12 22:58:54

标签: c++ vector functional-programming standards standard-library

我很惊讶我在标准C ++ lib中找不到map函数。现在我使用这个解决方案

template <typename Container, typename InputIterator, typename UnaryPredicate>
Container filter(InputIterator _from, InputIterator _to, UnaryPredicate _pred)
{
    Container collection;
    return std::accumulate(_from, _to, collection, 
        [_pred] (Container acc, const InputIterator::value_type & val) -> Container
        {
            if (_pred(val))
                acc.insert(std::end(acc), val);
            return acc;
        });
}

//////////////////////////////
// usage

    std::vector<int> vec = {0, 1, 2, 3};
    std::vector<int> newVec = filter<decltype(newVec)>(std::begin(vec), std::end(vec),
        [] (int n)
        {
            return n % 2 == 0;
        });

但也许存在一些常见的解决方案


编辑:如下所述,它的过滤功能。好的,这是我的map实施:

template <typename T, typename MapFunction>
T map(T source, MapFunction func)
{
    T collection;
    for (auto val : source)
    {
        collection.insert(std::end(collection), func(val));
    }
    return collection;
}

std::transform以及其他人改变了源集合的问题,但他们应该返回另一个。

1 个答案:

答案 0 :(得分:2)

最接近map(例如,python的内置)将是std::for_eachstd::transform,将函数应用于迭代器对定义的范围:

来自en.cppreference.com的示例,用于原位转换:

int main()
{
    std::string s("hello");
    std::transform(s.begin(), s.end(), s.begin(), std::ptr_fun<int, int>(std::toupper));
    std::cout << s;
}

或者带有lambda函数的for_each,这里我们将每个元素递增1:

int main()
{
    std::vector<int> nums{3, 4, 2, 9, 15, 267};
    std::for_each(nums.begin(), nums.end(), [](int &n){ n++; });
}

<algorithm>标题的一部分。