簡體   English   中英

用 range-v3 替換數據

[英]Replacing data with range-v3

TL; 博士

怎么可能得到相同的結果

std::copy(std::begin(a), std::end(a), std::begin(b));

使用 range-v3,可能還有它不錯的語法?

編輯

我遇到麻煩的原因是對如何正確使用ranges::copy的誤解:第二個參數必須是迭代器,而不是范圍對象。 我的錯 ;)

盡管如此,我仍然在問是否可以使用某種語法糖來執行ranged assignment ,如下所示:

ranges::???(b) = a | op1 | op2 | ... ; 

問題

我有兩個固定大小的向量(在運行時)。 我需要對第一個向量中的數據執行一些復雜的轉換,並將結果存儲在第二個向量中。 我需要保留第一個向量,但不想創建新的臨時向量。

通用代碼

using namespace std;
vector<double> a;
...
vector<double> b(a.size());

與標准

transform(begin(a), end(a), begin(b), complexFun);

混合標准范圍v3

auto transformation = a | ranges::view::transform(complexFun);
copy(begin(transformation), end(transformation), begin(b));

在這種簡單的情況下,這樣做有點不必要。 但是,如果涉及多個操作,則創建范圍視圖然后使用std::copy特別有用。

我想寫什么

ranges::???(b) = a | ranges::view::transform(complexFun);

我期待的是這個功能已經存在,我無法找到它。

怎么樣:

ranges::transform(a, b.begin(), complexfun);

?

編輯:...或者也許

ranges::copy( a | ranges::views::transform(complexFun), begin(b) );

?

有幾種好方法可以做到這一點。 首先,如果您還沒有目標vector並且想要創建它:

auto b = a | ranges::view::transform(complexFun) | ranges::to_vector;

其次,如果您已經有一個想要重用其容量的目標vector

b.clear(); // Assuming b already contains junk
b |= ranges::action::push_back(a | ranges::view::transform(complexFun));

在這兩種情況下,range-v3 都足夠聰明,可以在目標向量中為ranges::size(a | ranges::view::transform(complexFun))元素保留容量,以避免由於重新分配而導致復制。

暫無
暫無

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

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