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

C++빌더 Q&A
C++Builder Programming Q&A
[25063] map 에 관한..
성철경 [twinsteel] 986 읽음    2003-04-04 13:43

보통 List 를 많이 씁니다.
좀 Item들이 많아지면 처리속도가 늦어집니다.
client에서 대량의 Hash 를 쓰기도 별로고.
standard c++에 보면. map 이라는 것이 있더군요.
선언부에 standard c++ map 을 사용하기 위한 처리를 하고
typedef 으로 map에 들어갈 Data형태를 선언합니다.

typedef map<String, String, less<String> > TCommonCodeTable;

첫번째 자료형이 map에 포함될 item 요소들을 관리할. key가 됩니다.
map은 기본적으로 이진트리로 구성되어 있기때문에 key가 필요하지요

두번재는 넣고 싶은 자료형입니다.
TObject 자손도 좋고 사용자 정의 class/struct 도 좋습니다.

typedef struct _Pain
{
   int value;
   String name;
}Pain;

typedef map<int, *Pain, less<String> > TPainTable;

위처럼 선언했다면, Pain class의 instance들을 포함시킬 수 있는 map이 선언된겁니다.
물론 첫번째 자료형이 int는 Pain class의 각 instance들을 구분할 수 있는 고유. id입니다.

그외 map 내에 Data추가/삭제/검색은 아래루틴들을 참조하시면 되겠습니다요.


//.... somewhere header file *.h

#include <map>
using namespace std;

typedef map<String, String, less<String> > TCommonCodeTable;

class TDataMgr
{

public:
    __fastcall TAtCodeMgr();
    virtual __fastcall ~TAtCodeMgr();


    //...........
protected:
    String FMemberCode_FN;
    TCommonCodeTable FMemberCodeTable;
public:
    int __fastcall ReadMemberCodeFile(String filename);

    void __fastcall GetMemberCodeList(TStringList *s_list);
    void __fastcall GetMemberKorNameList(TStringList *s_list);
    String __fastcall GetMemberKorName(String code);
    String __fastcall GetMemberCode(String korname);
    bool __fastcall IsExistMemberCode(String code);
    bool __fastcall IsExistMemberKorName(String korname);
    void __fastcall GetMemberCodes(TStringList *kor_list, TStringList *code_list);

    void __fastcall RemoveAllMemberItems();


    //.............


};


//.... *.cpp

//... 특정 파일에서 Data읽어들여. map에 저장하는 루틴.

int __fastcall TDataMgr::ReadMemberCodeFile(String filename)
{
    FILE *fp;

    if((fp = fopen(filename.c_str(), "r")) == NULL)
            return -1;

    char spy[] = "\t\n=";

    const int BUF_SIZE = 100;
    char buf[BUF_SIZE];
    char *token;

    try
    {
        while (!feof(fp))
        {
            memset(buf, 0, BUF_SIZE);
            fgets(buf, sizeof(buf), fp);
            token = strtok(buf, spy);

            if(token == NULL)
                    continue;
            String korname = StrPas(token);
            token = strtok(NULL, spy);
            if(token == NULL)
                    continue;
            String code = StrPas(token);

            FMemberCodeTable[code] = korname;
        }
    }
    __finally
    {
        fclose(fp);
    }
    return 1;

}

//... map 에 포함된 정보 리턴하는 함수, string list는 호출하는 곳에서 new/delete하도록

void __fastcall TDataMgr::GetMemberCodeList(TStringList *s_list)
{
    if(s_list == NULL)
        return;
    s_list->Clear();

    TCommonCodeTable::iterator  begin = FMemberCodeTable.begin(),
                                end = FMemberCodeTable.end();
    for(;begin != end; )
    {
        s_list->Add(begin->first);
        begin++;
    }

}

//... map 에 포함된 정보 리턴하는 함수, string list는 호출하는 곳에서 new/delete하도록

void __fastcall TDataMgr::GetMemberKorNameList(TStringList *s_list)
{
    if(s_list == NULL)
        return;
    s_list->Clear();

    TCommonCodeTable::iterator  begin = FMemberCodeTable.begin(),
                                end = FMemberCodeTable.end();
    for(;begin != end; )
    {
        s_list->Add(begin->second);
        begin++;
    }

}

//... map 에 포함된 정보 리턴하는 함수

String __fastcall TDataMgr::GetMemberKorName(String code)
{
    TCommonCodeTable::iterator posi = FMemberCodeTable.find(code);
    if(posi != FMemberCodeTable.end())            // 존재하는 경우
        return posi->second;

    return "None";                  
}

//... map 에 포함된 정보 리턴하는 함수

String __fastcall TDataMgr::GetMemberCode(String korname)
{
    TCommonCodeTable::iterator  begin = FMemberCodeTable.begin(),
                                end = FMemberCodeTable.end();
    for(;begin != end; )
    {
        if(begin->second == korname)
            return begin->first;
        begin++;
    }

    return "None";       
}

//... map 에 특정 정보 존재하는지 여부 검사 루틴.. key 는 code

bool __fastcall TDataMgr::IsExistMemberCode(String code)
{
    TCommonCodeTable::iterator posi = FMemberCodeTable.find(code);
    if(posi != FMemberCodeTable.end())            // 존재하는 경우
        return true;

    return false;

}

//... map 에 특정 정보 존재하는지 여부 검사 루틴.. key 는 korname

bool __fastcall TDataMgr::IsExistMemberKorName(String korname)
{
    TCommonCodeTable::iterator  begin = FMemberCodeTable.begin(),
                                end = FMemberCodeTable.end();
    for(;begin != end; )
    {
        begin++;
        if(begin->second == korname)
            return true;
    }

    return false;

}

//... map 에 포함된 정보 리턴하는 함수. string list 들은 호출하는 쪽에서 new/delete

void __fastcall TDataMgr::GetMemberCodes(TStringList *kor_list, TStringList *code_list)
{
   if(kor_list == NULL || code_list == NULL)
        return;

    int count = kor_list->Count;

    String code;
    for(int i=0; i<count; i++)
    {
        code = GetMemberCode(kor_list->Strings[i]);
        if(code != "")
            code_list->Add(code);

    }
}


//... map 에 포함된 모든 요소 삭제..

void __fastcall TDataMgr::RemoveAllMemberItems()
{
    TCommonCodeTable::iterator  begin = FMemberCodeTable.begin(),
                                end = FMemberCodeTable.end();
    String key;
    for(;begin != end; )
    {
        key = begin->first;
        begin++;
        FMemberCodeTable.erase(key);
    }

}




+ -

관련 글 리스트
25063 map 에 관한.. 성철경 986 2003/04/04
32258     Re:map 에 관한.. 김백일.cedar 791 2003/04/04
25061     Re:[자답] 실행시 에러 발생!? 이재현 833 2003/04/04
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.