천객만래 [千客萬來] (It has an interminable succession of visitors)


#include <vector>

#include <list>

#include <map>


Vector: 시퀀스 컨테이너, 연속 메모리 기반 컨테이너


1. 메모리가 증가할 때 현재 메모리의 1.5배로 증가.

2. 삽입, 삭제보다는 검색에 용이하다.

3. 삽입, 삭제시에는 메모리를 재할당하고 컨테이너를 복사해야 한다.

4. 배열은 정적이지만, 벡터는 동적이다. 랜덤 지정 엑세스 연산자를 지원하기 때문에 접근이

    빠르다는 장점이 있다. 배열의 특성을 가지고 있기 때문에 메모리의 중간에서 삽입, 삭제는 굉장히

    불편하다. 굳이 구현은 가능하지만, 비효율적이다.

<사용방법>

#include <vector>

vector<int> vec1;

vector<int>* vec2 = new vector<int>; 

 

-List: 시퀀스 컨테이너, 노드 기반 컨테이너


1. 삽입, 삭제에 용이하다. 배열이나 벡터처럼 연속적인 메모리 구조가 아니기 때문.

2. 메모리 낭비가 없고, 메모리 주소로 조작하기 때문에 데이터의 추가, 삭제에 따른 추가적인 연산이

    필요없다. 

3. 랜덤 지정 엑세스 연산자는 지원하지 않는다.

 

-Map: 연관 컨테이너의 대표


1. key와 value로 구성된 자료구조다.

2. 트리구조. 자동 정렬이 되어 있다. 따라서 검색은 빠르나 삽입, 삭제는 느리다.

Posted by SB패밀리

[C++]맵(Map) Class 사용법 
 
[출처]  인터넷



1. 맵(Map)이란?

 맵(Map)은 set, multiset, multimap등과 같이 STL이 제공하는 자료형 중 하나이다. 


2. 맵(Map)의 특징

 첫번째, 두 개의 요소가 한 쌍을 이루어 하나의 자료를 이룬다.  첫 번째 요소는 first로써 인덱스이고, 두 번째 요소는 second로써 데이터이다. 그러므로, 인덱스와 데이터가 분리된 상태이며 독립적으로 자료형을 지정해줄 수 있다.

두번째, 반복자(iterator)와 배열 첨자를 사용하여 접근할 수 있다.
 
 세번째, 자동적으로 정렬된 상태를 유지한다. 만약에 정렬할 수 없다면 출력 순서는 먼저 입력된 것이 가장 나중에 출력된다.

 네번째, 인덱스가 중복되서 추가를 한다면, 기존의 데이터는 없어지고 새로운 데이터로 덮어씌여진다.

 다섯번째, Template를 사용하여, 인덱스나 데이터나 형식에 대하여 자유롭다.


3. 선언 방법

  map<인덱스형식,데이터형식> 사용할이름; 과 같이 선언하면 된다.
Example : map<int, string> iMapt;


4. 접근 방법

 접근 방법엔 두 가지가 있다. 

 ㄱ. iterator를 사용한 접근 방법.
map<인덱스형식,데이터형식>::iterator iterator이름; 과 같이 iterator를 선언 한 후, 사용한다. 접근 방법은 iterator->first, iterator->second와 같은 형식으로 접근한다.

 ㄴ. 인덱스 요소를 이용하여 접근할 수 있다.


5. 요소 추가, 삭제 방법

 추가를 하고 싶다면 map[인덱스]=데이터; 식으로 추가를 해주자. 물론, 인덱스에는 문자열이 와도 된다.
 그리고 삭제를 하고 싶다면 map.erase(인덱스)와 같이 삭제은 방법으로 인덱스를 통하여 삭제를 할 수 있다.


6. Map사용 예제

#include <map>
#include <string>
#include <stdio.h>

using namespace std;

