본문 바로가기
Baekjoon/[정리] C++ 자료구조 및 꿀팁

[C++] 꿀팁 스킬

by 해적거북 2021. 7. 23.
728x90

● 헤더

#include <bits/stdc++.h>

// 알고리즘 문제 풀이에 필요한 헤더 모음

참고 : https://miniolife.tistory.com/11

 

 

● 입출력 속도 향상

ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);

// main문 시작에 위치

// 그러나 printf(), scanf(), put(), getchar() 와 같은
// C 스타일의 입출력을 쓰시면 안 됨

 

● 정수, 실수 자료형

int a;			// (-20억 ~ +20억) 정수
long long b;		// (-19자리 ~ +19자리) 정수

double c;		// (-15자리 ~ +15자리) 실수

// 기본 → int
// int형 범위를 벗어나는 정수 → long long
// 나눗셈을 하는데 소수점이 필요한 경우 → double

참고 : http://melonicedlatte.com/algorithm/2018/03/04/022437.html

 

 

● 줄바꿈 "\n" 사용하기

cout << "\n";
// 사용하기

cout << endl;
// 버퍼를 비우는 작업까지 함으로 "시간초과" 결과가 나오므로 사용 지양

 

 

● 범위 기반 for문

int array[] = {1, 2, 3, 4, 5};

for(int a : array) { }
for(auto element : array) { }
// 배열의 원소를 가져올 때 사용
// 복사하여 가져오므로 기존 원소에 영향X


for(auto &element : array) { }
// 배열의 원소를 가져올 때 사용
// 참조하여 가져오므로 기존 원소에 영향O

 

 

● 배열 초기화 (fill, fill_n)

int arr[100] = {0, };
vector<int> v;
v.assign(50, 0);

// 시작 주소, 끝 주소, 바꿀 값
// 배열
fill(arr + 10, ar + 20, 1);
// 벡터
fill(v.begin(), v.end(), 2);

// 시작주소, 바꿀 원소 갯수, 바꿀 값
fill_n(arr, 100, 3);

// 결과 : fill, fill_n과 동일
// 차이점 : 매개변수

 

 

● 문자열 입력

string str;

cin >> str;
// 공백 미포함 문자열 입력

getline(cin, str);
// 공백 포함 문자열 입력

 

 

● 숫자 입력 -> 입력 버퍼 비우기 -> 공백있는 문자열 입력

string str;
int N;

// 방법1 : 숫자 입력 -> 입력 버퍼 비우기(ignore) -> 공백있는 문자열 입력
cin >> N;
cin.ignore();
getline(cin, str);

// 방법2 : 숫자 입력 -> 입력 버퍼 비우기(white space) -> 공백있는 문자열 입력
cin >> N >> ws;
getline(cin, str);

// cin 으로 입력 받으면 '\n'이 남는다
// getline으로 입력 받으면 '\n'이 남지 않는다

white space => (http://www.cplusplus.com/reference/istream/ws/)

 

 

● 문자열 → 숫자 (형변환)

string str;

stoi(str);
// int형으로 형변환

stol(str);
// long형으로 형변환

https://blockdmask.tistory.com/333

 

 

● 숫자 → 문자열 (형변환)

int N_int;
long long N_long;
double N_double;

to_string(N_int);
to_string(N_long);
to_string(N_double);

// to_string 함수가 오버로딩 되어있으므로
// 매개변수에 숫자(정수, 실수)를 입력하면 된다.

https://blockdmask.tistory.com/334

 

 

● 문자열 순회 + 자르기 - iterator

// 정방향으로 순회
string::iterator it;

for(it = str.begin(); it < str.end(); it++)
{
	// 공백 기준으로 자르기
    if(*it == ' ')
    {
        cout << "\n";
        continue;
    }
    cout << *it << "\n";
}


// 역방향으로 순회
string::reverse_iterator rit;

for(rit = str.rbegin(); rit != str.rend(); rit++)
{
	// 공백 기준으로 자르기
    if(*rit == ' ')
    {
        cout << "\n";
        continue;
    }
    cout << *rit << "\n";
}

// 또는
// string.substr(시작주소, 끝주소 + 1)

 

 

● 문자 검색 + 치환

// regex_replace.(대상 문자열, regex(정규식), 치환 문자열)

// 예시
s = regex_replace(s, regex("one"), "1");
s = regex_replace(s, regex("two"), "2");
s = regex_replace(s, regex("three"), "3");

 

 

● 문자열 대소문자 전환

string s1 = "ABCabc123###";
string s2 = "";

// 대문자를 소문자로 반환
for(int i = 0; i < 3; i++)
	s1 += tolower(s1[i]);

// 소문자를 대문자로 반환
for(int i = 3; i < 6; i++)
	s2 += toupper(s1[i]);

// 대소문자가 아닌 문자는 그대로 반환
for(int i = 6; i < 12; i++)
	s2 += toupper(s1[i]);
    // tolower도 동일

// s2 = "abcABC123###"

 

 

● <bitset> 10진수 → 2진수

#include <bitset>

// 10진수 → 2진수
int num = 123;
bitset<20> b (num);

// 2진수의 비트(1)수 반환
int cnt = b.count();

 

 

● 안정 정렬 stable_sort(v.begin(), v.end(), cmp)

#include <algorithm>

// sort는 불안정 정렬
// stable_sort는 안정 정렬

// sort 비교함수 인자에 &로 얕은 복사 선택
// stable_sort 비교함수 인자는 깊은 복사 필수

// 가져오는 위치는 (temp2 : 앞)(temp1 : 뒤)
bool cmp(int temp1, int temp2)
{
	// 반환값이 true면 자리바꾸기
    // 따라서 이건 내림차순
	if(temp1 < temp2)
    	return true;
	return false;
}

stable_sort(v.begin(), v.end());

stable_sort(v.begin(), v.end(), cmp);

 

 

● string의 find함수

string str = "Young and rich";

if (str.find("rich") != string::npos) {
  cout << "rich is exist!";
  int index = str.find("rich");   //해당 문자의 시작 인덱스 반환
}

 

 

● vector의 find함수

auto it = find(v.begin(), v.end(), num);
if(it == v.end())
  cout << "배열에 존재하지 않습니다.\n";
else
{
  cout << "배열에 존재합니다.\n";
  cout << "index는 " << it - v.begin() << " 입니다.\n;
  cout << "value는 " << *it << " 입니다.\n;
}

 

 

● 문자열 자르기 - istringstream

string str = "this,is,string";
istringstream iss(str);
string stringBuffer;
while (getline(iss, stringBuffer, ','))
  cout << stringBuffer << " ";

// 또는 vector<string>에 담는다
// v.push_back(stringBuffer);

 


 

728x90

'Baekjoon > [정리] C++ 자료구조 및 꿀팁' 카테고리의 다른 글

[C++/자료구조] pair std  (0) 2021.07.27
[C++/자료구조] deque std  (0) 2021.07.26
[C++/자료구조] queue std  (0) 2021.07.26
[C++/자료구조] list std  (0) 2021.07.26
[C++ 자료구조] vector std  (0) 2021.07.26
[C++ 자료구조] stack std  (0) 2021.07.23

댓글