일지
-
JUNGOL...193일지 2022. 8. 31. 19:52
Intermediate_Coder/그래프탐색-BFS/토마토(고) 문제 철수의 토마토 농장에서는 토마토를 보관하는 큰 창고를 가지고 있다. 토마토는 아래의 그림과 같이 격자 모양 상자의 칸에 하나씩 넣어서 창고에 보관한다. 창고에 보관되는 토마토들 중에는 잘 익은 것도 있지만, 아직 익지 않은 토마토들도 있을 수 있다. 보관 후 하루가 지나면, 익은 토마토들의 인접한 곳에 있는 익지 않은 토마토들은 익은 토마토의 영향을 받아 익게 된다. 하나의 토마토의 인접한 곳은 왼쪽, 오른쪽, 앞, 뒤 네 방향에 있는 토마토를 의미한다. 대각선 방향에 있는 토마토들에게는 영향을 주지 못하며, 토마토가 혼자 저절로 익는 경우는 없다고 가정한다. 철수는 창고에 보관된 토마토들이 며칠이 지나면 다 익게 되는지, 그 최소 일..
-
Effective C++...50일지 2022. 8. 29. 11:42
위치 지정 new를 작성한다면 위치 지정 delete도 같이 준비하자 위치 지정 new 란? 위치 지정 new는 기본적인 operator new에 새로운 매개변수를 전달해주는 형태의 new를 말한다. class Widget { public: ... static void* operator new(std::size_t size, std::ostream& logStream) throw(std::bad_alloc); }; 위치 지정 new와 delete가 짝이 되지 않으면 생기는 문제 C++의 런타임 시스템은 new에서 에러가 발생했을 때 자동적으로 operator delete를 호출해준다. 그런데 여기에는 한 가지 조건이 붙는데 operator new와 매개변수의 개수와 타입이 동일한 버전의 operator ..
-
Effective C++...49일지 2022. 8. 28. 13:00
new 및 delete를 작성할 때 따라야 할 기존의 관례를 잘 알아 두자 operator new의 관례 new는 몇 가지 관례가 존재하는데 먼저 0바이트가 요구되었을 때도 적법한 포인터를 반환해야 한다는 것이다. 이에 대해서는 0바이트가 요구될 때는 1바이트로 가정해서 작업을 진행한다. void* operator new(std::size_t size) throw(std::bad_alloc) { using namespace std; if (size == 0) { size = 1; } while(true) { if (할당 성공) return 할당된 메모리의 포인터; // 할당 실패 시 new 처리자 함수가 있으면 그것을 실행, 아니면 bad_alloc 예외를 발생시킨다. } } 또, operator new..
-
Effective C++...48일지 2022. 8. 27. 12:11
new 및 delete를 언제 바꿔야 좋은 소리를 들을지를 파악해 두자 new, delete를 바꾸는 이유 일반적으로 다음과 같은 이유로 new와 delete를 새로 만들곤 한다. 잘못된 힙 사용을 탐지하기 위해 한 번 new 한 메모리를 두 번 이상 delete 하는 것을 막기 위해 메모리 목록을 저장하는 식으로 사용한다. 메모리를 넘어서 쓰는 것을 막기 위해 메모리 앞, 뒤에 탐지용 바이트 패턴을 넣어두는 식으로 에러를 탐지한다. 효율을 향상 시키기 위해 기본 제공 new, delete는 보편적인 상황을 위해 만들어졌다. 개발자가 자신의 프로그램의 동적 메모리 할당 성향을 잘 파악하고 있으면 새로 new, delete를 만드는 게 더 나을 수 있다. 동적 할당 메모리의 실제 사용에 관한 통계 정보를 ..
-
Effective C++...46일지 2022. 8. 24. 07:43
템플릿 메타 프로그래밍, 하지 않겠는가? TMP의 장점 TMP에는 크게 두 가지 장점이 존재한다. 까다롭거나 불가능한 일을 쉽게 처리할 수 있다. 기존 작업을 런타임 영역에서 컴파일 영역으로 전환할 수 있다. 실행 도중에 잡혀 오던 에러를 컴파일 도중에 찾을 수 있다. 효율적일 여지가 많다. 실행코드가 작아진다. 실행 시간이 짧아진다. 메모리도 적게 잡아먹는다. TMP의 반복 처리 TMP는 루프가 존재하지 않기 때문에 재귀를 이용해 반복 처리를 하게 된다. template struct Factorial { // 이 경우 재귀를 통해 구현이 되며 모든 계산이 컴파일 타임에 이루어진다. enum { value = n * Factorial::value }; }; template struct Factorial ..
-
Effective C++...45일지 2022. 8. 23. 07:50
타입에 대한 정보가 필요하다면 특성 정보 클래스를 사용하자 STL 반복자의 종류 STL에서 지원하는 반복자는 다음의 다섯 종류가 존재한다. 입력 반복자 전진만 가능, 한 칸씩만 이동, 가리키는 위치에서 읽기만 가능, 읽기 가능 횟수 1회 / 읽기 전용 파일 포인터 출력 반복자 전진만 가능, 한 칸씩만 이동, 가리키는 위치에서 쓰기만 가능, 쓰기 가능 횟수 1회 / 쓰기 전용 파일 포인터 순방향 반복자 입력 반복자, 출력 반복자 처리 가능, 읽기 쓰기 동시에 가능, 횟수 제한 없음 / 해시 컨테이너에서 사용 양방향 반복자 순방향 반복자 처리 가능, 뒤로 이동 가능 / list, map, multimap 등에서 사용 임의 접근 반복자 양방향 반복자 처리 가능, 임의의 거리만큼 상수 시간에 이동 가능 / ve..
-
Effective C++...44일지 2022. 8. 22. 08:51
타입 변환이 바람직할 경우에는 비멤버 함수를 클래스 템플릿 안에 정의해 두자 생성자를 통한 암시적 변환은 컴파일러에게 고려되지 않는다 다음과 같이 생성자에서 암시적 형 변환을 하던 클래스를 템플릿으로 만들면 operator*에 사용되는 T가 무엇인지 알 수 없기 때문에 컴파일 에러가 발생하게 된다. template class Rational { public: Rational(const T& numerator = 0, const T& denominator = 1); const T numerator() const; const T denominator() const; }; template const Rational operator*(const Rational& lhs, const Rational& rhs) {..