【发布时间】:2021-01-14 18:40:12
【问题描述】:
我有两个不同类型的向量,比如说 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;
但这不同于两个独立的向量。 有没有办法获得两个独立的向量?
【问题讨论】:
-
我不知道
ranges的事情,但您是否考虑过存储第一次转换的结果并将其用于 A 和 B? -
范围是惰性的。它们仅在您迭代时进行评估,在这种情况下,在 to_vector 期间。这样做的好处是您不需要存储它。但显然,它的缺点是你必须迭代两次......
-
正常循环会更短、更清晰、运行和编译更快:-)
-
当然,对于这种特殊情况。但这是一个演示示例,询问范围是否可以做一些特别的事情。
-
@jjcasmar,总而言之,您正在寻找
unzip函数。