[5 算法] 37. 使用accumulate进行区间统计

对于区间,STL的算法:

count:统计出区间中有多少元素

count_if:统计出满足某个判别式的元素个数

min_element:最小值

max_element:最大值

假如你需要按照自定义的方式对区间进行统计处理,用accumulate,头文件<numeric>。

accumulate有两种形式:

(1)参数是两个迭代器和一个初始值,返回该初始值加上由迭代器标识的区间中的值的总和

list<double> ld;
...
double sum = accumulate(ld.begin(), ld.end(), 0.0);

注意:初始值被指定为0.0,不是0。0的话最后结果会被裁剪。

accumulate只要求输入迭代器,所以你可以使用istream_iterator和istreambuf_iterator:

cout << "The sum of the ints of cin: "
     << accumulate(istream_iterator<int>(cin), istream_iterator<int>(), 0);

(2)参数是一个初始值和一个任意的统计函数

考虑用accumulate来计算一个容器中字符串的长度总和。

string::size_type stringLengthSum(string:size_type sumSoFar, const string& s)
{
    return sumSoFar + s.size();
}

stringLengthSum统计函数有两个参数,一个是目前为止区间中元素的统计值,一个是区间的下一个元素;返回值是新的统计值。size_type是容器中用于计数的类型。

set<string> ss;
..
string::size_type lengthSum = accumulate(ss.begin(), ss.end(), static_cast<string::size_type>(0), stringLengthSum);

同理,计算一个区间中数值的乘积:

vector<float> vf;
...
float product = accumulate(vf.begin(), vf.end(), 1.0f, multiplies<float>());

利用了标准的multiplies函数子类(functor class)。

猜你喜欢

转载自blog.csdn.net/u012906122/article/details/119741197
今日推荐