일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 알고리즘
- BFS
- 수능
- kakao
- Netflix
- Algorithm
- parametric search
- 2020
- silver
- Movie
- health
- 백준
- 완전탐색
- benefits
- Recursive
- 나는솔로
- 영어
- review
- 카카오
- 리뷰
- 넷플릭스
- coding
- BOJ
- 코딩 테스트
- Greedy
- array
- 추천
- 영화
- usaco
- 해설
Archives
- Today
- Total
Young
c++ 을 사용할 때 알아두면 쓸모있는 잡학사전 본문
728x90
반응형
https://m.blog.naver.com/PostView.nhn?blogId=jhc9639&logNo=221082468022&proxyReferer=https%3A%2F%2Fwww.google.com%2F
1. map / set
2. stoi / stol / to_string
string <----> number 변환
몇 자리 수인지 구할 때, 각 자리수 연산시 가장 많이 사용! 활용도 높음.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | to_string(3.1415926); // double / float / int / long long 등 자료형 거의다 받을 수 있음 // int stoi (const string& str, size_t* idx = 0, int base = 10); // long stol (const string& str, size_t* idx = 0, int base = 10); stol("1234567890123456"); stoi("1234"); // 기본으로 10진수로 해석 stoi ("40c3",nullptr,16); // 입력 스트링을 16진수로 해석 stoi ("-10010110001",nullptr,2); // 이진수로 해석 size_type sz; string str_dec = "2001, A Space Odyssey"; int ii = stoi (str_dec,&sz); // idx가 nullptr이 아니면 첫번째 숫자가 아닌 문자를 가르킴 cout << ii << " and [" << str_dec.substr(sz) << "]" << endl; | cs |
3. 문자열 자르기
활용도 1000%, 문자열을 파싱하는 문제를 많이 접해보지 않으면 특정 문자를 기준으로 문자열을 잘라서 이를 구조체나 벡터에 넣어주는
방법을 인터넷에서 찾느라 시간을 꽤나 많이 소모할 가능성이 높다. 이를 위해 간단한 파싱 코드를 공유해 본다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | vector<string> v; string s,t; while (1) { getline(cin, s); stringstream ss(s); while (getline(ss, t, '-')) { // '-' 문자를 만날 때까지 문자열을 읽어들여, t 변수에 저장하여 벡터에 넣어줌. v.push_back(t); } for (string i : v) { cout << i << ' '; } cout << endl; } | cs |
4. string
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | string str; // 빈 문자열을 스트링 객체 생성, 출력시 아무것도 없음 string addr("서울시 강남구 개포로"); // 문자열 리터럴로 초기화 string copy(addr); // addr을 복사하여 copy 스트링 객체 생성 char cstr [] = {'l', ' ', 'a', 'm', ' ', 'a', ' ', 'b', 'o', 'y', '\0'}; // c string (NULL(0)로 끝나는 char 타입의 배열) string s(cstr); // "i am a boy"로 초기화한 스트링 객체 생성 string s1 = "i am a teacher"; char * cstr = new char [s1.length()+1]; // +1 은 \0 문자를 위해서 std::strcpy (cstr, s1.c_str()); // s1 문자열을 c_str 함수를 통해 c string으로 변환, c string 문자열을 매개변수로 받는 함수를 사용하고 싶을 때 유용함 string s1 = "123"; string s2 = "456"; s1.append(s2); // "123456" 문자열을 끝에 더함. // s1 += s2; // 위 append와 똑같은 뜻임. s1.append(3,'7'); // "123456777" 문자열 끝에 3개만큼 '7'을 더함 s1 += '8'; // "1234567778" 문자열 끝에 '8'을 더함 s1.clear(); // 문자열 모두 삭제 s1.empty(); // 문자열 비어 있는지 확인 s1.size(); // 문자열 길이 반환 string s = "i find pizza"; int pos = s.find("find"); // 문자열 "find"를 찾아 시작위치를 반환 s.replace(pos, 4, "love and like"); // "i love and like pizza" 위에서 찾은 find 문자열 시작위치부터 4개를 "love"로 교체 string s1 = "abcdefg"; string s2 = s1.substr(2); // "cdefg" s1의 인덱스 2번부터 끝까지 문자열을 반환 string s3 = s1.substr(2,3); // "cde" s1의 인덱스 2번부터 3개 문자열을 반환 string s1 = "123456"; s1.erase(s1.find("4"),2); // "4"를 찾아서 문자2개를 삭제 "1236" // 고급 string s = "qwer"; s.capacity(); // reallocation 없이 사용할 수 있는 문자수를 반환 // reallocation시 성능이 저하가 발생하기 때문에 capacity > (사용 예정인 size) 이어야 성능 저하 발생 안함 s.reserve(1000); // reallocation을 막기위해 사용예정인 사이즈를 미리 알려줌 | cs |
5. memset / memcpy
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | // void * memset ( void * ptr, int value, size_t num ); // ptr이 가르키는 곳부터 num bytes 만큼 1byte씩 value로 초기화 됨. int arr[10001]; // 1byte 씩을 val 값으로 세팅하므로 arr[9]를 읽을 때는 전혀 다른 값으로 읽힐 수 있다. // 따라서 0 아니면 -1로 세팅할 때만 사용하는게 코딩할 때 실수할 여지를 줄임. memset(arr, 0, sizeof(arr)); memset(arr, -1, sizeof(arr)); // 만약 arr가 char라면 세팅 값과 읽을 때의 값이 일치하므로 괜찮다. char arr2[10001]; memset(arr2, '1', sizeof(arr2)); // void * memcpy ( void * destination, const void * source, size_t num ); // source에서 des로 num bytes만큼 binary copy를 통해 복사 // 둘의 자료형이 달라도 상관없음. // 주의할 점은 sizeof(destination) >= sizof(source) 이어야 한다는 점이다. memcpy(arr, arr2, sizof(arr2)); | cs |
참고자료) memset과 성능에 대한 자료
https://www.quora.com/What-makes-memset-so-fast
https://stackoverflow.com/questions/7367677/is-memset-more-efficient-than-for-loop-in-c
6. math.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | int x = 1000; sqrt(x); // 제곱근 구하기 // double pow (double base, double exponent); // 거듭제곱 구하기 printf ("7 ^ 3 = %f\n", pow (7.0, 3.0) ); printf ("4.73 ^ 12 = %f\n", pow (4.73, 12.0) ); printf ("32.01 ^ 1.54 = %f\n", pow (32.01, 1.54) ); // int abs (int n); // 절대값 구하기 int a = 100, b = -1234; abs(b-a); abs(a-b); | cs |
7. struct compare
8. auto
9. next_permutation
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | string s = "123"; int arr[] = {1,2,3}; vector<int> v(arr, arr+3); // next_permutation 함수를 사용하기 전에 잊지말아야 할 것은 반드시 sort 함수로 오름차순 정렬을 해준 상태에서 // 사용해야지 모든 순열을 생성한다. 무작위 상태에서 순열을 생성하면 모든 경우 생성 안됨! // next_permutation 함수는 그 다음으로 큰 값을 생성해내지 못하면 false를 반환하여 끝나기 때문임. sort(s.begin(), s.end()); sort(arr, arr + 3); sort(v.begin(), v.end()); do{ cout << s << endl; }while(next_permutation(s.begin(), s.end())); cout << endl; do{ for(int i : arr) cout << i << ' '; }while(next_permutation(arr,arr+3)); cout << endl; do{ for(int i : v) cout << i << ' '; }while(next_permutation(v.begin(), v.end())); | cs |
10. nullptr
C++에서 nullptr 도입의 필요성에 대해서.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include <bits/stdc++.h> using namespace std; int fun(int N) { cout << "fun(int)"; } // overload int fun(char* s) { cout << "fun(char *)"; } int main() { // c 에서는 보통 포인터를 NULL 값으로 초기화 시킵니다. // 하지만 이는 프로그램 작동시 큰 오류를 발생시킬 수 있습니다. // 의도대로라면 fun(char *) 함수가 호출되길 원하지만 // 컴파일러 에러가 발생합니다. // error: call of overloaded 'fun(NULL)' is ambiguous // 이유 : NULL은 (void*)0로 정의되어 있고, 이는 int형으로 변환 가능하기 때문입니다. // 따라서 컴파일러는 어떤 함수를 호출하는지 햇갈려 합니다. int x = NULL; // 이 구문은 warning을 발생시킬 수도 있습니다. fun(NULL); fun(nullptr); // 이렇게 해주면 컴파일러는 명확하게 fun(char *)를 호출했음을 인식한다. } | cs |
1 2 3 4 5 6 7 8 9 10 | #include<iostream> using namespace std; int main() { int *ptr = nullptr; if (ptr) { cout << "true"; } // nullptr은 bool형으로 변환이 가능하고 false 값을 갖는다. else { cout << "false"; } // 이런식으로 코딩하는 것이 명확하고 더 좋다. nullptr을 쓰자! } | cs |
728x90
반응형