C++(119)
-
[C++ 17] 누적 합계 구하기 - std::accumulate()
🔗프로그래머스 | 평균값 구하기 문제를 풀려다가, STL 라이브러리들이 무엇이 있는지도 알아보기 위해 찾아보니, 누적 합계를 구해주는 함수, std::accumulate()가 있었습니다. C++ 17에서 추가된 함수로, 헤더파일을 #include 해줘야 사용 가능합니다. #include std::accumulate(시작 위치, 끝 위치 - 1, 초기값); 해당 함수를 통해 얻은 반환값은 초기값의 데이터 타입을 따라간다고 하네요. 오버플로우 방지를 위해 long 타입을 쓰고 싶으신 분들은 초기값에 0이 아닌 0L을 줘야하겠습니다. 평균값 구하기 문제 소스코드 #include #include #include using namespace std; double solution(vector numbers) { i..
2023.01.29 -
[Programmers] Lv0. 최빈값 구하기 | C++
🔗문제 링크 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 👨💻풀이 과정 처음에는 숫자가 오름차순 순서로 안 들어오는 줄 알고, 정렬을 해줬었는데 입력이 오름차순으로 들어오는 것 같아 필요 없는 것 같습니다. 쌍으로 저장되고, 검색에 유리한 자료구조인 STL의 map 라이브러리를 이용했습니다. #include #include using namespace std; template map* CountNumbers(const vector& array) { map* numbers = new map(); for (auto number : array) { auto..
2023.01.29 -
[C++] 기본 자료형과 템플릿의 생성자 초기화
C++에서 기본적으로 제공하는 자료형들(char, int, float 등등)은 명시적 기본 생성자를 통해 0 또는 False로 초기화를 할 수 있습니다. int x = int(); 이것은 템플릿 자료형에서도 사용이 가능합니다. template void Test() { T variable = T(); } 템플릿 클래스를 정의할 때, 멤버 변수 초기화 시 이 방법을 활용할 수 있습니다. template class Test { public: Test() : _data(T()) { } // 템플릿 멤버 변수 기본형으로 초기화 private: T _data; };
2023.01.25 -
[C++] 템플릿(Template)은 헤더파일과 구현부 파일을 나누면 안 된다. (Error LNK 2019)
C++ 템플릿(Template) 공부를 하려고 예제 문제를 보면서 타이핑 해보고 있었습니다. 그런데, LNK 2019 오류가 저를 반겨줬습니다. 링킹(Linking)과 관련된 오류 같더군요. 저는 라이브러리 파일을 추가한 적도 없는데 말이죠. 무엇이 문제일까 고민하여 오류 코드를 구글링 해봤습니다. 다행히 저보다 먼저 고생하셔서 해결한 사례를 적어 놓으신 분이 있더라구요. 이런 분들이 저 같은 코린이에게는 구세주입니다. 문제는 헤더 파일과 구현 파일 분리였다. 결론부터 말하자면, 템플릿(Template)을 사용할 때 선언과 정의를 헤더 파일과 구현 파일로 분리한 것이 문제였습니다. 원래라면 헤더 파일에 선언을, 구현 파일에 구현부를 작성하는 게 일반적입니다. 관리하기가 수월할 뿐더러, 선언을 통해 미리 ..
2022.07.19 -
[C++] 추상 클래스(abstract class)
추상 클래스의 필요성 class Monster { public: Monster() {} virtual ~Monster() {} virtual void Attack() }; 슬라임, 리본돼지 등의 몬스터 클래스를 만들 예정인데, 이들은 모두 공격(Attack)이라는 메소드를 가진다. 이들은 저마다 다른 공격을 구사한다. 따라서, 슬라임과 리본돼지의 부모 클래스로 Monster 클래스를 만들어서 Attack() 메소드를 만들어 주었다. 하지만 이 Monster 클래스는 공통된 멤버를 정의하기 위한 용도일 뿐이지, 실제 객체 생성은 요구되지 않는다. 가상 함수로도 공격 메소드의 다형성을 구현할 수 있지만, 프로그래머가 오버라이드 하는 걸 까먹을 수도 있다. 다음과 같은 내용들을 만족하는 방법이 있었으면 좋겠다..
2022.07.07 -
[C++] 클래스 상속 시, 소멸자를 가상 함수(Virtual)로 만들어야 하는 이유
정적 바인딩(Static binding)이 오버라이드 메소드에 미치는 영향 객체 지향 언어를 통해 프로그래밍을 하다 보면, 부모 클래스로 자식 클래스를 가리키는 업 캐스팅(Upcasting)을 사용할 때가 많습니다.Parent* obj = new Child(); 우리 입장에서는 부모 클래스 포인터로 자식 클래스 객체를 가리키고 있구나라고 알 수 있지만, 컴퓨터 입장에서는 부모 클래스의 포인터이므로 당연히 부모 클래스 객체를 가리키고 있다고 생각합니다. 따라서, 자식 클래스에 오버라이딩(Overriding)된 메소드가 있다면 여기에서 문제가 발생하게 됩니다.Parent* p = new Parent();Parent* c = new Child();p->Function(); // Parent 클래스의 Fun..
2022.07.07