将 std::vector<Boost::any> 转换为 std::vector <float>的有效方法



我可以使用循环将元素从boost::any向量复制到float的std::向量。

它的效率很低,因为有50000个值要复制,vector可以增长到50K以上,我必须将保存到不同文件夹中的磁盘中。所以这是一个瓶颈。

到目前为止,以下不起作用

vector<boost::any> v1
vector<float> v2
std::fill(v1.begin().v1.end(),v2) // This will not copy anything.

据此,

vector<boost::any> v1;
vector<float> v2;
v2.reserve(v1.size());
std::transform(std::begin(v1), std::end(v1), std::back_inserter(v2), 
[] (const auto& v1_val) { return boost::any_cast<float>(v1_val); });

将起作用。

reserve(…(是这里最重要的一行[这样在向向量添加越来越多的项时就不会重新分配内存]。

老实说,我真的不知道如何有效地完成它(类似memcpy(,因为你有很多不同类型的对象,要将它添加到另一个容器中,你必须将每个对象强制转换为该类型。你不可能比简单的循环或其他STL提供的东西(无论如何,这也是一个简单的循环(更有效地做到这一点。

如果不复制,问题就无法解决。当您将一些浮点存储到std::vector<boost::any>中时,这些浮点将存储在内存中完全不相关的位置。这是由应用的类型擦除技术引起的。

现场演示:https://godbolt.org/z/a91qWazK7

您可以观察到,这些浮点的地址与向量中any对象的地址不同。这意味着浮点值不会存储在向量的缓冲区中。(理论上,如果boost::any应用小缓冲区优化技术,它们可以存储在这个缓冲区中,但这似乎没有发生。然而,即使这样,这也无济于事,因为元素不会连续存储在内存中。(

底线:如果您需要将浮点存储在std::vector<boost::any>std::vector<float>中,那么如果不复制它们,就无法做到这一点。

相关内容

  • 没有找到相关文章

最新更新