C,C++76 2D vector size를 통해 초기화 하는 법 2D vector를 사용할 때 미리 크기를 정해주고 싶을 때가 있다. 그럴 땐 다음과 같이 한다. size_t row = 3; size_t col = 4; vector v{ row, vector(col, 1) }; 위 2D 벡터의 초기화 결과는 다음과 같다. 2021. 9. 9. C 및 C++ UTF-8 text file read/write 하는 법 인코딩이 UTF-8 로 되어 있는 텍스트 파일을 read하거나 write하고 싶을 때 아래와 같은 추가 설정이 필요. C의 경우(fread, fopen과 같은 C 계열 함수 사용시) fopen 시 다음과 같이 3번째 인자를 추가해준다. // read fopen_s(&fp, "file3.txt", "rt+,ccs=UTF-8"); // write fopen_s(&fp, "file3.txt", "wt+,ccs=UTF-8"); 그리고 파일 관련 동작을 수행하기 전 적절한 위치에 다음과 같은 코드를 추가한다. (docs.microsoft.com/ko-kr/cpp/c-runtime-library/reference/setlocale-wsetlocale?view=msvc-160) // 아래 세 가지 중 아무거나 하나 .. 2021. 3. 28. array를 소유하는 std::shared_ptr, deleter 설정법 C++ 17부터 std::shared_ptr가 [] 연산자를 지원한다. 따라서 ssptr[i]와 같은 연산을 지원한다. 이 의미는 (ssptr.get())[i]와 같은 의미이다. 즉 int* p = new int[5]에서 p[i]와 동일하다. 그러려면 std::shared_ptr ssptr(new int[5], deleter) 와같이 선언한다. 소유하려는 타입이 array일 경우 deleter를 지정하지 않아도 default_deleter가 자동으로 설정된다. deleter는 나중에 소유한 array의 메모리를 해제해준다. deleter를 직접 작성할 순 있지만 형태는 정해져 있는 듯 하다. template struct array_deleter { void operator()(T const* p) { d.. 2021. 2. 25. [C++ 17] 템플릿 특수화보다 사용하기 좋은 if constexpr 함수 템플릿을 작성할 때 특정 타입일 경우 다른 행동을 정의하고 싶다. 이럴 때 템플릿 특수화를 사용했다. 그러나 C++ 17부터 if constexpr을 사용해서 타입에 따른 행동을 정의할 수 있다. 아래의 조건식은 타입 T가 MyClass 타입과 동일한지 판별한다. template void Func() { if constexpr (std::is_same_v) { // Do something... } } 위의 if문에서 컴파일 타임에 조건식이 true인지 false인지 판별한다. 따라서 아래와 같이 조건식에 변수는 올 수 없다. 컴파일 타임에 알 수 있는 결과값이여야 한다. template void Func() { int val = 3; if constexpr (val == 3) // compile e.. 2021. 1. 1. [C++] placement new - 내가 원하는 메모리에 객체를 할당하고 싶다면 Placement new 내가 지정한 메모리에 객체를 초기화할 수 있을까? 메모리 풀을 만들다가 난항을 겪어 c++ 포럼에 질문을 남겼다가 새로운 기능을 알게 되었다. 그때 그때 생성할 객체의 타입이 달라서 오브젝트 풀보단, 메모리 풀을 만들고 그 메모리 풀에 객체를 할당하고 싶었다. 즉 다음과 같이 char 타입의 메모리를 생성해 놓고, 앞으로 생성할 객체들이 해당 메모리를 사용하면 좋겠다고 생각했다. 그리고 그런 것은 불가능할 줄 알았는데 가능했다. char* pMemoryPool = new char[1024]; size_t head = 0; A* pA = (A*)(pMemoryPool + head); head += sizeof(A); B* pB = (B*)(pMemoryPool + head); he.. 2020. 12. 25. [C++] list iterators incompatible Error 나같은 경우는 list의 어떤 반복자가 end와 같은지 비교하는 곳에서 에러가 났다. 원인은 엉뚱한 컨테이너의 반복자와 비교를 하고 있었다. 즉 list가 A, B 두 개 있을 때 A의 반복자는 A의 end와 비교해야 하는데 코드를 복붙한 부분이 있었는데 실수로 수정을 안해서 A의 반복자와 B의 반복자끼리 비교한 것이다. 그러니까 서로 다른 대상의 반복자를 비교하고 있는 건 아닌지 확인해보자. (실수일 가능성이 농후) 2020. 12. 18. 이전 1 2 3 4 5 ··· 13 다음