我可以使用循环将boost::any vector中的元素复制到浮点数的std::vector中。
它的效率很低,因为有50000个值要复制,向量可能会超过50K,我必须将其保存到磁盘的不同文件夹中。所以这是一个瓶颈。
到目前为止,以下方法不起作用
vector<boost::any> v1
vector<float> v2
std::fill(v1.begin().v1.end(),v2) // This will not copy anything.发布于 2021-05-25 19:09:44
根据this的说法,
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提供的东西更有效(这也是一个简单的循环)。
发布于 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>,没有办法不复制它们。
https://stackoverflow.com/questions/67686655
复制相似问题