簡體   English   中英

使用 range-v3 生成 2 個向量

[英]Generate 2 vectors using ranges-v3

我有兩個不同類型的向量,比如說 int 和 double。 我還有第三個帶索引的向量,我想提取與 range-v3 索引對應的兩個第一個向量的值。

現在我有這個

std::vector<int> A {0,1,2,3,4,5,6,7,8};
std::vector<double> B{0,1,2,3,4,5,6,7,8};
std::vector<int> indices{0,2,3};

const std::vector<int> A_slice = indices | 
    ranges::views::transform([](const auto i) {return 2*i;}) | 
    ranges::views::transform([&A](const auto i) {return A[i]}) |
    ranges::to_vector;

const std::vector<double> B_slice = indices | 
    ranges::views::transform([](const auto i) {return 2*i;}) | 
    ranges::views::transform([&B](const auto i) {return B[i]}) | 
    ranges::to_vector;

這不是最有效的方法,因為您需要迭代兩次並進行兩次2*i變換。 一種解決方案是獲取一對向量

const auto AB_slice = indices | 
    ranges::views::transform([](const auto i) {return 2*i;}) | 
    ranges::views::transform([&A, &B](const auto i) {return std::make_pair(A[i], B[i]);}) |
    ranges::to_vector;

但這不同於兩個單獨的向量。 有沒有辦法獲得兩個單獨的向量?

因此,如果您願意,請自己積累它們:

#include <algorithm>
#include <vector>
#include <numeric>
#include <utility>
#include <iostream>
#include <range/v3/all.hpp>
int main() {
    std::vector<int> A {0,1,2,3,4,5,6,7,8};
    std::vector<double> B{0,1,2,3,4,5,6,7,8};
    std::vector<int> indices{0,2,3};

    const auto AB_slice = ranges::accumulate(
        indices | ranges::views::transform([](const auto i) {return 2*i;}),
        std::pair<std::vector<int>, std::vector<double>>(),
        [&](std::pair<std::vector<int>, std::vector<double>> v, int i) { 
            v.first.push_back(A[i]);
            v.second.push_back(B[i]);
            return std::move(v);
        }
    );

    for (auto i : AB_slice.first) {
        std::cout << i << "\n";
    }
    for (auto i : AB_slice.second) {
        std::cout << i << "\n";
    }
}

暫無
暫無

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

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