Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ 팁&트릭
[3] [STL]for, while, do 등의 루프를 알고리듬으로 대체하는 예제(1)
김백일 [cedar] 5831 읽음    2002-05-01 16:57
: 사용자로부터 10개의 정수값을 입력받아서 다음의 값을 출력하는 프로그램을 작성하시오.
:
: 1.최대값 2. 최소값 3.평균 4.평균보다 큰수의 개수 5. 평균보다 작은수의 개수

예전에는 이런 경우 for와 if를 써서 구현하겠지만,

STL의 알고리듬이란 강력한 도구를 사용하면
구조적 프로그래밍(structured programming)의 핵심 요소인
for, while, do 등의 루프나 if 문 조차도
대부분 대체해서 구현할 수 있습니다.
소스코드도 훨씬 직관적으로 이해할 수 있습니다.

STL의 이러한 특징을 generic programming(일반화(?) 프로그래밍)이라 합니다.
Scheme(Lisp의 변형 언어(dialect), Lisp은 완전한 함수형 언어는 아닙니다.), Haskell과 같은 함수형 프로그래밍(functional programming)과 유사한 성격이지요.
실제로도 리습이나 스킴을 써보셨던 분들이 STL을 써보시면 그런 느낌을 강하게 받으실 수 있으실 겁니다.(저도 스킴을 조금 배워봤죠. 강추하는 언어입니다. 시간나면 다시 해보고 싶은데... -_-;;)

최근의 프로그래밍의 경향은 구조적(SP) -> 객체지향(OOP)를 넘어 일반화(GP)로 가고 있는 듯 합니다.
STL은 GP를 위해 객체지향적(OOP)인 특징을 상당부분 희생시키고, 일반화와 확장성을 최대 목표로 한 라이브러리입니다.(물론 STL의 일반화는 100% 완벽한 것은 아닙니다.)
객체지향(OO)에 지나치게 목숨걸던 시대는 지나간듯... -_-;
STL에 어느정도 맛을 들이게 되면, 자바나 C#, 파스칼(델파이)같이 GP를 지원하지 못하는 언어는 정말 허접해 보이죠. ^^; "역시 C++이 최고다!"라고 느끼게 됩니다.

이 예제에 사용한 알고리듬들은 다음과 같습니다.

copy(), copy_n() 한 범위에서 다른 범위로 원소들을 복사
max_element() 최대값 구하기
min_element() 최소값 구하기
accumulate() 원소의 합 구하기
count_if() 조건을 만족하는 원소의 갯수 세기

//---------------------------------------------------------------------------

#include <iostream>
#pragma hdrstop
#include <iterator>
#include <vector>
#include <algorithm>
#include <numeric>

//---------------------------------------------------------------------------
using namespace std;

#pragma argsused
int main(int argc, char* argv[])
{
     vector<int> vec_int;

     // cin으로부터 입력 받아 vec_int를 채움
     copy_n(istream_iterator<int>(cin), 10, back_inserter(vec_int));

     // vec_int의 내용 출력
     copy(vec_int.begin(), vec_int.end(), ostream_iterator<int>(cout, " "));

     vector<int>::iterator p_max = max_element(vec_int.begin(), vec_int.end());
     cout << "\nMax element = " << *p_max << endl;

     vector<int>::iterator p_min = min_element(vec_int.begin(), vec_int.end());
     cout << "Min element = " << *p_min << endl;

     float avg = static_cast<float>(accumulate(vec_int.begin(), vec_int.end(), 0))
               / static_cast<float>(vec_int.size());
     cout << "Average = " << avg << endl;

     int num_gt_avg = count_if(vec_int.begin(), vec_int.end(), bind2nd(greater<float>(), avg));
     cout << "The number greater than the average = " << num_gt_avg << endl;

     int num_lt_avg = count_if(vec_int.begin(), vec_int.end(), bind2nd(less<float>(), avg));
     cout << "The number less than the average = " << num_lt_avg << endl;

     return 0;
}

+ -

관련 글 리스트
3 [STL]for, while, do 등의 루프를 알고리듬으로 대체하는 예제(1) 김백일 5831 2002/05/01
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.