簡體   English   中英

什么是轉換 std::vector 的有效方法<boost::any>到 std::vector<float></float></boost::any>

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM