어설프게 손으로 작성한 루프보다 알고리즘이 더 낫다.

알고리즘은 본질적으로 루프다.

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 참조.

유지보수 및 명확성은 코드레벨에서 얼마나 알아보기가 쉬운가에 대한 내용이다. 즉 알고리즘은 알고리즘 이름만으로 대충 어떤 역할을 하는지 알수 있지만 루프는 루프의 코드를 보고 내용을 파악해야만 한다는 것이다.

물론 위의 내용은 상황에 따라 달라질수 있다. 알고리즘으로 구현하기 위해서는 어댑터등을 비비꼬아 사용해야 하지만 루프로는 간단히 구현 가능하다면 루프가 좋은 선택이다. 하지만 대부분의 경우에서 성능이나 명확성에 있어 알고리즘이 좀더 우위에 있다고 한다.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다