|
보통 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);
}
}
|