您的位置:首页 > Web前端

Effectiv STL 37 Use accumulate or for_each to summarize ranges

2017-09-21 11:41 393 查看
<numeric>

accumulate, inner_product, adjacent_difference, and partial_sum

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

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


Calculate the product of a range of numbers

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


point average(其实没看懂书上讲的side effect)

struct Point {
Point(double initX, double initY): x(initX), y(initY) { }
double x, y;
};

list<Point> lp;
...
class PointAverage:
public binary_function<Point, Point, Point> {
public:
PointAverage():numPoint(0), xSum(0), ySum(0) { }
const Point operator()(const Point& avgSoFar, const Point& p) {
++ numPoints;
xSum += p.x;
ySum += p.y;
return Point(xSum / numPoints, ySum / numPoints);
}
private:
size_t numPoints;
double xSum;
double ySum;
};

Point avg =
accumulate(lp.begin(), lp.end(), Point(0, 0), PointAverage());


class PointAverage:
public unary_function<Point, void> {
public:
PointAverage():numPoint(0), xSum(0), ySum(0) {}
void operator()(const Pint& p) {
++ numPoints;
xSum += p.x;
ySum += p.y;
}
Point result() const {
return Point(xSum / numPoints, ySum / numPoints);
}
private:
size_t numPoints;
double xSum;
double ySum;
};
list<Point> lp;
...
Point avg = for_each(lp.each(lp.begin(), lp.end(), PointAverage()).result();


accumulate returns the summary ;

for_each returns a function object;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