알고리즘/C++

C++ 기본

mint* 2022. 12. 28. 17:47
728x90

 

출처: 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;
}

 

 

728x90