[英]Replacing data with range-v3
怎么可能得到相同的結果
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);
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.