프로그래밍 언어/C C++ 15

M1 Mac VSCode에서 #include errors detected 오류 해결하기

오랜만에 기분좋게 42서울 과제를 해결하려 vscode를 실행했다. 그런데 갑자기 #include errors detected 라는 이상한 오류가 뜨기 시작했다. gcc를 이용해서 컴파일 할 때는 문제가 없었지만, 상당히 거슬렸다. 이유를 하나하나 찾아가 보았다. M1맥의 gcc 또는 g++ gcc와 g++은 각각 c언어 컴파일러, c++ 컴파일러이다. vscode에서는 c(++)에 관한 플러그인이 있는데, 이는 자동으로 컴파일러의 위치를 파악해 코드의 오류를 찾아낸다. 하지만 무슨 이유인지는 모르겠지만, M1맥 에서는 gcc(g++) 경로를 찾지 못하는 모습을 보였다. 아마도 수동으로 C/C++ Extension에 컴파일러 경로를 설정하면 될 것 같았다. 컴파일러 위치 찾기 최근에도 이걸 사용한 것 같..

맥에서 <bits/stdc++.h> 사용하기

알고리즘 문제를 풀이할 때 C++을 이용해서 푸는 경우에 bits/stdc++.h 헤더를 사용하기도 한다. 이것은 gcc 컴파일러에서만 사용할 수 있는 비표준 라이브러리이다. 위 헤더 파일은 대부분의 C++ 헤더 파일이 포함되어 있어 알고리즘 문제를 풀이할 때 헤더 파일을 여러 개 불러와야 하는 수고를 줄일 수 있다. 또한 대부분의 알고리즘 저지 사이트에서 bits/stdc++.h 를 지원하기 때문에 알고리즘 풀이에서는 문제없이 사용이 가능하다. 하지만 bits/stdc++.h 헤더 파일은 gcc 컴파일러에서만 동작한다. 리눅스 PC는 기본 컴파일러가 gcc일 것이다. 없으면 gcc 설치하면 된다. 그렇게 하면 bits/stdc++.h 를 바로 사용할 수 있다. 그러나 맥 에서는 상황이 다르다. gcc ..

C++ deque 자료형 사용법

STL 컨테이너를 최대한 잘 활용해보자. deque 기본 개념 vector와 비슷한 배열 개념이다. vector와 다르게 여러개의 메모리 블록을 하나의 블록처럼 여긴다. 이로 인해 삽입 연산 시에 더욱 빠른 연산이 가능하다. deque 선언 기본 선언 : deque dq; deque 함수 dq[idx] : 해당 원소 참조 dp.push(pop)_front(back)() : 맨 앞이나 맨 뒤에 데이터 삽입 혹은 제거 begin() : 첫번째 원소의 iterator 반환 end() : 마지막 다음 원소의 iterator 반환 insert(a,b) : a에 b를 삽입 후 삽입한 곳의 iter 반환 erase(a) : a(iter) 가 가리키는 원소 제거, 제거 후 앞 뒤 원소 개수 판단하여 적은쪽 원소를 당긴..

C++ list 자료형 사용법

백준 문제를 풀다가 왠지 배열로 풀면 시간초과가 날 것 같고, 벡터로 풀기 애매한 문제가 있었다. 그래서 링크드 리스트를 기반으로 한 STL 컨테이너를 찾다가, 비교적 적절한 방법을 발견했다. 바로 list를 이용하는 것이다. list 기본 개념 list는 기본적으로 양방향 링크드 리스트 구조를 가지고 있다. 그래서 쉽게 붙이고, 잘라낼 수 있다. 하지만 인덱스로 찾는 것이 불가능 (예 : at, [] ) 하다. 그래서 iterator를 이용하여 탐색을 해야 한다. list 선언 1. 기본 선언 -> list l ; list 함수 assign(a, b) : b값을 가진 a개 원소 할당 insert(a, b) : iter a 의 위치에 b 삽입 begin() : 시작 iter 반환 end() : 마지막 i..

C++ map 자료형 사용법

set 자료형에 이어서 map 자료형도 존재한다. 혹시나 사용할 일이 있을 때 사용하려고 정리해 두려고 한다. set 기본 개념 set 자료형 과는 다르게, set은 한 개의 자료형을 담을 수 있으나 map은 한 개의 인덱스에 두 개의 자료형을 정리할 수 있다. (예시 ) 구조는 트리 구조로 되어 있으며, 값이 중복될 수 없다. map 선언 1. 기본 선언 -> map m; map 함수 https://www.cplusplus.com/reference/map/map/ map - C++ Reference difference_typea signed integral type, identical to: iterator_traits ::difference_type usually the same as ptrdiff_..

C++ set 자료형 사용법

