首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将std::vector<Boost::any>转换为std::vector<float>的有效方法是什么

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

Stack Overflow用户
提问于 2021-05-25 19:03:51
回答 2查看 52关注 0票数 0

我可以使用循环将boost::any vector中的元素复制到浮点数的std::vector中。

它的效率很低,因为有50000个值要复制,向量可能会超过50K,我必须将其保存到磁盘的不同文件夹中。所以这是一个瓶颈。

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

代码语言:javascript
运行
复制
vector<boost::any> v1
vector<float> v2

std::fill(v1.begin().v1.end(),v2) // This will not copy anything.
EN

回答 2

Stack Overflow用户

发布于 2021-05-25 19:09:44

根据this的说法,

代码语言:javascript
运行
复制
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); });

都会起作用的。

..。保留(...)是这里最重要的一行,所以当你向向量中添加越来越多的项目时,你不会重新分配内存。

老实说,我真的不知道如何有效地做这件事(类似memcpy),因为你有许多不同类型的对象,要将它添加到另一个容器中,你必须将每个对象都转换为那个类型。您不可能比使用简单的循环或其他STL提供的东西更有效(这也是一个简单的循环)。

票数 2
EN

Stack Overflow用户

发布于 2021-05-25 20:17:18

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

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

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

底线:如果你需要将存储在std::vector<boost::any>中的浮点数转换成std::vector<float>,没有办法不复制它们。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67686655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档