코딩테스트

[코딩테스트, C++] C++ STL 문법 정리

치킨유망주 2021. 12. 20. 01:58

입출력

#inlcude <stdio.h> // <cstdio>
#include <iostream>
using namespace std;
scanf();
printf();
cin >> temp;
cout << "Hello" << temp << endl;

코테 시작 코드

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <set>
#include <iostream>
#include <cmath>
#include <stdlib.h>
#include <string>
using namespace std;

int main(int argc, char* argv[]) {

}

Pair

두 가지 자료형을 하나의 쌍으로 묶을 수 있다.

#inlcude <vector> // <algorithms>

// pair 선언
pair<int, char> p;
// pair 접근
scanf("%d %c", &p.first, &p.second);
// pair 만들기 함수
p = make_pair(3, 'b');

Vector

크기가 가변적인 배열이다.

  • front() : 첫 번째 원소
  • back() : 마지막 원소
  • begin() : 첫 번째 위치
  • end() : 마지막 위치
  • push_back() : 마지막에 데이터 추가
  • pop_back() : 마지막에 데이터 제거
  • size() : 원소의 개수
  • erase() : erase(v.begin()) ⇒ 첫 번째 원소 제거
  • clear() : 비우기
  • reverse(v.begin(), v.end()) ⇒ string도 reverse가 됨
#include <vector>
#include <algorithm>
int main(int argc, char *argv[]) {
	vector<int> v1 = {1, 2, 3};
	vector<pair<int,char>> v2; // vector<pair<int,string>> v2
	v1.pushback(4); // v1.front(), v1.back(), v1.back(), v1.begin(), v1.end()
	v1.popback(); // v1.size()
	v2.pushback(make_pair(1,'a')) // pair로 벡터 선언 가능
}
  • vector를 2차원배열처럼.
#inlcude <vector>

int main(int argec, char *argv[]) {
	vector<vector<int>> v;
	vector<int> tv;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < 3; j++) {
			int temp;
			scanf("%d", &temp);
			tv.push_back(temp);
		}
		v.push_back(tv);
		tv.clear();
	}
}
  • 정적 vector 선언 및 0초기화
#inlcude <vector>

int main(int argec, char *argv[]) {
	int n;
	cin>>n;
	vector<int> v(n); // n개 길이의 벡터 선언, 자동으로 0으로 채워짐
	vector<vector<int>> v2(vector<int>(n, 0)); // 2차원벡터 0 초기화
	for (int i = 0; i < n; i++) {
		cout << ch[i] << " ";
	}	
}

Queue

큐 자료구조

  • push() : 데이터 추가
  • pop() : 처음의 데이터 뽑기
  • front() : 첫 번째 원소
  • back() : 마지막 원소
  • size() : 큐의 크기
  • empty() : 큐가 비었는지 확인
#inlcude <queue>

int main(int argec, char *argv[]) {
	queue<int> q1;
	queue<pair<int,char>> q2;
	q1.push(4);
	q1.pop();
	q2.push(make_pair(1,'a'))
}
  • pair를 원소로 가지는 queue의 접근
#inlcude <queue>

int main(int argec, char *argv[]) {
	queue<pair<int,int>> q;
	q.push(make_pair(0,0));

	int x = q.front().first;
	int y = q.front().second;
	q.pop();
}

 

Stack

스택 자료구조

  • push() : top에 데이터 추가
  • pop() : top의 데이터 뽑기
  • top() : top의 원소
  • size() : 스택의 크기
  • empty() : 스택이 비었는지 확인
#inlcude <stack>

int main(int argec, char *argv[]) {
	stack<int> s1;
	stack<pair<int,char>> s2;
	s1.push(4);
	s1.pop();
	s2.push(make_pair(1,'a'))
}

 

Set

key라고 불리는 원소들의 집합 중복이 허용되지 않음

  • insert() : 원소 삽입
  • begin() : 첫 번째 원소를 가르키는 iterator를 반환
  • end() : 마지막 원소를 가리키는 iterator를 반환
  • find(k) : 원소 k를 가리키는 iterator를 반환
  • size() : set의 원소 수
  • empty() : 비었는지 확인
#include <iostream> 
#include <cstdio> 
#include <set> 
using namespace std; 
int main(int argc, const char * argv[]) { 
	set<int> s1; 
	s1.insert(1); 
	s1.insert(2); 
	s1.insert(6); 
	s1.insert(5); 
	s1.insert(4); 
	s1.insert(3); 
	set<int>::iterator it; 
	for (it = s1.begin(); it != s1.end(); it++) 
	{ 
		printf("%d ", *it); 
	}
	printf("\\n"); 
	it = s1.find(7); 
	printf("%d\\n", *it); 
	it = s1.find(6); 
	printf("%d\\n", *it); 
}

 

