如何扩展std::vector构造函数以适配自定义联合体类型rDATA
解决方案
首先明确:你无法扩展std::vector的构造函数,标准库容器的构造逻辑是固定的,不能随意修改。想要把std::vector<float>转换成std::vector<rDATA>,核心是完成单个float到rDATA的转换,再批量构建新容器。
另外先修正你联合体里的类型拼写错误(避免编译失败):
typedef union { uint32_t uin; // 原uin32_t应为uint32_t int32_t sin; float flt; uint8_t u8n[4]; // 原uitn8_t应为uint8_t } rDATA;
下面提供两种简洁的实现方式:
方法一:循环直接赋值
先创建对应大小的rDATA容器,再逐个赋值flt成员:
std::vector<float> vector_array(array, array + array_size); std::vector<rDATA> DATA_vector(vector_array.size()); for (size_t i = 0; i < vector_array.size(); ++i) { DATA_vector[i].flt = vector_array[i]; }
方法二:用std::transform批量转换
借助<algorithm>里的transform函数,配合lambda表达式完成元素转换,代码更简洁:
#include <algorithm> #include <iterator> std::vector<float> vector_array(array, array + array_size); std::vector<rDATA> DATA_vector; DATA_vector.reserve(vector_array.size()); // 预分配空间,避免多次扩容提升性能 std::transform(vector_array.begin(), vector_array.end(), std::back_inserter(DATA_vector), [](float val) { rDATA temp; temp.flt = val; return temp; });
本质上两种方法都是通过给rDATA的flt成员赋值,利用联合体的内存重叠特性,让其他成员也能访问到对应二进制数据,符合你32位架构下的需求。
内容的提问来源于stack exchange,提问作者qweqwe123123
相关产品推荐
相关产品推荐