백준 1525 (https://www.acmicpc.net/problem/1525) 문제를 풀다가 현재 내가 아는 자료형으로 풀기 힘들다는 생각이 들어서 구글링을 하다가 set 이라는 자료형을 찾아냈다. 중복되지 않는 무언가를 저장할 때 매우 유용해 보인다. set 자료형에 대해서 간단히 알아보자. set 기본 개념 set은 노드 기반 컨테이너이다. 원소들은 중복이 허용되지 않으며, 원소 삽입 시 원소는 자동으로 정렬이 된다. 기본 정렬 기준은 오름차순이다. set 선언 1. 기본 선언 하기 -> set s; 2. 정렬 기준 세우기 -> set s; pred는 정렬 기준을 바꾸기 위한 구조체이다. 기본은 less, 내림차순으로 바꾸고 싶으면 greater로 바꾸면 된다. 그 이외의 정렬 기준을 세우고 싶..

C언어의 static 변수

C언어를 하다가 보면 static이 앞에 붙은 변수들이 있을 것이다. 이것들은 왜 있으며, 어떻게 사용하는 것일까? 메모리 구조 일단은 운영체제에서 제공하는 메모리 영역을 살펴보자. 크게 보면은 코드 영역, 데이터 영역, 힙 영역, 스택 영역 이렇게 총 4가지로 구분이 된다. 아래의 그림은 메모리 구조를 도식화 한 것이다. 프로그램의 코드들은 코드 영역에 들어간다. CPU는 여기 저장된 명령어를 알아서 처리하게 된다. 데이터 영역은 전역 변수 및 정적 변수 (static)가 들어가게 된다. 이곳은 프로그램의 시작과 동시에 할당되고, 프로그램이 종료됨과 동시에 소멸한다. 전역 변수와 정적 변수는 할당과 동시에 0 또는 NULL로 초기화 되는 특징이 있다. 스택 영역은 지역 변수와 매개변수가 저장되는 영역이..

size_t 는 무엇일까?

c프로그래밍을 하다 보면은 종종 size_t 와 같은 자료형을 볼 수 있을 것이다. c를 배운 사람이라면 int, double, long, float 등의 자료형은 흔히 봐 왔을 것이다. 하지만 size_t, ssize_t 등의 자료형도 가끔식 보인다. 이러한 자료형은 왜 있는 것일까? 동작 환경에 따른 차이 현재 대부분의 x86 컴퓨터는 32비트 또는 64비트 운영체제를 사용하고 있다. 요즘은 ARM에서도 64비트를 사용 중이다. c언어의 변수의 크기는 구동 환경에 따라 다르다. 보편적인 경우에 int형의 크기는 4바이트 (32비트)라고 알 것이다. 이는 32비트의 환경에서만 적용된다. 즉, 대부분의 변수는 동작 환경에 따라 크기가 달라진다. 하지만 size_t 의 경우에는 다르다. 보통 헤더 파일에 ..

C언어 메모리 누수 확인하기

C언어가 다른 프로그래밍 언어에 비해서 가지는 장점은 속도와 메모리 접근성일 것이다. C는 역사가 오래된 언어이기 때문에 기계어랑 가까운 편에 속하고 실행 속도도 빠르다. 무엇보다 메모리에 직접 접근이 가능한 장점 덕분에 임베디드 시스템에서도 오랫동안 자리를 차지한 언어이다. 하지만 C언어는 다른 언어에 비해 복잡하고, 메모리 누수를 막지 못하면 프로그램의 효율이 떨어지는 단점을 가지고 있다. C로 프로그램을 작성하고 나서 메모리 누수가 나면 매우 안타깝다. 이럴 때 간단하게 메모리 누수를 확인하는 Tool이 있다. 1. (MAC 한정) leaks leaks [PID] 를 이용하면은 현재 메모리 누수가 얼마나 있는지 확인이 가능하다. 하지만 정확도가 낮은 편이고, 맥 에서만 지원되는 프로그램이기에 간단히..

줄넘김 문자 endl , \n 차이

줄넘김 문자를 출력할 때 c++에서는 endl 과 \n 의 두 가지 선택지가 있다. 둘 중 무엇이 더 빨리 출력이 될까? 정답은 \n이다. 왜냐하면 std 내부에 정의되어 있는 endl을 보면 다음과 같다. 1 2 3 4 5 6 basic_ostream& __CLRCALL_OR_CDECL endl( basic_ostream& _Ostr) { // insert newline and flush stream _Ostr.put(_Ostr.widen('\n')); _Ostr.flush(); return _Ostr; } Colored by Color Scripter cs 마지막에 보면 flush() 함수가 있다. 간단히 말하면, 버퍼를 비우는 동작이 endl 안에 포함되어 있기 때문에, 시간이 느린 것이다. 알고리..