tgparkk / notepad

1 stars 0 forks source link

표준라이브러리가 아닌 경우 stl 에 쓰일수 없는 케이스가 있음 ex) std::set #14

Open tgparkk opened 2 months ago

tgparkk commented 2 months ago

알겠습니다. MFC의 CString 클래스는 문자열을 다루는 특수한 구조체로, 표준 라이브러리의 std::unordered_set과 호환되지 않습니다. 그러나 우회적으로 CString을 std::unordered_set과 함께 사용할 수 있는 방법이 있습니다.

tgparkk commented 2 months ago

example1

#include <afx.h> // CString 헤더 파일
#include <unordered_set>
#include <iostream>

// 해시 함수와 동일성 비교 연산자를 구현한 CStringHash 클래스
class CStringHash {
public:
    size_t operator()(const CString& str) const {
        // CString을 const char*로 변환하여 해시 값을 계산
        return std::hash<std::string>()(CT2CA(str));
    }
};

class CStringEqual {
public:
    bool operator()(const CString& str1, const CString& str2) const {
        // CString을 const char*로 변환하여 동일성 비교
        return (str1.Compare(str2) == 0);
    }
};

int main() {
    // std::unordered_set 생성
    std::unordered_set<CString, CStringHash, CStringEqual> mySet;

    // CString을 std::unordered_set에 삽입
    CString cstr1 = _T("apple");
    mySet.insert(cstr1);

    CString cstr2 = _T("banana");
    mySet.insert(cstr2);

    CString cstr3 = _T("orange");
    mySet.insert(cstr3);

    // 모든 값을 출력
    for (const auto& value : mySet) {
        std::wcout << value.GetString() << std::endl;
    }

    return 0;
}
tgparkk commented 2 months ago

example2

#include <afx.h> // CString 헤더 파일
#include <unordered_set>
#include <iostream>

// 해시 함수 구현
struct CStringHash {
    size_t operator()(const CString& str) const {
        // CString 내부 문자열을 직접 해싱
        const wchar_t* data = str.GetString();
        size_t hash = 5381;
        wchar_t ch;
        while ((ch = *data++)) {
            hash = ((hash << 5) + hash) + ch; // 해시 함수는 일반적으로 이러한 형태를 가짐
        }
        return hash;
    }
};

// 동일성 비교 연산자 구현
struct CStringEqual {
    bool operator()(const CString& str1, const CString& str2) const {
        return (str1 == str2);
    }
};

int main() {
    // std::unordered_set 생성
    std::unordered_set<CString, CStringHash, CStringEqual> mySet;

    // CString을 std::unordered_set에 삽입
    CString cstr1 = _T("apple");
    mySet.insert(cstr1);

    CString cstr2 = _T("banana");
    mySet.insert(cstr2);

    CString cstr3 = _T("orange");
    mySet.insert(cstr3);

    // 모든 값을 출력
    for (const auto& value : mySet) {
        std::wcout << value.GetString() << std::endl;
    }

    return 0;
}