[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/C++] printf에 float만을 위한 변환 명세가 없는 이유
2022. 4. 28. 01:41
C++
printf("%f", 1.0f)와 같이 printf에 float형을 넘겨줘도 절대 printf 함수에 float형을 넘겨줄 수 없다는 재밌는 사실을 알게 됐다. double lf = 1.0; printf("%lf\n", lf); // double lf 사용 printf("%f\n", lf); // double에 f도 가능 위와 같이 double을 출력할 땐 %lf와 %f 둘 다 사용할 수 있는데 이건 C99에 생긴 기능으로 scanf에서 double형을 %lf로 받기 때문에 편의성?을 위해 생긴 기능이라고 한다. 종종 float은 %f, double은 %lf로 출력해야 한다는 사람들이 있는데 이건 완전한 오개념이다. 아래 사진을 봐도 f는 명확히 double을 위한 변환 명세다. 그런데 float형을 ..
[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 얘..
[C++] string split구현
2021. 9. 11. 21:35
C++
다른 언어에는 대부분 있지만 c++에는 split이 없어서 구현을 해서 사용해야 한다. sstream을 이용하여 구현한다. #include #include #include using namespace std; vector split(string input, char delimiter) { vector ret; stringstream ss(input); string tmp; while (getline(ss, tmp, delimiter)) { ret.push_back(tmp); } return ret; }
[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