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

C/C++ Q/A
[1497] 비교 함수 객체가 필요합니다.
김백일 [cedar] 1789 읽음    2002-11-07 01:06
임양규 님이 쓰신 글 :
: 안녕하세요??
:
: 오늘 부터 김백일 님이 추천해주신 Accelerated C++로 C++을 시작한 초보입니다.
:
: 하다보니 재미가 나네요...
:
: 그런데...설명을 보고 나서...다음과 같은 예제를 만들려고 하니 잘 안되네요...
:
: 제가 하고 싶은 것 : string을 입력 받은 후((ctrl+z)로 입력 끝), 입력 받은 문자열 중에서 제일 긴 문자열과 제일 짧은 문자열을 출력하고 싶습니다.
:
: 예) aaabbb aaa pppp
:
: ==> max string : aaabbb       min string : aaa
:
: 제가 작성한 코드는 다음과 같은데요...
: #include <vector>
: #include <string>
: #include <algorithm>
: #include <iostream>
: #include <ios>
: #include <iomanip>
: using std::cout;
: using std::cin;
: using std::vector;
: using std::sort;
: using std::endl;
: using std::string;
: int main(int argc, char* argv[])
: {
:         cout << "input a string : ";
:         string x;
:         vector <string> str;
:         while(cin>>x) str.push_back(x);
:         typedef vector<string>::size_type sz;
:         sz size=str.size();
:         if (size==0) {
:                 cout <<endl <<"input a string." <<endl;
:                 return 1;
:         }
:
:         string *max=max_element(str.begin(),str.end());
:         string *min=min_element(str.begin(),str.end());
:         cout <<"Max String : " << *max << endl;
:         cout <<"Min String : " << *min << endl;
:         return 0;
: }
:
: 이 예제를 실행하면
:
: 입력 : aaa b ccccc zz
:
: 결과 : Max string : zz
:        Min string : aaa
:
: 즉, ascii 코드 값 갖고 찾아주는 거 같네요...
:
: 제대로 된 결과인  Max String : ccccc   Min String : b
:
: 이렇게 하려고 합니다.
:
: c로 하면야 쉽지만 새로운 개념으로 접근하려고 하니 힘드네요...

알고나면, C++이 더 쉽다는 걸 알 수 있습니다. ^^;

: 아시는 분 손좀 봐주세요~~

STL 알고리듬 중에는 max_element와 min_element와 같이
원소들간의 순서 관계가 정의되어야 하는 것이 많습니다.
이러한 순서 관계를 명시적으로 지정하지 않으면,
디폴트로 operator<()를 호출하여 결정합니다.

여기서는 string이므로 string::operator<()를 호출한다는 의미지요.
string::operator<()는 문자열의 사전식(lexicographic) 순서를 리턴합니다.
(좀 더 저수준으로 말하면, 님의 표현대로 'ASCII 코드 값' 순서지요.)

님이 원하시는 결과처럼, 문자열의 길이를 기준으로 하려면,
별도의 비교 함수 객체(function object)를 만든 후,
max_element와 min_element의 세번째 인자로 이 함수 객체를 지정하면 됩니다.

다음은 제가 만들어본 코드입니다. 님의 코드와 무엇이 다른지를 잘 보세요.

//---------------------------------------------------------------------------
#include <iostream>
#include <string>
#pragma hdrstop
#include <vector>
#include <iterator>
#include <algorithm>
//---------------------------------------------------------------------------
using namespace std;

// 문자열 길이를 비교하는 함수 객체의 정의입니다.
struct comp_length {
    bool operator()(const string& lhs, const string& rhs)
    { return lhs.length() < rhs.length(); }
};

#pragma argsused
int main(int argc, char* argv[])
{
    cout << "Input a string: ";
    // 벡터에 문자열을 채우려면, 다음과 같이 한 줄의 코드로도 가능합니다.
    // STL의 입력 반복자(input iterator)와 벡터의 생성자를 사용한겁니다.
    vector<string> v_str((istream_iterator<string>(cin)), // istream_iterator... 부분에
                          istream_iterator<string>());    // 괄호()를 반드시 씌워야합니다.
                                                          // 안 그러면, 컴파일 에러가 납니다.

    vector<string>::iterator // string* 보다는 이렇게 하는 것이 더 좋습니다.
        min_lexicographic = min_element(v_str.begin(), v_str.end()),
        max_lexicographic = max_element(v_str.begin(), v_str.end()),
        min_length = min_element(v_str.begin(), v_str.end(), comp_length()),
        max_length = max_element(v_str.begin(), v_str.end(), comp_length());
        // comp_length의 임시 객체가 생성되면서, operator()가 호출됩니다.
        // 함수 포인터보다 훨씬 빠른 방법입니다.

    cout << "The lexicographically first string: " << *min_lexicographic << endl
         << "The lexicographically last string: " << *max_lexicographic << endl
         << "The minimum length string: " << *min_length << endl
         << "The maximum length string: " << *max_length << endl;

    return 0;
}
//---------------------------------------------------------------------------

물론 결과는 다음과 같습니다.

Input a string: aaa b ccccc zz^Z
The lexicographically first string: aaa
The lexicographically last string: zz
The minimum length string: b
The maximum length string: ccccc

P.S.) C++이 재미있으시다니 반갑네요. STL은 정말 재미있는 도구입니다.
열심히 공부해보시길...

+ -

관련 글 리스트
1496 vector 간단한 예제좀 봐주세요~~ 임양규 1886 2002/11/06
3689     Re:vector 간단한 예제좀 봐주세요~~ 임양규 1444 2002/11/07
3688     Re:vector 간단한 예제좀 봐주세요~~ 김백일.cedar 1548 2002/11/07
3687     Re:vector 간단한 예제좀 봐주세요~~ 오전&오후 1403 2002/11/07
1497     비교 함수 객체가 필요합니다. 김백일 1789 2002/11/07
1499         Re:감사합니다... 임양규 1408 2002/11/07
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.