맥에서는 보통 xCode or vsCode 로 작업할 예정이다.. 나는 vsCode 로 할 것이다.
brew install gcc
bits/stdc++.h 란?
C++ 의 표준 라이브러리가 모두 포함된 헤더이다!
iostream, csdio 등 여러 라이브러리에 있는 함수를 신경쓸 필요가 없어진다.
Mac 에서는 window의 Dev C++ 와는 달리 include 하려면 별도의 작업이 필요하다.
cd/usr/local/include
mkdir bits
cd bits
vi stdc++.h
여기서 만약에 Permission denied 가 뜬다면?
sudo mkdir bits
그리고 파일이 저장이 안된다?
그러면 그냥 따로 만들어서 넣어주자!
#ifndef _GLIBCXX_NO_ASSERT
#include <cassert>
#endif
#include <cctype>
#include <cerrno>
#include <cfloat>
#include <ciso646>
#include <climits>
#include <clocale>
#include <cmath>
#include <csetjmp>
#include <csignal>
#include <cstdarg>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#if __cplusplus >= 201103L
#include <ccomplex>
#include <cfenv>
#include <cinttypes>
#include <cstdbool>
#include <cstdint>
#include <ctgmath>
#include <cwchar>
#include <cwctype>
#endif
// C++
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>
#if __cplusplus >= 201103L
#include <array>
#include <atomic>
#include <chrono>
#include <condition_variable>
#include <forward_list>
#include <future>
#include <initializer_list>
#include <mutex>
#include <random>
#include <ratio>
#include <regex>
#include <scoped_allocator>
#include <system_error>
#include <thread>
#include <tuple>
#include <typeindex>
#include <type_traits>
#include <unordered_map>
#include <unordered_set>
#endif
내가 만들고 싶은 경로에 a.cpp 파일을 만들자
#include <bits/stdc++.h>
using namespace std;
int main() {
cout << 1 << "\n";
return 0;
}
다음의 명령어 실행!
a.cpp 라는 파일을 엄격하게(-wall) C++14버전으로 컴파일해서 test.out 라는 파일을 만든다.(-o test.out)는 뜻이다.
g++ -std=c++14 -Wall a.cpp -o test.out
./test.out
#include <bits/stdc++.h> // --- (1)
using namespace std;// --- (2)
string a;// --- (3)
int main(){
cin >> a;// --- (4)
cout << a << "\n";// --- (5)
return 0; // - (6)
}
설명
(1) 헤더 파일을 include 포함시킨다. bits/stdc++.h 는 C++ 의 모든 표준 라이브러리 포함된 헤더파일!
(2) std 라는 네임스페이스를 사용한다. 네임스페이스란? 많은 라이브러리를 불러서 사용하다보면 변수명 중복이 생기는데, 이를 방지하기 위해 변수명에 범위를 걸어놓는 의미이다.
(3) 문자열 변수 a 선언, string 타입을 가진 a 라는 변수이다. 만약, string a = '안녕'; 이라고 한다면, a는 lvalue 라고 하고 안녕 은 rvalue 라고 한다. lvalue는 추후 다시 사용될 수 있는 변수이고, rvalue는 한번 쓰고 다시 사용되지 않는 변수이다.
(4) 변수 a 를 입력받는다. 대표적으로 cin, scanf 가 있다.
(5) 변수 a 를 출력한다. 대표적으로 cout, prinf 가 있다.
(6) main 함수를 종료시키는 return 0 이다. 프로세스를 정상적으로 마무리한다는 뜻, C++ 은 cpp 파일당 하나의 main 함수만 만들수 있다!
typedef는 타입의 이름을 새로 별칭으로 정의하는 것!
C++ 에서 이미 정의 된 타입 이나 사용자가 정의한 타입(struct or class)보다 더 짧게 지을수 있다.
상수, 매크로를 정의할수 있다.
#definde <이름> <값>
상수 PI 값을 정의 하였고, for 반복문을 loop 라는 문자열로 치환한 것이다.
#include<bits/stdc++.h>
using namespace std;
#define PI 3.14159
#define loop(x, n) for(int x = 0; x < n; x++)
int main() {
cout << PI << '\n';
int sum = 0;
loop(i, 10){
sum += i;
}
cout << sum << '\n';
return 0;
}
/*
3.14159
45
*/
C++ 은 STL()을 제공하며 이는 자료구조, 함수 등을 제공하는 라이브러리이다. 알고리즘, 컨테이너, 이터레이터, 펑터 4가지 제공한다.
C++ 로 vector 의 자료구조를 쓴다거나 sort() 함수를 쓸 수 있는 것은 다 ~ STL 덕분이다.
정렬, 탐색 등에 관한 함수로 이루어져 있습니다. sort() 대표적이다.
시퀀스 컨테이너 - 데이터를 단순히 저장해 놓는 자료구조 (array, vector, deque, forward_list, list)가 있다.
연관 컨테이너 - 자료가 저장됨에 따라 자동정렬되는 자료구조를 말한다.
중복키가 가능한 가능한 것에는 이름이 multi 가 붙는다. set, map, multiset, multimap 이 있다.
정렬되지 않은 연관 컨테이너 - 자료가 저장됨에 따라 자동정렬이 되지 않는 자료구조를 말한다. unordered_set, unordered_map, unordered_multiset, unordered_multimap이 있다.
컨테이너 어댑터 - 시퀀스 컨테이너를 이용해 만든 자료구조이며, stack, queue 는 deque 로 만들어져있고 priority_queue는 vector 을 이용해 힙자료구조로 만든다.
추후 공부 예정
펑터란 함수 호출 연산자를 오버로드 하는 클래스의 인스턴스를 말한다.
자세한 정리는 나중에! 지금은 간단하게 무슨 이론이다만 알고 넘어가자!