알고리즘은 본질적으로 루프다.
class Object{
public:
…
void redraw() const;
…
};//…
list<Object> lw;
// 루프
for( list<Object>::iterator i=lw.begin(); i != lw.end(); i++ ){
i->redraw();
}// 알고리즘
for_each(lw.begin(), lw.end(), mem_fun_ref(&Object::redraw));
|
우선 효율면에서 어째서 알고리즘이 더 좋은지를 살펴보면 루프에서 자주 호출되는 lw.end() 같은 반복자 관련 함수 호출을 생각할수 있다. 우선 이런 불필요한 함수 호출을 알고리즘 내에서는 최대한 줄이고 있다.
또한 알고리즘 자체가 STL을 만든 사람에 의해서 만들어졌으므로 좀더 STL의 구현 원리와 코드를 직접적으로 사용할수 있다. 게다가 일반 프로그래머가 따라가기 힘든 훨씬 세련된 컴퓨터 공학적인 코드로 구현되어 있다.(연속메모리 컨테이너에서 몇개의 객체를 제거하는 등의 평범한일(erase-remove 합성)조차 알고리즘이 더 효율적이라 한다.)
정확성에 관한것은 책참조
배열에 있는 값을 41씩 더해서 deque에넣는 작업을 루프와 알고리즘으로 구현.
간단히 요약하면 반복자 무효화에 대한 처리, 삽입 위치 처리, 기타 등등 루프에서 처리할게 많다! 라는 내용임
EffectiveSTL09, EffectiveSTL30 참조.
배열에 있는 값을 41씩 더해서 deque에넣는 작업을 루프와 알고리즘으로 구현.
간단히 요약하면 반복자 무효화에 대한 처리, 삽입 위치 처리, 기타 등등 루프에서 처리할게 많다! 라는 내용임
EffectiveSTL09, EffectiveSTL30 참조.
유지보수 및 명확성은 코드레벨에서 얼마나 알아보기가 쉬운가에 대한 내용이다. 즉 알고리즘은 알고리즘 이름만으로 대충 어떤 역할을 하는지 알수 있지만 루프는 루프의 코드를 보고 내용을 파악해야만 한다는 것이다.
물론 위의 내용은 상황에 따라 달라질수 있다. 알고리즘으로 구현하기 위해서는 어댑터등을 비비꼬아 사용해야 하지만 루프로는 간단히 구현 가능하다면 루프가 좋은 선택이다. 하지만 대부분의 경우에서 성능이나 명확성에 있어 알고리즘이 좀더 우위에 있다고 한다.