void main()
{
     map<int, string> iMap;

     iMap[5] = "5번요소의 데이터"; //요소에 대한 데이터를 임의 순서로 추가
     iMap[3] = "3번요소의 데이터";
     iMap[9] = "9번요소의 데이터";

     map<int, string>::iterator itMap;

     printf("iMap\n"); 
     for(itMap = iMap.begin(); itMap != iMap.end(); itMap++)
          printf("%d : %s\n",itMap->first, itMap->second.c_str()); //정렬된 상태
     printf("\n");

     iMap[9] = "안녕하세요!"; //덮어 씌우기

     printf("iMap\n");
     for(itMap = iMap.begin(); itMap != iMap.end(); itMap++)
          printf("%d : %s\n",itMap->first, itMap->second.c_str());
     printf("\n");

     printf("iMap[5] = %s\n\n",iMap[5].c_str()); //인덱스를 통한 접근

     map<char*, string> sMap; //char*과 string 둘다 문자열이지만
                                           //char*는 정렬되지 않는다.

     sMap["미국"] = "United State of America";
     sMap["중국"] = "China";
     sMap["일본"] = "Japan";
     sMap["한국"] = "Korea, Republic";

     map<char*, string>::iterator itStrMap;

     printf("sMap\n");
     for(itStrMap = sMap.begin(); itStrMap != sMap.end(); itStrMap++)
          printf("%s : %s\n",itStrMap->first, itStrMap->second.c_str()); 
     printf("\n"); //마지막으로 넣은 한국이 가장 먼저 출력됨

     sMap.erase("일본"); //일본을 삭제

     printf("sMap\n");
     for(itStrMap = sMap.begin(); itStrMap != sMap.end(); itStrMap++)
          printf("%s : %s\n",itStrMap->first, itStrMap->second.c_str());
     printf("\n");
}

[Result]
iMap
3 : 3번요소의 데이터
5 : 5번요소의 데이터
9 : 9번요소의 데이터
iMap
3 : 3번요소의 데이터
5 : 5번요소의 데이터
9 : 안녕하세요!
iMap[5] = 5번요소의 데이터
sMap
한국 : Korea, Republic
일본 : Japan
중국 : China
미국 : United State of America
sMap
한국 : Korea, Republic
중국 : China
미국 : United State of America

Posted by SB패밀리

[개발/MFC] error C2665: 'operator new' : 5개의 오버로드 중 ...
쌈꼬쪼려 소백촌닭

Visual Studio VC++ 작업중 (MFC)

 디버깅 모드로 컴파일 중에 아래와 같은 에러 메시지가 나오는 경우가 발생할 수 있다.
그런데 에러의 위치를 찾을 수가 없다. 아래 메시지를 더블 클릭하면 xmemory.h 파일로 이동을 한다.
 

error C2665: 'operator new' : 5개의 오버로드 중 모든 인수 형식을 변환할 수 있는 오버로드가 없습니다.


이 에러에 대해서 대처할 수 있는 방법은 
아래와 같다.

MFC와 STL 사이에 문제로 생각된다.

MFC에서 클래스를 만들면 
파일 위쪽에 아래와 같은 코드가 자동으로 만들어 진다.

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

이 코드에서 발생하는 문제였다.
디버그 모드에서는 new DEBUG_NEW 에서 문제가 되는 것 같다.

해결 방법은 위의 디버그 관련 코드보다 먼저 STL관련 인클루드(#include ...)를 시켜주면 된다.
예를 들자면 

#include <vector>
#include <mysystem.h>
 
#ifdef _DEBUG
#define new DEBUG_NEW
#endif 

 
 

Posted by SB패밀리

LPSTR : char *

LPCSTR : const char *

LPCTSTR : const char * 또는 const WCHAR *



WORD : 보통 2바이트의 부호없는 정수형   (*.word형을 string형으로 바꾸기 string := IntToStr(word); )

DWORD : 4바이트의 부호없는 정수형    DWORD unsigned long

그럼, WORD와, int의 차이점은...

WORD는 4글자 int는 3글자
typedef unsigned short         WORD;    //WORD는 예약어가 아니죠  (typedef는 변수부분)

                                                                                               (cf.define은 전처리 부분)


*.단순참고

char, unsigned char, signed char : 1 byte
short, unsigned short : 2 bytes
int, unsigned int : 4 bytes
long, unsigned long : 4 bytes
float : 4 bytes
double : 8 bytes
long double : 10 bytes

=================================================================================



1. C 자료형
   char(1), short(2), int(4), long(4), float(4), double(8), bool
   문자: char



 
2. Win32 API 자료형
   BYTE(1, unsigned char), WORD(2, unsigned short), UINT(4, unsigned int)
   DWORD(4, unsigned long), LONG(4,long), BOOL
   문자: UCHAR(unsigned char)
   Handle: 대상을 구분하는 4바이트 정수(HWND,HDC...)
  
   MBCS문자(열)  유니코드문자(열)  자동매크로문자(열)
   ------------         -----------------        ------------------
   char   wchar_t    TCHAR
   LPSTR(char*)         LPWSTR(wchar_t*)         LPTSTR
   LPCSTR(const char*)  LPCWSTR(const wchar_t *) LPCTSTR
 
   .LPTSTR과 LPCTSTR를 사용하는 것이 좋음.
   .OLECHAR(wchar_t), LPOLESTR(LPWSTR), LPCOLESTR(LPCWSTR), OLESTR(x) = _T(x)




3. COM 스트링
   BSTR : 문자열 길이를 시작전에 저장하고, 이어서 유티코드문자열을 저장하는 방식
   LPCWSTR -> BSTR : 생성안됨. 생성함수를 이용해야 함.
                     BSTR bstr = sysAllocString(L"HELLO HI"); // 메모리 할당
                                 sysFreeString(bstr);         // 메모리 제거



   VARIANT: 문자열이 들어올때 BSTR과 동일

VARIANT 자료형은 각 개발 환경의 자료형의 차이를 해결하기위하여 제공되는 공용체 이다.


예제) INT nIndex 와 CString strItem이 있다고 가정하고...


