STL 에서는 아래와 같이 특정 범위에 대한 연산을 준비해 놓고 있다.
count | 범위 내의 요소 개수를 센다. |
count_if | 조건에 맞는 요소 개수를 센다. |
min_element | 범위내의 최소값을 얻는다. |
max_element | 범위내의 최대값을 얻는다. |
하지만 위의 네가지 알고리즘 보다 좀더 융통성 있는 무언가를 해야 할 경우가 있다. 이 경우 accumulate 나 for_each 를 사용 할수 있다. 예를 들어 double 형 리스트의 총합을 알고 싶을 경우 accumulate를 아래와 같이 사용할 수 있다.
list<double> ld;
….
double sum = accumulate(ld.begin(), ld.end(). 0.0);
예를 들어 컨테이너 안에 들어있는 string 객체의 문자열 길이의 합을 계산하는데 사용가능하다.
string::size_type
stringLengthSum(string::size_type sumSoFar, const string& s)
{
return sumSoFar+s.size();
}
set<string> ss;
…
string::size_type lengthSum =
accumulate(ss.begin(), ss.end(), 0, stringLengthSum);
vector<float> vf;
…
float product =
accumulate(vf.begin(), vf.end(), 1.0, multiplies<float>() );
사용자 클래스에 대한것 역시 가능하다.
// 사용자 클래스
struct Point{
Point(double initX, double initY): x(initX), y(initY) {}
double x,y;
}// 적용될 함수자. 자세한 내용은 EffectiveSTL40을 참조
class PointAverage : public binary_function<Point, Point, Point> {
public:
PointAverage() : xSum(0), ySum(0), numPoints(0) {}
const Point operator() (const Point& avgSoFar, const Point& p)
{
++numPoints;
xSum += p.x;
ySum += p.y;
return Point(xSum/numPoint, ySum/numPoint);
}private:
size_t numPoints;
double xSum;
double ySum;
};// 실제 사용예
list<Point> lp;
…
Point avg =
accumulate(lp.begin(), lp.end(), Point(0,0) PointAverage());
// EffectiveSTL 40 참조
class PointAverage : public unary_function<Point, void> {
public:
PointAverage() : xSum(0), ySum(0), numPoints(0) {}
void operator()(const Point& 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.begin(), lp.end(), PointAverage()).result();