전체 글 56

Runtime Error Debugging

c/c++ 언어를 사용하면 runtime error를 종종 겪는다. 이를 해결하기 위해 눈으로 코드를 보면서 문제점을 파악하는 것은 매우 비효율적이다. visual studio의 F5( Start Debugging )를 활용해서 문제를 해결하는 것을 추천한다. 1. ctrl + f5로 수행했을 때, runtime error가 발생하면 중단버튼을 누른다. 2. F5로 Debugging을 시작한다. 3. 다시 runtime error 창이 뜨는데, 이때는 다시 시도를 누른다. 그러면 어떤 에러가 발생하는지 설명해 준다. 여기 코드를 잠시 보면 vector의 범위를 넘어선 연산이 문제임을 알 수 있다. ctrl + f5( Start without Debugging )는 다시 시도를 눌러도 어떤 에러가 발생하는..

Uniform Initialization

List-Initialization( 또는 Brace-Initialization )라고도 불리는 것 같다. 1. 변수 초기화 int a = 3; // copy initialization int a(3); // direct initialization int a{3}; // uniform initialization - C++11 변수를 초기화하는 방법은 여러 가지가 있다. int a = 3.14; // warning int a(3.14); // warning int a{3.14}; // error copy와 direct initialization은 암시적 형 변환( implicit type conversion )을 허용한다. uniform initialization은 암시적 형 변환을 허용하지 않는다. 변수..

모듈러 연산( modular, 나머지 )

https://www.acmicpc.net/problem/15829 15829번: Hashing APC에 온 것을 환영한다. 만약 여러분이 학교에서 자료구조를 수강했다면 해시 함수에 대해 배웠을 것이다. 해시 함수란 임의의 길이의 입력을 받아서 고정된 길이의 출력을 내보내는 함수로 정 www.acmicpc.net 해당 문제를 풀 때 "모듈러 연산"에 관한 개념을 공부했다. 모듈러 연산이란 나머지 연산을 의미한다. N mod m일 때, 0 ~ (m - 1)의 범위 내에서 결과값이 나온다. 읽는 방법 " N 모듈러 m " 여기서 m은 modular 값이다. N이 음수라면( 결과값이 음수라면 ), N의 절대값에서 mod한 결과에 m을 더하거나 m을 2, 3배 한 값을 결과값에 더해서 0 ~ (m - 1) 사이..

c++ 연산자 오버로딩 정리

목차 연산자 오버로딩 멤버 함수 방식 - 대입 연산자 오버로딩 전역 함수 방식 연산자 오버로딩 멤버와 전역 함수 방식 중 하나만 지원하는 연산자도 있으니 둘 다 알도록 한다. 1. 멤버 함수 방식 대입 연산자( a = b )는 멤버 함수 방식으로만 구현할 수 있다. // 대입 연산자 x, 선언 및 초기화 int a = 0; int b = 1; // 대입 연산자 a = b; class Exam { public: Exam operator+(const Exam& e) { Exam exam; exam.x = x + e.x; // Exam a 를 기준으로 한다. exam.y = y + e.y; return exam; } private: int x; int y; }; int main() { Exam a; Exam ..

c++ 배열 정리

목록 1. 선언과 초기화 선언 초기화 2. 배열에 접근 및 값 변경 배열 이름의 뜻 포인터 이용 참조 이용 인덱스 이용 주의할 점 3. 배열과 포인터 4. 배열을 인자로 넘길 때 5. 다차원 배열 선언과 초기화 1. 선언 TYPE 이름[const 개수]; visual stdio 컴파일러는 배열의 크기를 상수로 받도록 한다. 2. 초기화 int number[5] = {};// 1 int number[10] = { 1,2,3 };// 2 int number[] = { 1,2,3,4,5 };// 3 모든 원소를 0으로 초기화 3번 째 원소까지 1, 2, 3으로 초기화하고 나머지는 0으로 초기화 데이터 개수만큼 크기를 설정 배열에 접근 및 값 변경 배열 이름의 뜻 struct Knight { hp = 100; ..

c++ 참조 정리

목록 1. 선언과 초기화 2. 관점에 따라 달라지는 참조 어셈블리 관점에서 참조 c++ 관점에서 참조 3. 포인터 대신 참조를 사용하는 이유 4. 참조의 단점과 해결방안 쓰기 기능을 막는 방법 가독성을 높이는 방법 5. 참조에 포인터를 포인터에 참조를 포인터로 사용하던 걸 참조로 넘겨주는 경우 참조로 사용하던 걸 포인터로 넘겨주는 경우 선언과 초기화 int number = 1; int& ref = number; int& ref2;// error ! ref2 = number; 참조는 선언과 동시에 초기화를 해줘야 한다. 참고로 참조는 산술 연산을 제공하지 않는다. ref++;// error ! 뒤에 말하겠지만 참조는 특정 바구니의 가명과 같다. 즉, 하나의 바구니에 종속되기 때문에 산술 연산을 통해 참조가..

c++ 포인터 정리

목록 1. 포인터 2. 선언과 초기화 포인터 선언 포인터 초기화 포인터는 고정 크기를 가지는데 왜 타입을 명시할까? 포인터 사용 예시 ( 1 ) 포인터 사용 예시 ( 2 ) 3. 메모리 크기 불일치 4. 포인터 연산자 주소 연산자 간접 연산자 산술 연산자 간접 멤버 연산자 5. 포인터를 매개 변수로 받는 함수의 보험 const가 *앞에 위치 const가 *뒤에 위치 6. 포인터가 가리키는 주소가 존재하지 않는다? nullptr을 넘겨주는 포인터 7. 다중 포인터 포인터 int number = 1; 해당 코드의 의미를 알아보자. number라는 이름의 4 byte 정수 타입의 바구니를 만든다. number라는 변수는 스택 메모리에 할당한다. number = 1은 number 바구니에 정수 1을 넣는다. 즉..

c++의 다양한 input 방법과 속도 비교

input 방법 1. std::cin >> c++의 기본적인 입력 기능이다. cin의 반환값 기본적으로 cin 객체를 반환한다. if (cin >> num) while (cin >> num) cin은 간혹 if문과 while문의 조건문에 작성할 때가 있다. cin이 속해있는 iostream 헤더파일은 cin이 if문과 while문에 들어가면 conversion operator를 통해 bool 값으로 형 변환시킨다. 입력에 성공했다면 true 아니면 false를 반환한다. 여기서 입력에 성공했다는 것은 type에 맞는 입력값이 제대로 들어온 것이다. int num; cin >> num; // 정수 입력! 여기서 문자열을 입력하면 false를 반환한다. bool b = cin >> num; istream b..

header

기본 개념 1. header 파일 예시 예를들면, test.h 라는 헤더 파일이 있고 안에 namespace { class { function } }이 있다하자. 여기서 어떻게 동작하는지와 같은 자세한 내용은 작성하지 않는다. 즉, 틀만 작성한다. // test.h namespace N { class test { public: void function(); private: int value = 0; }; } 2. .cpp 파일 예시 이제 test.cpp 파일을 만들고 #include "test.h"로 컴파일러에게 test.h에 정의된 내용을 알려준다. header 파일에 틀을 작성했다면, .cpp 파일에는 틀이 어떻게 동작하는지 작성해주면 된다. header 파일에서 function의 기능을 작성하지 않..