// VARIANT 형 선언

VARIANT varIndex, varItem;


// VARIANT type 지정
varIndex.vt = VT_INT;
varItem.vt = VT_BSTR;


// VARIANT 값 할당.
varIndex.intVal = nIndex;
varItem.bstrVal = strItem.AllocSysString();// CString을 bstr로 변환하는 함수


// VARIANT 인자를 사용하여 함수 호출




 

4. CRT(c runtime library)지원 스트링 클래스 (#include "comdef.h")
   4-1. _bstr_t
        :BSTR 랩퍼 클래스, 메모리 할당/제거를 자동으로 수행
      
        . LPCSTR, LPCWSTR  -> _bstr_t
          :_bstr bstr = "hello hi";
        . _bstr_t -> LPCSTR, LPCWSTR
          : LPCSTR psz1 = (LPCSTR)bs1;
        . _bstr_t -> BSTR
          : 형변환 안됨. 함수이용
            BSTR bstr = bs1.copy();
            sysFreeString(bstr); // BSTR은 사용후 메모리 해제를 해야함.

   4-2. _variant_t
        :VARIANT 랩퍼 클래스, 메모리 할당/제거 자동 수행
       
        . LPCSTR, LPCWSTR -> _variant_t
          : _variant_t v1 = "hello hi";
        . _variant_t -> _bstr_t -> LPCSTR,LPCWSTR
          : LPCSTR psz1 = (LPCSTR)(_bstr_t)v1;




5. ATL 지원 스트링클래스
   5-1 CComBSTR : BSTR랩퍼클래스, 메모리할당/제거 자동 수행
      . LPCSTR, LPCWSTR -> CComBSTR
        CComBSTR bs1 = "hello hi";
      . CComBSTR -> BSTR -> LPCWSTR
        BSTR bs = (BSTR)bs1;
      . BSTR -> CComBSTR
        CComBSTR bs2; bs2.Attach(W2BSTR(L"hello hi");

   5-2 CComVariant: VARIANT랩퍼클래스, 메모리할당/제거 자동 수행
      . LPCSTR, LPCWSTR -> CComVariant
        CComVariant bs1 = "hello hi";
      . CComVariant -> CComBSTR -> BSTR -> LPCWSTR
        CComBSTR bs = bs1.bstrVal;



6. STL 스트링
   6-1 string
       . LPCSTR -> string
         string str = "hello hi";
       . string -> LPCSTR (형변환 안됨. 함수 이용)
         LPCSTR psz = str.c_str();
   6-2 wstring
       . LPCWSTR -> wstring
         wstring str = "hello hi";
       . wstring -> LPCWSTR
         LPCWSTR psz = str.c_str();



7. MFC 스트링
   . LPCSTR, LPCWSTR -> CString
     CString str = "hello hi";
   . CString -> LPCTSTR
     1. LPCTSTR lpsz = (LPCTSTR)str;
     2. LPTSTR lptsz = str.getBuffer(0), str.ReleaseBuffer(); (올바른 사용)
     3. LPTSTR lptsz = (LPTSTR)(LPCTSTR)str; (잘못된 표현)
     4. CString -> BSTR
        BSTR bstr = str.AllocSysString(); sysFreeString(bstr);



8. VC7 스트링
   String: .Net에서 새로 정의한 스트링 클래스
          String* s1 = S"hello hi";
          CString s2(s1);
    

9. ETC

   1. BSTR --> LPCSTR
      USES_CONVERSION;
      LPCSTR lpaszTemp = OLE2CA(bstrValue);

   2. LPCSTR --> BSTR
      USES_CONVERSION;
      BSTR bstrTemp = ::SysAllocString(A2COLE(lpaszValue));

   3. CString --> LPCSTR
      1) ANSI 버전
          LPCSTR lpaszTemp = (LPCSTR) strValue;
      2) UNICODE 버전
          USES_CONVERSION;
          LPCSTR lpaszTemp = T2CA((LPCTSTR) strValue);

   4. LPCSTR --> CString
      1) ANSI 버전
         CString strTemp = lpaszValue;
      2) UNICODE 버전
          USES_CONVERSION;
          CString strTemp = A2CT(lpaszValue);

Posted by SB패밀리