출처: https://www.inflearn.com/course/10%EC%A3%BC%EC%99%84%EC%84%B1-%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%81%B0%EB%8F%8C
큰돌님의 C++ 기본 중 제가 헷갈리거나 다시 짚을 개념들만 정리하였습니다.
-수정중-
typedef : 별칭 사용
typedef <타입> <별칭>
#include <bits/stdc++.h>
using namespace std;
typedef int i;
int main(){
i a = 1;
cout << a << "\n";
return 0;
}
#define : 상수, 매크로 정의
#include <bits/stdc++.h>
using namespace std;
#define PI 3.141592
#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;
}
컨테이너
시퀀스 컨테이너
데이터를 단순히 저장해놓은 자료구조
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를 이용해 힙 자료구조로 만든다.
정수를 소수로 입력받기
#include <iostream>
using namespace std;
int a,b;
double c;
int main(){
scanf("%d.%d", &a, &b);
printf("\n %d %d \n", a, b);
return 0;
}
3.24입력시에 a=3, b=24 입력된다.
%d.%d에서 .이 구분자 역할을 한다.
개행문자(엔터,\n)까지 한꺼번에 입력받기
#include <iostream>
using namespace std;
int main(){
string s;
getline(cin, s);
cout << s;
return 0;
}
getline을 여러번 사용해야하는 순간일때
특정 문자열을 기준으로 버퍼플래시를 하고 받으면 된다.
#include <iostream>
using namespace std;
int T;
string s;
int main(){
cin >> T; //반복해서 입력받을 횟수 입력
string bufferflash;
getline(cin, bufferflash); //버퍼플래시로 횟수 입력한 후의 개행문자를 입력받음
//T번 반복해서 문자열 입력받기
for(int i=0;i<T;i++){
getline(cin,s);
cout << s << '\n';
}
return 0;
}
반올림해서 출력
cout.precision(자릿수) ⇒ 자리수에서 반올림하므로 총 자리수는 자릿수-1자리
#include <iostream>
using namespace std;
typedef long ll;
double a= 1.23456789;
int main(){
cout << a << "\n"; //기본: 소수점 5자리수 출력
cout.precision(7); // 소수점 7자리에서 반올림
cout << a << "\n"; //소수점 6자리 수 출력
return 0;
}
printf 형식 정렬
#include <iostream>
using namespace std;
int main(){
double a = 1.23456789;
int b = 2;
printf("%.6lf\n", a);
printf("%02d", b);
return 0;
}
문자열 출력시엔 string str 변수를 str.c_str()로 출력하기: string을 문자열 포인터 타입(char*)으로 바꿔줌
int : 4 byte 정수
약 20억까지 표현 가능하다. 문제를 풀때는 int의 최대값으로 20억이 아닌 987,654,321 (9억)또는 1e9를 사용한다. 이 INF를 기반으로 INF+INF라는 연산이 일어날 수도 있고 INF*2, INF+작은 수 연산이 일어날 때 오버플로를 방지할 수 있다.
const int INF = 987654321;
long long
20억 이상의 숫자를 표현할 때 사용한다. INF는 1e18로 표현한다.
pair와 tuple
pair와 tuple은 c++에서 제공하는 utility 라이브러리 헤더의 템플릿 클래스이며 자주 사용된다.
pair -> first, second
tuple -> 세가지 이상의 값
tie: pair이나 tuple로부터 값을 끄집어낼때 사용되는 함수
#include <bits/stdc++.h>
using namespace std;
pair<int, int> pi;
tuple<int, int, int> tl;
int a,b,c;
int main(){
pi={1,2}; //또는 pi = make_pair(1,2);
tl = make_tuple(1,2,3);
tie(a,b)=pi; //a=pi.first, b=pi.second로도 가능
cout << a << " : " << b << "\n";
tie(a,b,c) = tl; //a=get<0>(tl); b=get<1>(tl); c=get<2>(tl);로도 가능
cout << a << ":" << b << ":" << c <<"\n";
return 0;
}
메모리 구조
배열의 초기화
fill과 memset 함수가 있다.
fill(시작값, 끝값, 초기화하는 값)
모든 값을 기반으로 초기화 가능, O(n)
#include <bits/stdc++.h>
using namespace std;
const int max_n = 1004; //배열 크기 최대값
const int INF = 987654321; //초기화할 값(최대값으로 설정)
vector<int> v(10,0); //크기 10인 벡터를 0으로 초기화
vector<int> v2[10]; //벡터 10개 선언
vector<vector<int>> v3; //2차원 벡터 선언
vector<vector<int>> v4(10, vector<int>(10,0)); // 10*10인 2차원 벡터 선언, 0으로 초기화
//1차원 벡터를 0으로 초기화(추천X-일부 컴파일러에서는 통하지않을수있음)
int dp[10]={0,};
//배열 선언
int a[max_n];
int a2[max_n][max_n];
int main(){
//벡터 초기화
fill(v.begin(), v.end(), INF);
//배열 초기화
fill(a, a+max_n, 10);
//2차원 배열 초기화(1)
for(int i=0;i<max_n;i++) fill(a2[i], a2[i]+max_n, INF);
//2차원 배열 초기화(2) , 추천
fill(&a2[0][0], &a2[0][0]+max_n*max_n, INF);
return 0;
}
memset(배열의 이름, 초기화할 값 k, 배열의 크기)
바이트 단위로 초기화, 0,-1,char형의 하나의 문자('a', 'b'..)로 초기화할때만 사용
fill보다 간편하지만 초기화할 수 있는 값이 한정되어있다.
#include <bits/stdc++.h>
using namespace std;
const int max_n = 1004; //배열 크기 최대값
const int INF = 987654321; //초기화할 값(최대값으로 설정)
int a[max_n];
int a2[max_n][max_n];
int main(){
memset(a, -1, sizeof(a)); //배열이름, 초기화할 값, 배열 크기
memset(a2, 0, sizeof(a2));
for(int e:a) cout << e << "\n"; //-1이 1004개 출력된다.
return 0;
}
memcpy(목적지주소, 출발지주소, 복사할 크기)
어떤 변수의 메모리에 있는 값들을 다른 변수의 특정 메모리값으로 복사할때 사용, 깊은 복사시 사용한다.
#include <bits/stdc++.h>
using namespace std;
int a[5], temp[5];
int main(){
for(int i=0;i<5;i++)a[i]=i; // 0 1 2 3 4
//a를 a의 크기만큼 temp에 복사한다.
memcpy(temp,a,sizeof(a));
for(int i:temp) cout <<i << " "; // 0 1 2 3 4
cout << "\n";
//a를 수정한다.
a[3]=30;
for(int i:a) cout <<i << " "; // 0 1 2 30 4
cout << "\n";
//수정 후에 다시 수정 전으로 돌아가고싶다
memcpy(a,temp,sizeof(temp));
for(int i:a) cout << i << " "; // 0 1 2 3 4
return 0;
}
'알고리즘 > C++' 카테고리의 다른 글
2주차 그래프이론, DFS, BFS (2) | 2023.01.09 |
---|---|
string STL (0) | 2022.12.28 |
1주차: 시간복잡도, 누적합 (1) | 2022.12.28 |
알고리즘 암기할 코드들 (0) | 2022.12.27 |
0주차: 재귀, 순열, 조합, split (1) | 2022.12.27 |