簡體   English   中英

轉換一個std :: vector <boost::optional<double> &gt;到std :: vector <double>

[英]Convert a std::vector<boost::optional<double>> to a std::vector<double>

我有一個std::vector<boost::optional<double>>foo說。 在此特定實例中,我需要一個std::vector<double> ,其中其他向量中的任何“可選”元素都將映射為新元素中的0。

我是否為此缺少一線解決方案?

另一個選擇是不滿意

std::vector<double> out(foo.size());
for (auto& it : foo){
    out.push_back(it ? *it : 0.0);
}

我歡迎基於std::optional的解決方案,即使我還沒有使用該標准。

std::transform解決方案:

std::vector<double> out(foo.size());
std::transform(foo.begin(), foo.end(), out.begin(), [](const auto& opt){ return opt.value_or(0.0); });

編輯:添加了out定義。

這是一種使用所需值構造輸出vector的解決方案。 雖然仍然不能被迫上一行。

auto valueOrZero = [](auto opt){ return opt?*opt:0.0; };
std::vector<double> out(boost::make_transform_iterator(std::begin(foo), valueOrZero), boost::make_transform_iterator(std::end(foo), valueOrZero));

不幸的是, boost::transform_iterator要求為最終迭代器指定一元轉換函數,您不能只重復lamdba定義,因為它還要求兩個迭代器具有完全相同的類型。 這迫使lambda進入自己的行。

我認為有可能編寫一個可解決此問題的轉換迭代器,但您必須從頭開始。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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