是否可以在 cpp20 中制作范围向量

adi*_*ain 3 c++ c++20 std-ranges

假设我有 aa vector<vector<int>>。我想ranges::transform以这样的方式使用我得到

vector<vector<int>> original_vectors;
using T = decltype(ranges::views::transform(original_vectors[0], [&](int x){
              return x;
          }));
vector<int> transformation_coeff;
vector<T> transformed_vectors;
for(int i=0;i<n;i++){
    transformed_vectors.push_back(ranges::views::transform(original_vectors[i], [&](int x){
        return x * transformation_coeff[i];
    }));
}
Run Code Online (Sandbox Code Playgroud)

目前在 C++ 中是否可以进行这样的转换或类似的转换?

我知道可以简单地存储transformation_coeff,但在每一步都应用它很不方便。(这将重复多次,因此需要在 中完成O(log n),因此我无法显式应用转换)。

Ran*_*tep 6

是的,你可以有一个范围向量。您的代码中的问题是您在 using 语句中使用了临时 lambda。因此,您稍后推入向量的项目的类型与 不同T。您可以通过首先将 lambda 分配给变量来解决这个问题:

vector<vector<int>> original_vectors;
auto lambda = [&](int x){return x;};
using T = decltype(ranges::views::transform(original_vectors[0], lambda));
vector<T> transformed_vectors;
transformed_vectors.push_back(ranges::views::transform(original_vectors[0], lambda));
Run Code Online (Sandbox Code Playgroud)

  • 这将更难实现,因为每个范围都有不同的类型。您可能可以创建一个范围元组或一系列范围。您能提供您想要使用的不同转换吗? (2认同)