코테 공부하면서 C++ 관련으로 알게된 내용들
-
scanf, printf가 cin, cout보다 빠르다. (c/c++ 동기화 풀지 않는다는 전제 하에)
-
한 줄째로 읽어와야하는 경우에는 cin 쓰면서 아래 내용 추가하기. c/c++ 동기화 해제하면서 빨라짐
ios_base::sync_with_stdio(false); cin.tie(0); getline(cin, string, '구분자');
-
getline 쓰기 전에 따로 또 입력받는거 있으면 cin.ignore()로 버퍼 한 번 비워주기
-
strtok는 cstring에 있음
-
atoi는 stdlib.h에 있음
-
범위 기반 for문과 auto를 사용하면 반복을 더 빠르게 할 수 있다. → for(auto data : array)
-
수 * bool 가능함. 이걸로 특정 조건에 맞을 때만 더하게 한다던가 할 수 있음!
-
printf(”\n”) 보다 puts(””)가 더 빠르다! (puts는 무조건 문자열만 출력하기 때문에 형식 생각 안해도 돼서 그런 듯.)
-
scanf()의 반환값은 데이터를 저장하는데 성공한 변수의 수이다. 이걸 반복문의 조건문으로 쓰면 입력값이 없을 때 까지 반복하게 할 수 있음.
- ex. 크냐? 문제 우수 코드 : for(;scanf(”%d%d”, &a, &b);puts(a>b?”Yes”:”No”))
-
대문자의 소문자 화 : +32, 소문자의 대문자 화 : -32
-
알파벳 대문자 : 65에서 90까지
-
알파벳 소문자 : 97에서 122까지
-
string 헤더파일에 stoi, to_string 있으니까 굳이 stdlib.h 찾지말고 string에서 쓰자
-
홀짝 연산으로 &1 써먹으면 좋음
-
include <bits/stdc++.h> ← 이 헤더파일 쓰면 표준 라이브러리 대부분 쓸 수 있음
-
accumulate 함수 잘 쓰면 유용함
accumulate(배열_컨테이너의_시작지점, 배열_컨테이너의_끝지점, 초기값);
accumulate(배열_컨테이너의_시작지점, 배열_컨테이너의_끝지점, 초기값, 커스텀함수);
// 커스텀함수는 첫 번째 인자로 지금까지의 누적 합, 두 번째 인자로 이번에 더할 값을 받는다
// 사용 예시 1. 모든 수를 더하기
accumulate(nums.begin(), nums.end(), 0);
// 사용 예시 2. 모든 수를 빼기
accumulate(nums.begin(), nums.end(), 0, [](int x, int y){return x - y;});
// 여기서는 커스텀함수를 사용해 누적 값인 x에서 이번 값인 y를 빼는 작업을 반복함
// 사용 예시 3. 홀수 인덱스에 있는 값만 더하기
accumulate(nums.begin(), nums.end(), 0, [&, index = 0](int x, int y) mutable {
return (index++%2==1)? x + y : x;}
- 반복자에서 end()는 값이 없단 뜻이다!!! 반복자는 [ ) 형식이다!!! begin은 포함되지만 end는 포함되지 않음을 잊지 말기!!!
- 반복자에서 * 써도 포인터 *처럼 값 찾아낼 수 있음
- max_element(vector.begin(), vector.end()) : 최대값의 반복자가 나옴
- string.substr(pos, count) : 부분 문자열 추출. pos부터 count 개 사용
- string.push_back은 char 한 글자밖에 못들어감
- 문자열끼리 이으려면 string.append() 하던가 += 사용
- find(탐색 문자열, 인덱스 = 0) : 탐색 문자열을 앞에서부터 검색함
- rfind(탐색 문자열, 인덱스 =npos) : 탐색 문자열을 뒤에서부터 검색함
- 정규표현식 사용하는법
#include <regex>
...
int main() {
string str;
regex r("구분자");
sregex_token_iterator it(str.start(), str.end(), r, -1); // -1 하면 r에 들어간거 기준으로 분리한다는 의미
sregex_token_iterator end;
for(; it != end; it++) {
cout << *it << endl;
}
}
- unordered_map을 value 기준으로 비교하려고 할 때 쓰는 방법: vector로 바꿔라!
bool cmp(pair<int, int> &a, pair<int, int> &b) {
return a.second > b.second;
}
int main() {
}
- split 이렇게 쓰자
vector<string> arr; // split 저장할 배열
long long pos = 0; // 구분자 찾은 위치
while((pos = s.find("구분자")) != string::npos) { // 구분자 찾아질 때 까지
string subs = s.substr(0, pos); // 구분자 위치 전까지 subs로 저장
arr.push_back(subs); // subs를 arr에 넣기
s.erase(0, pos + 1); // 구분자 위치까지 싹 지움
}
arr.push_back(s); // 마지막 부분도 잊지말고 넣자!
// 아니면 공백으로 나뉜거면 stringstream 써도 됨.
#include <sstream>
stringstream ss(text);
string one, two;
ss >> one >> two
- map, unordered_map == 연산 가능함. 모든 키-값 쌍의 내용이 같으면 true임
- bit 연산 써야할 때에는 bitset 쓰기. 참고링크
#include <bitset>
#include <iostream>
#include <string>
using namespace std;
int main() {
bitset<20> bit(58); // 10진수 58로 bitset 초기화
for(int i = 0; i < bitset.size(); i++) {
cout << bit[i] << " ";
// 참고 : bitset은 이렇게 index for문 하면 기본적으로 뒤에서부터 돔
}
}