簡體   English   中英

兩個以上向量的 std::transform

[英]std::transform for more than two vectors

假設我想將兩個向量ab添加到向量c

std::vector<double> a, b, c;
//Fill/Initialize vectors

我可以使用std::transform()或簡單for -loop:

//std::transform
std::transform(a.begin(),
               a.end(),
               b.begin(),
               c.begin(),
               [](const auto &a_val, const auto &b_val){
                  return a_val + b_val;
               });
//Loop
for(size_t i = 0; i < a.size(); ++i){
    c[i] = a[i] + b[i];
}

通常,與for循環相比,建議使用std::transform() 不幸的是,據我所知,我不能使用std::transform()來做類似的方法來添加兩個以上的向量,即如果我想將向量abc加到 d 中. 然后我回到 for 循環,或者我必須使用兩輪std::transform() 或者有沒有辦法使用單個std::transform()操作(或類似的東西)同時對兩個以上的輸入向量進行操作?

確實,在標准庫中, std::transform不可能超過 2 個向量。 但是使用range-v3您可以使用zip對任意數量的向量進行操作。

#include <include/range/v3/view/zip.hpp>

int main()
{
    std::vector<int> a{1,2,3};
    std::vector<int> b{2,3,4};
    std::vector<int> c{2,3,4};
    std::vector<int> d{2,3,4};

    std::vector<int> res;
    auto r = ranges::views::zip(a, b, c, d);
    std::transform(
        r.begin(),
        r.end(),
        std::back_inserter(res),
        [](const auto& tup) { return std::get<0>(tup); }
    );
}

如果您可以創建另一個向量,您可以這樣做:

#include <iostream>
#include <vector>
#include <numeric>
#include <algorithm>

int main() {
    std::vector<int> a{1,2,3,4};
    std::vector<int> b{1,2,3,4};
    std::vector<int> c(a.size());

    std::vector<int> v(a.size());
    std::iota(v.begin(), v.end(),0);

    std::transform(v.begin(),
               v.end(),
               c.begin(),
               [&](const auto &i){
                  return a[i] + b[i];
               });

    for (const auto& e : c) std::cout << e << ' ';
    return 0;
}

您可以將 lambda 變成更通用的東西,例如,一個適用於可變數量向量並添加它們的元素的函子。

但是,我更喜歡循環。 算法的主要優點是清晰度,但如果您需要采用變通方法,清晰度就會丟失。 也許有人可以證明我錯了,並找到一種可以開箱即用的算法;)。

PS:再想一想,上面的內容真的很愚蠢,而且是對算法的誤用。 std::iota的幫助下,任何循環都可以輕松地轉換為使用算法,但是std::transform “將一個范圍轉換為另一個范圍”的真正含義完全喪失了,這首先破壞了使用算法的目的.

暫無
暫無

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

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