【问题标题】:Compute the sum of part of the vector using std:: accumulate使用 std::accumulate 计算部分向量的总和
【发布时间】:2012-10-26 17:38:27
【问题描述】:

有这个向量

vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

如何使用accumulate 函数计算其前半部分的总和(即 15)?

我可以使用只有迭代器(不是数字索引)的 for 循环来做到这一点吗?

【问题讨论】:

    标签: c++ vector accumulate


    【解决方案1】:

    你可以

    accumulate(v.begin(), v.begin()+int(v.size()/2), 0)
    

    如果v 是你的向量。

    你也可以写一个循环:

    int sum = 0;
    for (vector<int>::iterator it = v.begin(); it != v.begin+int(v.size()/2); ++it) {
        sum += *it;
    }
    

    【讨论】:

    • 作为最佳实践,我建议:1. 使用const_iterator,除非你真的需要可变性(只是一般的const 善良)和2. 提前计算end 界限,以使很明显,它在循环期间不会进化。这给出:for(std::vector&lt;int&gt;::const_iterator it = v.begin(), end = v.begin() + v.size()/2; it != end; ++i)。它可以在 C++11 中缩短一点(使用autocbegin)。
    • @Robᵩ 因为我有点太习惯使用花车了 :)
    【解决方案2】:

    要仅使用前半部分,您必须获得仅涵盖该范围的迭代器。通常人们希望使用整个容器,因此他们使用 begin 和 end 函数,但这不是唯一的方法:

    auto begin = std::begin(v);
    auto middle = std::begin(v) + v.size()/2; // works for random access iterators
    
    auto middle = begin;
    std::advance(middle, v.size()/2);
    

    advance 适用于输入迭代器或更好,但对于不是其他类型之一的输入迭代器,高级传递的项目将不再可访问。

    auto middle = std::next(begin, v.size()/2); // C++11. works for forward iterators
    

    这些只是您可以对不同类型的迭代器执行的一些可用操作。


    现在您可以创建指定所需范围的迭代器,您可以在 std::accumulate 或手动 for 循环中使用它们:

    std::accumulate(std::begin(v), std::next(std::begin(v), v.size()/2), 0);
    
    for (auto begin(std::begin(v)), end(begin+v.size()/2); begin!=end; ++begin) {
        ...
    }
    

    【讨论】:

      【解决方案3】:
      accumulate<int>(v.cbegin(), v.cbegin() + v.size()/2, 0);
      

      【讨论】:

        【解决方案4】:

        int sum = std::accumulate(v.begin(), v.begin() + v.size() / 2, 0);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-11-03
          • 2011-10-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-06
          相关资源
          最近更新 更多