반응형

c++ 25

[C++] 미정의 동작

개요 C++에서의 미정의 동작에 대해 설명한다. 미정의 동작 C++에서 미정의 동작은 C++ 언어 표준에 정의 되지 않은 동작을 말한다. 이러한 동작은 운영 체제, 컴파일러, 실행 환경에 따라 결과가 달라질 수 있는 예측할 수 없는 동작을 일으킨다. 예측할 수 없는 동작이 발생하면 프로그램이 비정상적으로 종료되거나, 다른 변수나 객체의 값이 변경되거나, 잘못된 값이 반환될 수 있다. 미정의 동작 발생 상황 미정의 동작이 발생할 수 있는 상황은 다음과 같다. 1. Double-free : 이미 해제된 메모리를 다시 해제하는 경우 발생한다. 동일한 메모리 블록을 두 번 해제하려는 시도를 한다면 시스템에서 예측할 수 없는 결과가 발생할 수 있다. 2. Dangling pointer : 이미 해제된 메모리를 가..

언어/C++ 2023.03.21

[C++] iterator로 set, vector 원소 삭제하기 (cannot increment value-intialized map/set)

개요 iterator로 set, vector 원소 삭제(earse)하는 방법에 대해 서술한다. for (set::iterator iter = s.begin(); iter != s.end(); iter++) { if (*iter % 2 == 0) { s.erase(iter); iter--; } } 삭제가 잘 될줄 알았지만... 삭제가 잘 되지 않는다. 사유를 보니 erase(iter)를 하게 되면 iter가 무효화되기 때문에 연산이 먹지 않는다고 한다. vector의 iterator여서 iter++을 하면 다음 요소로 넘어가지 않을까? 굳이 무효화해야하나?라고 생각했지만 iterator는 vector 말고도 list 등에서도 작동하므로 iter를 무효화해준다고 한다. https://stackoverflow..

언어/C++ 2022.11.19

no viable conversion from 'value_type' (aka 'char') to 'string' (aka 'basic_string<char, char_traits<char>, allocator<char> >')

개요 string 할당하다가 생긴 오류 no viable conversion from 'value_type' (aka 'char') to 'string' (aka 'basic_string') "char"에서 "std::basic_string"(으)로 변환하기 위한 적절한 생성자가 없습니다. 설명 1 2 3 4 5 6 7 8 9 10 11 12 #include #include using namespace std; int main() { string s = "Hello, World"; string myStr = s[0]; return 0; } cs mystr에 H가 들어가야 할 거 같지만 string 클래스에 myStr = s[0]과 같은 생성자가 없기에 위와 같은 에러가 발생한다. 따라서 다음과 같이 생성..

언어/C++ 2022.11.05

[백준 11404] 플로이드 C++

문제 백준 11404 플로이드 C++ 풀이 전형적인 플로이드-와샬 알고리즘 문제이다. 3중 포문을 통해 모든 정점에서부터 모든 정점까지의 최소 거리를 구한다. 소스 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 #include #include using namespace std; const int INF = 987654321; int n, m; int dist[101][101]; int main(..

알고리즘/백준 2022.09.27

[C++] string 덧셈

개요 알고리즘 문제를 풀다 보면, 숫자 범위가 long long 타입조차 초과하는 경우가 발생한다. 이럴 때는 string 타입으로 바꿔 계산할 필요가 있다. 풀이 원활한 계산을 위해 길이가 더 작은 string에 다른 string의 길이와 같게 되도록 앞에 0을 붙여준다. 예를 들어 17547 + 49의 경우 17547 + 00049로 만들어 준다. 그 후, 뒤에서 부터 덧셈을 진행하여 sum, carry를 계산하고 마지막에도 carry가 1이 발생하면 1을 앞에 붙여준다. 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 ..

언어/C++ 2022.09.17

[C++] Inline 함수

개요 일반적으로 함수가 호출되면, 함수에 전달할 매개변수와 함수 호출이 끝난 뒤 돌아갈 반환 주소값을 스택에 저장하게 된다. 그 후에 프로그램 제어가 함수의 위치로 넘어오고, 함수 내에 선언된 지역 변수도 스택에 저장한다. C++에서 함수를 호출하면 위와 같은 복잡한 과정을 거치게 되므로, 함수를 호출하는데에 약간의 시간이 소요된다. 함수 실행 시간이 길다면 함수 호출 시간이 차지하는 부분이 미미하지만, 함수 실행 시간이 짧다면 함수 호출 시간이 함수 실행 시간보다 더 길어지는 배보다 배꼽이 큰 상황이 발생할 수 있다. C++에서는 이러한 경우에 사용할 수 있는 인라인 함수(Inline function)을 제공한다. 인라인 함수는 호출되었을 때 일반적인 함수 호출의 과정을 거치지 않고, 인라인 함수의 모..

언어/C++ 2022.07.19

[C++] string 한글 출력

개요 C++에서 string으로 한글을 출력할 때 깨지는 오류가 있었다. 관련해서 디버깅해보던 중에 한글이 2바이트... 인걸 깨닫게 되어 정리해본다. 예제 다음과 같은 코드의 출력 결과는 어떻게 될까? 1의 결과로는 "심"이 출력되고 2의 결과로는 3(심건우가 3글자이므로)이라고 생각하기 쉽다. #include #include using namespace std; int main() { string s = "심건우"; cout

언어/C++ 2022.07.15

[C++] 프로그램 실행 순서

개요 C++의 프로그램 실행 순서에 대해 서술한다. 일반적으로 소스 파일 작성 - 전처리기 - 컴파일 - 링킹 - 로딩 - 실행의 단계를 따른다. 소스 파일 작성 에디터를 사용해 프로그램을 작성한다. 이렇게 C++ 문법에 맞게 작성된 프로그램을 원시 파일, 소스 파일이라고 한다. 소스 파일의 확장자의 대부분은 .cpp가 된다. 전처리 컴파일하기 전에, 컴파일러가 작업하기 좋도록 소스를 재구성한다. 코드를 추가로 생성하지는 않는다. #include에 지정된 내용을 복사하고, #define에 정의된 매크로를 치환한다. #if, #ifdef, #pragma 등의 구문들도 처리한다. 컴파일 컴퓨터는 0과 1만 인식할 수 있기 때문에, 소스 파일을 기계어로 변환해야 한다. 컴파일러는 코드들을 어셈블리어로 바꾸어준..

언어/C++ 2022.07.13

[C++] 가상 함수 (virtual)

개요 가상 함수(virtual funcion)란, 자식 클래스에서 재정의할 것으로 예상되는 멤버 함수를 의미한다. 가상 함수는 자신을 호출하는 객체의 타입에 따라 실제 호출할 함수가 결정된다. 부모 클래스에서 virtual을 사용해 가상 함수를 선언하면, 자식 클래스에서 재정의된 멤버 함수도 자동으로 가상 함수가 된다. 선언 virtual FunName(); 동적 바인딩 C++ 컴파일러가 함수를 호출할 때 함수가 어느 블록의 어느 메모리 위치에 있는지 정확히 알고 있어야 한다. 대부분의 함수를 호출하는 코드는 컴파일 타임에 고정된 메모리 주소로 변환된다. 이것을 정적 바인딩(static binding), 초기 바인딩(early binding)이라고 한다. C++에서 가상 함수가 아닌 멤버 함수는 정적 바..

언어/C++ 2022.07.10
반응형