![](/img/trans.png)
[英]Is there any fast way to convert std::vector<std::vector<float>> to std::vector<float2>?
[英]What will be an efficient way of converting a std::vector<Boost::any> to a std::vector<float>
我可以使用循環將元素從 boost::any 向量復制到 std::vector 的浮點數。
從某種意義上說,要復制 50000 個值是低效的,向量可以增長到 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(...) 是這里最重要的一行 [這樣當您向向量添加越來越多的項目時,您不會重新分配 memory ]。
老實說,我真的不明白如何有效地做到這一點(memcpy-like),因為您有許多不同類型的對象,要將其添加到另一個容器中,您必須將每個對象強制轉換為該類型。 您不可能比使用簡單循環或其他 STL 提供的東西更有效(無論如何這也是一個簡單的循環)。
不復制就無法解決您的問題。 當您將一些浮點數存儲到std::vector<boost::any>
中時,這些浮點數將存儲在 memory 中完全不相關的位置。 這是由應用類型擦除技術引起的。
現場演示: https://godbolt.org/z/a91qWazK7
您可以觀察到這些浮點數的地址與向量內any
對象的地址不同。 這意味着浮點數不存儲在向量的緩沖區本身中。 (理論上,如果boost::any
應用了一些小的緩沖區優化技術,它們可以存儲在這個緩沖區中,這似乎沒有發生。但是,即使那樣,這也無濟於事,因為元素不會連續存儲在 memory 中。)
底線:如果您需要將存儲在std::vector<boost::any>
中的浮點數轉換為std::vector<float>
,那么如果不復制它們就無法做到這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.