如何归纳作用于(相同类型)元素向量的函数?

时间:2018-09-01 20:24:34

标签: c++ c++11 templates stdvector

我是C ++的新手,我似乎无法正确地表达我的问题,因为矢量化和映射的含义似乎与我所寻找的含义不同(因此,使用Google搜索解决方案很困难)。

我有许多函数作用于任意类型的单个对象。我想要一种通用方法(即模板或包装函数)将它们转换为作用于任意数量的相同类型对象的向量的函数。一个例子:

strrpos()

模板似乎是必需的,但是我对它们还没有太多的经验,也不知道在这种情况下如何应用它们。欢迎任何参考/建议/意见。 (还请添加相关标签-因为我不确定为此使用的正确术语,因此不确定如何对其进行标签。)

3 个答案:

答案 0 :(得分:3)

此代码确实确实适合某些模板。

template <typename T, typename TFunc>
std::vector<T> transform(const std::vector<T> &v, TFunc &&func)
{
    std::vector<T> result;
    result.reserve(v.size());
    for (auto &&element : v)
        result.push_back(std::invoke(func, element));
    return result;
}

您可能会注意到,该函数看起来与std::transform非常相似,它在迭代器而不是向量上起作用。可以称为:

 auto result = transform(v, &func1);

答案 1 :(得分:1)

是的,您将需要模板,因为您不知道将使用此矢量化功能的类型。

让我们尝试一下:

<template>
  <!-- v-bind 'setting' data to config file uploader -->
  <!-- bind event 'done' to receive file uploaded info -->
  <v-uploader :setting="uploadConfig" @done="uploadDone" ></v-uploader>
</template>

<style lang="css">
.info-show{
    margin-top:10px;
}
</style>

<script>
export default {
    data(){
        return {                
            uploadConfig: {
                multiple: true,
                language: 'en', //default: 'cn'
                itemLimit: 5,
                fileSizeLimit:'3MB',
                fileTypeExts: ['jpeg', 'jpg', 'png']
            }
        }
    },
    methods:{
        //receive file uploaded info
        //@type Array
        uploadDone(files){
            if(files && Array.isArray(files) && files.length){
                // do something...
            }
        }
    }
};
</script>

答案 2 :(得分:1)

正如评论中提到的@ paler123一样,您可以使用std::transform来完成这项工作以及一个小的模板化函数。

由于您的两个函数在函数签名上具有相似性

i.e, Type function(Type arg)

我选择键入函数指针作为模板函数参数。

template<typename Type>
std::vector<Type> func(const std::vector<Type>& a_vec, Type(*func)(Type))
{
    std::vector<Type> out_vec; out_vec.reserve(a_vec.size());
    std::transform(a_vec.begin(), a_vec.end(), std::back_inserter(out_vec), func);
    return out_vec;
}

现在在main()中,您可以显式指定类型,也可以保留原样,让编译器进行类型推导。

auto result = func<int>({ 1,2,3,4 }, func1);
// also can
auto result2 = func({ 1, 2, 3, 4 }, func2);

请参见 sample output here