如何用C++17实现任意类型QVector的转换函数?
实现任意类型QVector转换的C++17函数
下面是满足需求的函数实现,它能接收任意类型的QVector,通过传入的转换函数将元素转为目标类型,最后返回新的QVector:
#include <QVector> auto my_function(auto in, auto f) { // 推导转换后的元素类型 using OutType = decltype(f(*in.begin())); QVector<OutType> result; // 预分配内存,避免频繁扩容,提升性能 result.reserve(in.size()); // 遍历原容器,应用转换函数并填充新容器 for (const auto& elem : in) { result.push_back(f(elem)); } return result; }
关键点说明
auto参数:利用C++17的模板参数推导特性,让函数自动适配任意QVector类型(比如QVector<int>、QVector<double>)和任意可调用转换对象(lambda表达式、函数指针、仿函数等)。- 类型推导:通过
decltype(f(*in.begin()))自动获取转换后的元素类型,无需手动指定模板参数。 - 性能优化:调用
reserve(in.size())提前分配足够内存,避免QVector在添加元素时多次扩容,提升遍历和插入效率。
使用示例
#include <QString> // 定义转换lambda:int转QString auto my_lambda = [] (int x) { return QString::number(x); }; QVector<int> in_vector = {1,2,3}; // 转换得到QVector<QString> QVector<QString> res = my_function(in_vector, my_lambda);
你还可以用它实现其他类型转换,比如将整数转为浮点数:
QVector<int> num_list = {4,5,6}; auto float_list = my_function(num_list, [] (int n) { return static_cast<double>(n) / 2.0; });
内容的提问来源于stack exchange,提问作者Alex Nevskiy
相关产品推荐
相关产品推荐