Map

<key, value> 쌍으로 저장하는 자료구조, 중복이 허용되지 않으며 자동으로 오름차순 정렬

  • insert(make_pair(k,v)) : 원소 삽입
  • erase(k) : key값 k를 갖는 원소를 삭제
  • begin() : 첫 번째 원소를 가리키는 iterator를 반환
  • end() : 마지막 원소를 가리키는 iterator를 반환
  • find() : map의 원소 수
  • empty() : 비었는지 확인
#include <iostream> 
#include <cstdio> 
#include <map> 
using namespace std; 
int main(int argc, const char * argv[]) { 
	map<char, int> m1; 
	m1.insert(make_pair('a', 1));
	m1.insert(make_pair('e', 5)); 
	m1.insert(make_pair('c', 3)); 
	m1.insert(make_pair('d', 4)); 
	m1.insert(make_pair('b', 2)); 
	m1['e'] = 6; 
	m1['f'] = 7; 
	map<char, int>::iterator it; 
	for (it = m1.begin(); it != m1.end(); it++) { 
		printf("<%c %d> ", (*it).first, (*it).second); 
	} 
	printf("\\n"); 
	it = m1.find('c'); 
	printf("%d\\n", (*it).second); 
	it = m1.find('d'); 
	printf("%d\\n", (*it).second); 
	m1.erase('a'); 
	m1.erase('c'); 
	for (it = m1.begin(); it != m1.end(); it++) { 
		printf("<%c %d> ", (*it).first, (*it).second); 
	} 
	printf("\\n"); 
}

 

Sort

C++의 algorithm 헤더에 포함되어 있다.

  • sort(first, last) : 오름차순 정렬
#include<iostream>
#include<algorithm>
using namespace std;

int main(){
	// 배열의 크기가 10인 정렬되지 않은 배열 
	int arr[10] = {9, 3, 5, 4, 1, 10, 8, 6, 7, 2};
	vector<int> v
	... // 벡터에 값 넣기
	sort(v.begin(), v.end())
	// sort() 함수에 정렬할 배열의 범위를 지정 
	sort(arr, arr + 10); 
	// --> sort() 함수가 실행되고 나면 arr 배열의 정렬 완료!
	
	for(int i = 0 ; i < 10 ; i++){
		cout<<arr[i]<<' ';
	} 
}
  • sort(first, last, compare) : 내림차순 정렬
#include<iostream>
#include<algorithm>
using namespace std;

/* 두 수인 a와 b가 있을 때 a가 더 클 경우 true를 반환하는 함수 */
bool compare(int a, int b){
	return a > b;
}

int main(){
	int arr[10] = {9, 3, 5, 4, 1, 10, 8, 6, 7, 2};
	
	// sort() 함수에 정렬 기준을 담은 함수 추가 
	sort(arr, arr + 10, compare); 
	
	for(int i = 0 ; i < 10 ; i++){
		cout<<arr[i]<<' ';
	} 
}
  • Map을 value값으로 정렬하기
    1. map을 vector로 이동
    2. vector를 second 기준으로 정렬
#include<iostream>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;

bool compare(int a, int b){
	if (a.second == b.second) return a.first < b.first;
	return a.second < b.second;
}

int main(){
	map<int, int> m;
	... // m 세팅
	for (auto num : m) {
		cout << "key: " << num.first << " | value: " << num.second << "\\n";
	}
	vector<pp> vec( m.begin(), m.end() );
	sort(vec.begin(), vec.end(), compare); // vector<pair<int,int>> vec( m.begin(), m.end() );
	for (auto num : vec) {
		cout << "key: "<< num.first << " | value: " << num.second << "\\n";
	}
}

 

문자열 다루기

  • #include <string> 헤더 포함
  • string str = "";
  • string 자료형은 '==' 비교 가능
#define _CRT_SECURE_NO_WARNINGS
#include <string>
using namespace std;

string isReverse(string str) {
	string temp = "";
	for (int i = str.size() - 1; i >= 0; i--) {
		temp = temp + str[i]; // +연산도 가능하다.
	}
	return temp;
}

int main(int argc, char* argv[]) {
	string str = "";
	cin >> str; // 문자열 입력받기
	transform(str.cbegin(), str.cend(), str.begin(), tolower); // 소문자로 변경
	transform(str.cbegin(), str.cend(), str.begin(), toupper); // 대문자로 변경
}

 

기타 함수

  • int isdigit(char c) : 0이면 숫자 아님