C++ - 커스텀 Allocator를 사용하는 basic_string을 unordered_map의 key로 사용하는 방법

아래의 코드는 컴파일 에러가 된다. using MyString = std::basic_string< char, std::char_traits<char>, MyAllocator<char>>; std::unordered_map<MyString, int> umap; // 이 부분이 에러 이유는 unordered_map이 필요로 하는 std::hash는 std::hash<std::string>로 정의 되어 있는데 allocator를 특별화한 문자열 타입의 정의가 없기 때문이다. C++17에서는 이 문제를 간단하게 해결할...
더 읽기

C++ - Win32API 실행 파일의 full path 얻기

Win32 API의 ‘GetModuleFileName’ 함수 사용. std::wstring getApplicationFilePath() { wchar_t fileName[MAX_PATH] = { 0 }; ::GetModuleFileNameW(nullptr, fileName, MAX_PATH - 1); return fileName; } 파일의 full path에서 실행 파일 이름만 추출하기 getApplicationFileName() _wsplitpath_s 함수로 디렉토리와 파일 이름을 나눈다. https://technet.microsoft.com/ko-kr/library/8e46eyt7(v=vs.110).aspx std::wstring getApplicationFileName() {...
더 읽기

introselect 알고리즘

.NET 4.5 이상에서 컬렉션의 정렬 알고리즘에서 사용 https://github.com/Microsoft/referencesource/blob/master/mscorlib/system/collections/generic/arraysorthelper.cs
더 읽기

C++ - atomic compare_exchange_weak/strong 함수

출처 C++11 표준 라이브러리의 atomic 조작 함수 compare_exchange_weak와 compare_exchange_strong에 대한 메모. 두 함수 모두 변수의 atomic한 CAS(compare-and-swap) 작업을 제공한다. weak 버전과 strong 버전의 동작 사양은 weak 버전에서는 “교환 가능한 경우라도 CAS 조작 실패 할 가능성이 있다(spurious failure)”가(* 1), strong 버전에서는...
더 읽기

C++ - flags. 프로그램 실행 시의 인자를 파싱하는 라이브러리

C++17로 표준으로 구현. 헤더 파일 1개로 구성. 저장소: https://github.com/sailormoon/flags 라이센스: 퍼블릭도메인(완전 마음대로 사용 가능) 예제 #include "flags.h" void ParseConfig(int argc, char* argv[]) { const flags::args args(argc, argv); const auto ip = args.get<std::string>("ip"); if (!ip) { std::cerr << "No IP. :("...
더 읽기