코딩테스트
[코딩테스트, 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값으로 정렬하기
- map을 vector로 이동
- 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이면 숫자 아님