수안이의 컴퓨터 연구실

  • Mainpage
  • About Me
  • Tags
  • Metapage
  • Notice
  • Location
  • Keywords
  • Guestbook
  • Admin
  • Write an Article
  • Total | 1620973
  • Today | 353
  • Yesterday | 482

Programming/STL2007/03/23 17:27

함수대신 function object를 대입하자

원본 : http://www.debuglab.com/knowledge/functionobject.html

1.요약

이 글을 통해서 배울 수 있는 것은
하나, accumulator 함수란 무엇인가
둘, function object 란 무엇인가
정도 되겠습니다.

이러한 것이 있구나라고 느끼시고, 다음에 비슷한 상황에 처하셨을 때 응용할 수 있는 내용입니다

.
2.본문

STL에는 accumulator 함수가 있습니다. 배열의 합, 리스트의 모든 원소의 곱.. 등등 커다란 자료구조를 순회하면서 특정연산을 하고 싶을 때 사용하시면 됩니다.

다음의 예를 보시면 한 번에 이해하실 수 있습니다.

- 다음의 예 -
// 1에서 10까지 합을 구하는 프로그램 

#include <numeric> 

#include <assert.h> 

using std::accumulate; 



int ADD(int x, int y) {return x + y;} 



void main(int argc, char* argv[]) 

