【问题标题】:Merge multiple evensized vectors合并多个大小均匀的向量
【发布时间】:2020-08-14 15:55:18
【问题描述】:

我有 n 个偶数大小的 std::vectors。让我们假设 n=3 和 size = 4:

std::vector<int> a {1,2,3,4};
std::vector<int> b {2,2,2,2};
std::vector<int> c {3,3,3,3};
std::vector<std::vector<int>> combinedVectors {a,b,c};

我想检索一个大小为 4 的向量,它的 ith 成员是所有向量的 ith 成员的总和。 在示例中

std::vector<int> x{6,7,8,9};

构建矢量x 的最佳通用方法是什么?请在您的回答中坚持 cpp17 标准。

最好的方式是我想坚持&lt;algorithm&gt; 而不是使用循环。

【问题讨论】:

  • 一个添加元素并将它们插入到已经适当大小的向量中的循环?什么是“最好的”?
  • @idclev463035818 尽可能使用算法头而不是循环。
  • 我认为没有任何标准算法可以对范围范围进行操作。要使用它们,您必须推出一些带有迭代器的类,以允许访问存储在类中的不同向量。很有可能,但可能不值得仅仅编写两个循环。
  • 常见误解:“&lt;algorithm&gt; 而不是使用循环”。大多数算法只是一个循环。我想您的意思是“手写循环”,但是当没有开箱即用的算法可以满足您的要求时,手写循环通常是“更好”的替代方案

标签: c++ vector stl c++17 stdvector


【解决方案1】:

没有将范围范围作为参数的算法(嗯,它们确实如此,但草率的算法适用于元素而不是元素的元素)。 std::ranges 可能会有所帮助,但如果你想坚持使用 C++17,你只能使用现有的算法,但有一些变形或编写自己的算法。

#include <vector>
#include <iostream>

template <typename IT,typename...Args> 
void copy_sum(IT begin, IT end, IT to, Args... others) {
    for (; begin != end; ++begin,++to){
        *to = *begin + (*others++ + ...);
    }
}


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

    std::vector<int> result(a.size());
    copy_sum(a.begin(),a.end(),result.begin(),b.begin(),c.begin());

    for (auto e : result) std::cout << e << " ";    
}

请注意,我没有使用combinedVectors。如果您想保持通用性,则将迭代器传递给容器而不是容器。不过,上述内容可能会受益于将beginend 带到combinedVectors 中的一系列元素并将它们的beginend 转发到copy_sum 的助手。

然而,这并不是我所说的“最好的”,只要你继续使用 C++17,一个简单的循环在可读性方面可能是无与伦比的。

【讨论】:

    【解决方案2】:

    如果你真的下定决心要使用algorithm 库,你可以有类似的东西:

    std::vector<int> tmp;
    std::vector<int> result;
    
    std::transform(
        std::begin(a), std::end(a),
        std::begin(b),
        std::back_inserter(tmp),
        [](int a, int b) { return a + b; }
    );
    
    std::transform(
        std::begin(c), std::end(c),
        std::begin(tmp),
        std::back_inserter(result),
        [](int a, int b) { return a + b; }
    );
    

    缺点是您需要一个临时的std::vector

    【讨论】:

      猜你喜欢
      • 2013-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多