[C++20] auto로 template를 대체해보자
2022. 7. 14. 14:41
C++
C++20부터 함수 파라미터로 auto를 허용한다. C++20부터는 template를 이용하여 구현해야 했던걸 auto를 이용해 구현할 수 있다. 코드를 통해 살펴보자 template T1 f(T2 a, T3 b) { return a + b; } int main() { cout
[C/C++] 잡기술
2022. 7. 7. 16:41
C++
이곳저곳에서 남의 코드 구경하다 발견한 잡기술들이다. C/C++가 아닌 다른 언어들에서도 응용할 수 있는 것들이 많이 있다. 이런 잡기술들이 가독성을 안 좋게 만드는 것도 있지만 더 좋을 때도 있다고 생각한다. 상황에 따라 잘 사용하면 될 것 같다. 잡기술들을 발견하면 하나씩 추가할 예정이다. (최종 수정 2022/07/07) char을 if문으로 여러 개 걸어야 할 때 if (c == 'A' || c == 'B' || c == 'C' || c == 'D') 위와 같은 코드를 아래와 같이 줄일 수 있다 if (strchr("ABCD", c)) 나눗셈 올림 std::ceil(x / n) 위의 함수는 리턴 값이 실수이다. 1. x / n + !!(x % n) 2. (x + n - 1) / n 위의 두 방법으..
[C/C++] Sequencing (Sequence Point)
2022. 5. 1. 19:16
C++
Sequencing / Sequence Point란? c++11부터 Sequence Point가 Sequencing으로 말이 바뀌었다고 한다. 이 글에선 sequence point란 말을 쓰겠다. 모든 연산의 결과가 완료되는 시점 쉽게 말하면, 한 시퀀스 포인트에서 다음 시퀀스 포인트로 가기 전에 이전의 모든 연산이 완료된다는 의미다. Sequence Point 1. ; (세미콜론) 2. ||, &&, ? : 와 같은 논리 연산 예를 들어, a || b에서 b가 되기 전에 a의 연산이 모두 완료된다. (a) ? (b) : 는 ?가 sequence point로 무조건 a가 먼저 완료된다. 3. , (쉼표) a = f1(), b = f2()와 같이 , 로 연결된 표현 4. 함수의 리턴 함수가 return..
[C++] lower_bound vs upper_bound
2021. 10. 15. 02:16
C++
lower_bound와 upper_bound가 항상 헷갈려 정리한다. 두 함수 모두 STL의 algorithm헤더에 정의되어 있다. 두 함수의 사용법은 동일하다. lower_bound(시작 주소, 끝 주소 + 1, 찾을 수)를 하면 된다. upper_bound도 동일하다. 또한 이진탐색을 기반으로 구현된 함수이기 때문에 정렬된 배열에서만 올바른 작동을 한다. 리턴 값으로는 찾은 인덱스의 주소값 또는 iterator를 리턴한다. 그렇기 때문에 인덱스 값을 얻고 싶다면 시작주소값 또는 시작 iterator값을 빼줘야 한다. lower_bound 얘는 원하는 값을 찾은 첫 번째 인덱스의 주소, iterator 리턴한다. 만약 원하는 값이 없다면 원하는 값보다 큰 첫번째 놈을 리턴한다. upper_bound 얘..
좌표 압축
2021. 9. 25. 10:48
Algorithm/개념
수의 범위가 매우 큰 상황에서 수의 값에 무관하게 좌표들 사이의 대소만 알면 될 때, 좌표 압축을 이용하면 수의 범위를 줄일 수 있다. 1. 좌표 압축을 할 배열을 임시의 배열에 중복이 없고 정렬된 상태로 만들어 놓는다. 2. 압축할 배열의 각 수들이 임시의 배열에 몇 번째 인덱스에 해당하는 수인지 찾으면 된다. 임시의 배열은 정렬된 상태이기 때문에 이분 탐색을 이용하여 O(logN)에 찾을 수 있다. C++에서 좌표 압축을 구현할 때에는 주로 std::sort, std::unique 함수로 1번을 수행하고, std::lower_bound 함수를 이용하여 2번을 수행한다. 가지고 있는 모든 수의 값을 저장한 임시의 배열을 정렬한 후 unique 함수를 이용하여 중복되는 수를 모두 제거하고, lower_b..
백준[1766] 문제집
2021. 7. 22. 11:58
Algorithm/BOJ
풀이 위상 정렬을 이용하여 풀이할 수 있다. 위상 정렬을 이용하는 과정에서 더 쉬운 문제는 더 빨리 뽑기 위해 우선순위 큐를 이용하여 값이 작은 것을 우선으로 뽑아준다. 코드 #include #include #include using namespace std; int cnt[32003]; vector v[32003]; priority_queue q; // 작은 것부터 뽑음 int main() { int N, M; scanf("%d %d", &N, &M); while (M--) { int a, b; scanf("%d %d", &a, &b); v[a].push_back(b); cnt[b]++; } for (int i = 1; i
[C++] Structured binding
2021. 7. 21. 11:27
C++
https://en.cppreference.com/w/cpp/language/structured_binding Structured binding declaration (since C++17) - cppreference.com Binds the specified names to subobjects or elements of the initializer. Like a reference, a structured binding is an alias to an existing object. Unlike a reference, a structured binding does not have to be of a reference type. attr(optional) cv-auto ref-q en.cppreference..
[C++] vector 특정 원소 지우기
2021. 7. 20. 22:50
C++
vector에서 원소 하나를 삭제하는 시간복잡도는 O(N)이다. 값으로 삭제 vector v; 라고 선언된 벡터에서 특정한 원소를 지울 때 아래와 같이 할 수 있습니다. v.erase(remove(v.begin(), v.end(), 지우고 싶은 원소), v.end()); remove는 특정 값을 찾아서 완전히 지우는 것이 아닌, 벡터의 뒤로 보내기 때문에 추가로 erase를 해줘야 한다. #include #include #include using namespace std; int main() { vector v = {1, 2, 3, 5, 10}; cout