{ 

    int i[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 

    

    int product = accumulate( &i[0], &i[10], 0, ADD); 

    assert( 55 == product); 

} 

다음의 예에서 보셨듯이 자료구조의 처음과 끝을 알리고는 계산에 쓸 함수를 대입해주면 됩니다.

이 예제에서 잠시 언급해야 할 부분은

accumulate 함수는 numeric 헤더파일에 있다는 것과 ( 물론 VC++의 경우입니다.)

그리고 기존의 using namespace std 대신에 using std::accumulate 를 사용했다는 것입니다.

두 개의 차이점은 전자가 std namespace안의 모든 심볼을 디폴트로 사용하겠다는 의미인 반면에 후자는 std namespace 안의 accumulate라는 심볼만 디폴트로 사용하겠다는 의미가 되겠죠.

여기서 디폴트란 std::accumulate 안하고 accumulate라고만 해도 std namespace의 accumulate인지 알아듣는다는 의미입니다.

---------------------------------------------------------

그럼 이쯤에서 accumulate의 구현을 공개하겠습니다.

template<class _II, class _Ty, class _Bop> inline 

_Ty accumulate(_II _F, _II _L, _Ty _V, _Bop _B) 

{ 

    for (; _F != _L; ++_F) 

        _V = _B(_V, *_F); 

    return (_V); 

} 

변수 이름이 징그럽게 생겨서 보기 힘들기는 하지만 별 것 없습니다. 인자부분을 보시면 _F, _L은 처음과 끝 원소의 위치를 나타내죠.. 타입인 _II는 위의 예에서 int*에 대응되겠죠.

_V는 반환할 값의 맨 처음 초기값을 의미하며 그 타입인 _Ty는 int와 대응되겠죠 _B는 특정 연산을 수행할 함수의 주소를 나타내며 그 타입인 _Bop는 위의 예에서 int (*)(int, int) 와 대응되겠죠. 쉽게 풀어서 말하면

< int를 반환하고 int형 인자 2개를 받는 함수의 포인터형 >

전체적으로 정리를 해서 위의 예와같이 accumulate를 사용했다면 컴파일러는 다음과 같은 원형의 accumulate함수를 내부적으로 만들었을 겁니다.

inline 

int accumulate( 

               int* _F, 

               int* _L, 

               int _V, 

               int (*_B)(int, int)); 

자 여기까지 이해를 하셨으면 이제 본론에 들어갈 차례입니다.

일단 다음의 예를 또 보시죠

- 예제 2 -

#include <numeric> 

#include <assert.h> 

using std::accumulate; 



class CAdd 

{ 

public: 

    int operator()(int x, int y) const  { return x + y;} 

}; 



void main(int argc, char* argv[]) 

{ 

    int i[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 

    

    int product = accumulate( &i[0], &i[10], 0, CAdd()); 

    assert( 55 == product); 

} 

차이점은 ADD함수가 사라지고 클래스 CAdd가 나타났으며 당연 함수의 주소를 넘겨야할 곳에 CAdd() 를 넘겨주었습니다.

이 어찌 된 일이며, 이것이 컴파일 되는 이유는 무엇일까요?

-----------------------------------------------------------

CAdd는 () operator를 오버로딩 했습니다. 그러므로 다음과 같은 사용이 가능합니다.

CAdd a; 

int Iam_8 = a( 3, 5); 

이제 시나리오를 다시 생각해봅시다.

예제 2에서 처럼 accumulate 함수를 호출한다면 컴파일러는 어떠한 원형의 accumulate 함수를 만들까요?

다음과 같겠죠..

inline 

int accumulate( 

               int* _F, 

               int* _L, 

               int _V, 

               CAdd _B)); 



그리고 _B는 함수의 포인터처럼 _B(_V, *_F)이렇게 사용될 것이고 문법적으로 아무런 문제가 없습니다. 그렇죠?

이제 글이 끝났습니다.

이런 용도로 만든 클래스를 function object라고 부를 수 있습니다.

함수를 전달하는 것보다 function object를 전달하는 것이 좋은 이유는 무엇일까요?

1. 함수와는 달리 부가적인 정보를 함께 전달할 수 있습니다.
2. 멤버 함수가 inline으로 선언되므로 보다 효율적이 될 수 있습니다.

2번의 경우에는 조금 토를 달아야겠네요. 일반 함수도 inline으로 선언할 수 있는 건 사실이지만 어디선가 그 함수의 주소를 요구한다면 inline으로 만들어 질 수 없습니다. 그렇기 때문에 수행속도에 영향을 받을 것이 확실합니다.그렇게 생각하면 2번은 맞는 말입니다.

테스트 결과도 그렇게 나옵니다.

하지만 주소를 요구하는 accumulate 함수 역시 inline으로 선언된 경우라면 함께 inline으로 만들어질 수 있습니다.

테스트 결과 function object를 사용한 경우와 같은 성능을 보여주었습니다.


3.예제



4.참고

STL Tutorial and Reference Guide
(C++ Programming with the Standard Template Library)
- Addison-Wesley



- 2001.08.19 Smile Seo -
"STL" 카테고리의 다른 글
  • A beginner's tutorial on STL (0)2007/07/17
  • 표준 템플릿 라이브러리(STL, Standard Template L... (0)2007/05/17
  • 함수대신 function object를 대입하자 (0)2007/03/23
  • 정렬과 탐색 루틴이 필요하신 분 (0)2007/03/23
2007/03/23 17:27 2007/03/23 17:27
Posted by webdizen
No Trackback No Comment

Trackback URL : http://www.webdizen.net/blog/trackback/2743

Leave your greetings.

[로그인][오픈아이디란?]

«Prev  1 ... 495 496 497 498 499 500 501 502 503 ... 2998  Next»

RSS HanRSS
Blog Image
webdizen
이 곳은 컴퓨터에 대해 연구하고, 공유하고, 소통하기 위한 연구실입니다. 개인적으로는 OLAP, Data Mining, Semantic Web, Data Modeling에 대해서 연구하고 있습니다.

Categories

전체 (2998)
Webdizen (134)
Life (6)
Diary (16)
Blog (9)
IDEA (1)
Travel (10)
Book (14)
Photo (7)
Movie (7)
Music (13)
Leisure Sports (10)
Funny (5)
Hardware (119)
Software (120)
Windows (5)
Unix & Linux (119)
Installation (4)
Kernel (10)
System (34)
Develop (22)
X-Window (0)
Applicaton (31)
Security (4)
Framework (2)
Hadoop (2)
Programming (805)
Algorithm & Data Structure (1)
Assembly (38)
UNIX/Linux C (95)
C++ (128)
STL (4)
Java (38)
Win32 API (92)
ATL/COM (44)
MFC (151)
.NET (26)
WCF/WPF (4)
C# (28)
Network Programming (17)
Database Programming (12)
OpenGL / DirectX (13)
Multimedia Programming (0)
Game Programming (21)
Parallel Distributed Progra... (0)
Reverse Engineering (0)
Debugging (9)
Python (1)
Ruby (1)
Ruby on Rails (1)
QT (4)
GTK (0)
JSP (0)
PHP (6)
ASP.NET (6)
ASP (3)
Development (28)
Useful Library (2)
Data Modeling (0)
Database (105)
Oracle (4)
MSSQL (41)
MySQL (2)
Data Warehouse (2)
Data Mining (3)
Network (66)
Web (78)
DHTML (4)
XHTML (1)
Javascript (1)
CSS (1)
AJAX (9)
XML (11)
Flex (1)
Silverlight (3)
Security (91)
DoS (1)
Kernel (10)
Scanning (3)
Sniffing (0)
Spoofing (4)
Overflow (28)
Web (11)
Shell (10)
Format String (14)
Window (2)
Embedded (70)
Multimedia (27)
Mobile (14)
Graphic (24)
Management (633)
Knowledge (581)
Hadoop (0)

Notice

  • 메타 블로그 사이트에 등록
  • 새해 맞이 블로그의 변화
  • 블로그 명칭 변경
  • 도메인(www.webdizen.net) 구...
  • TEXTCUBE 1.6.1로 업그레이드...

Tags

  • ShellExcute
  • 인라인 값
  • Video
  • SAX Filters
  • SARG
  • Gimp
  • Web Analytics
  • 추상화
  • Office
  • 공과대학
  • 중앙도서관
  • 서암관
  • lynx
  • 구글수표
  • Objects
  • Wi-Fi
  • Baseline
  • 인덱스
  • 루브르 박물관
  • openssl

Recent Articles

  • ASCII Code의 CRLF 제거 방법.
  • Hadoop 에서 c++ API 이용시....
  • Ubuntu Linux에서 Hadoop 구....
  • 내 심장을 한껏 뛰게한 "국가....
  • 스타 스키마 데이터베이스 설....

Recent Comments

  • ■ 온라인카지노 ▶ http://L....
    asdf 11/21
  • 그리고 혹시 해외여행자보험....
    kim 11/05
  • ★★실제 바다게임장과 똑같....
    asdf 11/04
  • sbsyama.co.to← 짱5000만당....
    asdf 11/04
  • ♡KicaZ??o(???) 바카라사....
    fdsf3fass 11/03

Recent Trackbacks

  • 파일 열기/저장하기 CFileDialog.
    은마군의 나태블록 02/11
  • World IT Show 2008.
    상우 :: Oranzie's BLOG 2008
  • cvs서버 설치하기.
    3인3색 2008
  • 속속 공개되는 Google Chart....
    PHP와 Web 2.0 2007
  • 마방진을 구하는 프로그램.
    Oranzie's BLOG 3 2007

Archive

  • 2009/09 (3)
  • 2009/08 (1)
  • 2009/03 (1)
  • 2009/02 (9)
  • 2009/01 (13)

Calendar

«   2009/11   »
일 월 화 수 목 금 토
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          

Bookmarks

    • Administration
      • IIS.NET
      • NTFAQ
      • OS의 모든 것
      • 리눅스포털
    • Database
      • SQL Server Central
      • SQL Team
    • Development
      • .NET Heaven
      • ASP Alliance
      • ASP.NET 2.0
      • Bullog.net
      • C# Corner
      • C++ (C PlusPlus.com)
      • C++ Reference
      • CodeGuru
      • CodePlex
      • DebugLab
      • Dev Articles
      • Devpia
      • DotNet Junkies
      • DotNet Zone
      • Driver Online
      • GOSU.NET
      • HOONS 닷넷
      • Joinc 팀블로그
      • KOSR
      • MSDN Home Page
      • OSR Online
      • Sky.ph - 개발자 커뮤니...
      • TAEYO.NET
      • The Code Project
      • WindowsClient.net
      • 김상욱의 개발자 Side
      • 조인시 위키
    • Human Networks
      • belief21c's e-space
      • I think I can
      • Invisible Rover's Blog :D
      • Rodman®
      • ■ Feel So Good~! ■
      • 까만 나비
      • 나를 가꾸는 시간.
      • 나만의 즐거움~~!
      • 단녕
      • 상우 :: Oranzie's BLOG
    • Information Technology
      • Microsoft TechNet
      • 지디넷코리아 - 글로벌...
    • Security
      • FoundStone
      • milw0rm
      • NewOrder
      • OpenRCE
      • Phrack.org
      • Reverse Engineering b1...
      • Reverse Engineering Team
      • RootKit
      • SecurityFocus
      • SecurityXploded by Nag...
      • Wow Hacker
      • Zone-H
Textcube
Louice Studio Inc.
Powered by Textcube. Original designed by Tistory.