[英]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.