[백준] 1065: 한수
2020. 12. 29. 01:34
Problem set
1065번: 한수 어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 www.acmicpc.net #include #include using namespace std; int nofhan(const int& n) { int res = 0; if (n = 100 && n = 100) { int mid = mid_ini; int a[3] = {}; int idx = 0; while (mid ..
std::exception과 Stack Unwinding 과 RAII
2020. 12. 4. 22:56
C++
std::exception 의 파생 클래스 logic_error invalid_argument 부적절한 argument value | std::bitset::bitset, std::stoi, std::stof domain_error 루트안에 음수를 넣었다거나 하는, 논리상의 도메인을 벗어난 에러, 스탠다드 라이브러리는 이 에러를 출력하지 않음, math_errhandling 같은 자체 에러가 있음. 그러나 boost.math 같은 써드파티 라이브러리에서는 이 에러를 출력함 | boost.math length_error 객체의 한계를 벗어난 시도를 했을때 일어남 | std::basic_string, std::vector::reserve out_of_range 정의된 범위에서 벗어난 원소에 접근하는 시도를 ..
[레거시 코드] 함수포인터, 보이드포인터
2020. 12. 3. 07:18
C++
함수 포인터 런타임에서 어떤 함수를 실행할 것인지 정하는 기능을 가지고 있음 C 에서는 함수포인터만 사용이 가능함, 당연히 C++에서도 사용이 가능함 C++ 에서는 polymorphism이 구현되면서 서브클래스의 메소드를 호출할 수 있음 C++11 에서는 람다 표현식이 추가되면서 코드 자체를 삽입할 수 있음 Example.1 옛날 버전의 C++을 사용하는 레거시 코드에서는 typedef 를 통해서 함수를 호출함 클래스 내부의 함수 포인터는 약간 복잠함 #include using namespace std; // case.1 일반적인 함수 포인터 + 네임스페이스 함수포인터 int add(int a, int b) { return a + b; } int subtract(int a, int b) { return ..
Builder
2020. 11. 30. 21:17
Design Pattern
Builder When piecewise object construction is complicated, provide an API for doing it succintly 빌더 패턴의 목적은 여러 복잡한 요소들의 조합이 필요한 객체를 생성해야 하거나 또는 여러 개의 다양한 객체 집합을 생성해야 할 때 객체 생성만을 전담하는 컴포넌트를 정의하여 객체 생성을 간편하게 하는 것이다. 빌더 패턴은 객체의 생성 과정이 충분히 복잡할 때에만 의미가 있다. Building a string out of substrings web server page rendering Concatenate a single std::string my_text += boost::lexical_cast(my_int); printf("%s ..
SOLID Design Principles
2020. 11. 24. 20:28
Design Pattern
추상 클래스를 상속받았지만, 베이스 클래스에 사용하지 않는 함수임에도, 구현해야 한다면, 어떤 원칙이 위배되었는가? ISP (인터페이스 분리 원칙) '사과' 클래스는 '과일' 클래스로부터 상속받았다. '과일'을 매개변수로 하는 함수는 '사과' 에 대해서는 정상적으로 작동하지 않는다. 어떤 원칙에 위배되었는가? LSP (리스코프 치환 원칙) SOLID Single Responsibility Principle(SRP) - 단일 책임 원칙 A class shold only have a single responsibility 단일 객체가 여러개의 책임을 지고 있지 않는가? Open-Closed Princible(OCP) - 개방-폐쇄 원칙 Entities should be open for extension bu..
[C++] 범위기반 for 루프를 위한 클래스 템플릿 최소 구현
2020. 11. 16. 05:22
C++
반복자를 증가시키는 operator++ 반복자를 역참조하고 반복자가 가리키는 값에 접근하는 operator* 다른 반복자와 비항등성을 비교하는 operator!= begin(), end() 함수 #include #include template class dummy_array { private: T data[Size] = {}; public: const T& GetAt(const size_t idx) const { if (idx < Size) { return data[idx]; } throw std::out_of_range("index out of range"); } void SetAt(const size_t idx, const T& value) { if (idx < Size) { data[idx] = v..
스마트 클래스
2020. 11. 15. 03:34
C++
#include "Precompiled.h" namespace DevMil { template class unique_handle { typedef typename Traits::pointer pointer; pointer m_value; auto close() throw() -> void { if (*this) { Traits::close(m_value); } } unique_handle(unique_handle const &); auto operator=(unique_handle const &) -> unique_handle &; public: explicit unique_handle(pointer value = Traits::invalid()) throw() : m_value { value } { ..
클래스 구현 시, 생각해야 할 것
2020. 11. 14. 12:51
C++
클래스 구현 시 생각할 목록은 다음과 같다. (Mutability에 대한 정확한 한글 단어를 찾을 수 없어서 그냥 영어로 통일했음) Constructor/Destructor Mutability Member functions Helper functions Static members Operator overloading Namespaces 1. 클래스 템플릿을 구현하는 것이 매우 매우 유용하기는 하지만, 모든 경우의 수를 커버할 수 없을 때, 해당 케이스에 대해서 명시적으로 클래스를 구현해야 한다. 2. 객체의 생성과 소멸은 생성자와 소멸자에서 처리해야 하며, 다른 함수에 떠넘겨서는 안 된다. 또한 일반적인 상황에서의 복사, 이동 연산에 대해서도 고려해야 한다. 3. 어디까지 비상수/상수 접근을 허용할 것인..