목록Tutorials/C++ : Beginner (46)
KoreanFoodie's Study
모두의 코드를 참고하여 핵심 내용을 간추리고 있습니다. 자세한 내용은 모두의 코드의 씹어먹는 C++ 강좌를 참고해 주세요! std::optional (C++17 이상 - ) 예를 들어서 어떠한 map 에서 주어진 키에 대응하는 값이 있는지 확인하는 함수를 만들고 싶다고 해보자. std::optional 을 사용하면 이를 깔끔하게 구현할 수 있다! #include #include #include #include std::optional GetValueFromMap(const std::map& m, int key) { auto itr = m.find(key); if (itr != m.end()) { return itr->second; } // nullopt 는 에 정의된 객체로 비어있는 optional 을 ..
모두의 코드를 참고하여 핵심 내용을 간추리고 있습니다. 자세한 내용은 모두의 코드의 씹어먹는 C++ 강좌를 참고해 주세요! 파일을 찾아보자 파일 시스템 라이브러리는 파일 데이터 의 입출력을 담당하는 파일 입출력 라이브러리 () 과는 다르다. 의 경우, 파일 하나가 주어지면 해당 파일의 데이터를 읽어내는 역할을 하지만, 그 외에 파일에 관한 정보 (파일 이름, 위치, 등등) 에 관한 데이터를 수정할 수 는 없다. 반면에 파일 시스템 라이브러리의 경우, 파일에 관한 정보 (파일 메타데이타)에 대한 접근을 도와주는 역할을 수행하며, 파일 자체를 읽는 일은 수행하지 않는다. 쉽게 말해서 하드 디스크 어딘가에 있는 a.txt 라는 파일을 찾고 싶다면 filesystem 라이브러리를 사용하게 되고, 해당 파일을 찾..
모두의 코드를 참고하여 핵심 내용을 간추리고 있습니다. 자세한 내용은 모두의 코드의 씹어먹는 C++ 강좌를 참고해 주세요! C 스타일의 난수 생성의 문제점 #include #include #include int main() { srand(time(NULL)); for (int i = 0; i < 5; i++) { printf("난수 : %d \n", rand() % 100); } return 0; } 위와 같은 C 스타일의 난수 생성은 다음과 같은 문제점들이 있다 : 난수처럼 보이지만 무작위로 생성된 것이 아님 (첫 숫자만 무작위, 나머지는 알고리즘으로 생성) 시드값이 너무 천천히 변함 (위에서는 초 단위) 0 부터 99 까지 균등하게 난수를 생성하지 않음 (rand() 의 최댓값에 따라 rand() %..
모두의 코드를 참고하여 핵심 내용을 간추리고 있습니다. 자세한 내용은 모두의 코드의 씹어먹는 C++ 강좌를 참고해 주세요! 전체 문자열 매칭하기 로그 파일을 추출하는 코드를 보자. #include #include #include int main() { // 주어진 파일 이름들. std::vector file_names = {"db-123-log.txt", "db-124-log.txt", "not-db-log.txt", "db-12-log.txt", "db-12-log.jpg"}; std::regex re("db-\\d*-log\\.txt"); for (const auto &file_name : file_names) { // std::boolalpha 는 bool 을 0 과 1 대신에 false, true..
모두의 코드를 참고하여 핵심 내용을 간추리고 있습니다. 자세한 내용은 모두의 코드의 씹어먹는 C++ 강좌를 참고해 주세요! 템플릿 메타 함수 템플릿 메타 함수는 사실 함수는 아니지만 마치 함수처럼 동작하는 템플릿 클래스들을 의미한다. 이들이 메타 함수인 이유는 보통의 함수들은 값에 대해 연산을 수행하지만, 메타 함수는 타입에 대해 연산을 수행한다는 점이 조금 다르다. 예시를 보자. // 음수인지 체크 if (is_negative(x)) { // Do something... } // 타입이 void 인지 체크 if (is_void::value) { } 아래 코드를 돌려보자. #include #include template void tell_type() { if (std::is_void::value) { s..
모두의 코드를 참고하여 핵심 내용을 간추리고 있습니다. 자세한 내용은 모두의 코드의 씹어먹는 C++ 강좌를 참고해 주세요! decltype decltype 키워드는 C++ 11 에 추가된 키워드로, decltype 라는 이름의 함수처럼 사용된다. decltype(/* 타입을 알고자 하는 식 */) 이때, decltype 은 함수와는 달리, 타입을 알고자 하는 식의 타입으로 치환되게 된다. 예를 들어, #include struct A { double d; }; int main() { int a = 3; decltype(a) b = 2; // int int& r_a = a; decltype(r_a) r_b = b; // int& int&& x = 3; decltype(x) y = 2; // int&& A* ..
모두의 코드를 참고하여 핵심 내용을 간추리고 있습니다. 자세한 내용은 모두의 코드의 씹어먹는 C++ 강좌를 참고해 주세요! 상수식 (Constance expression) 컴파일러가 컴파일 타임에 어떠한 식의 값을 결정할 수 있다면 해당 식을 상수식 (Constance expression) 이라고 표현한다. 그리고 이러한 상수식들 중, 값이 정수인 것을 정수 상수식(Integral constant expression) 이라고 하게 되는데, 정수 상수식들은 매우 쓰임새가 많다. int arr[size]; // size 가 정수 상수식이어야 함 ... template struct A { int operator()() { return N; } }; A a; // number 가 정수 상수식이어야 함 ... e..
모두의 코드를 참고하여 핵심 내용을 간추리고 있습니다. 자세한 내용은 모두의 코드의 씹어먹는 C++ 강좌를 참고해 주세요! C++ 생성자 흔한 실수 다음과 같은 코드는 아무것도 출력하지 않는다. #include class A { public: A() { std::cout
모두의 코드를 참고하여 핵심 내용을 간추리고 있습니다. 자세한 내용은 모두의 코드의 씹어먹는 C++ 강좌를 참고해 주세요! ThreadPool 간단 요약 ThreadPool 에 우리가 원하는 작업을 추가하면, 쓰레드풀에 있는 쓰레드가 이를 맡아 작업하게 된다. 이 글에서는 쓰레드에 새로운 작업을 추가하는 일을 queue 를 통해 처리한다. 이곳의 구현을 기초로 하여 작성했다. 모든 쓰레드가 작업중이어도 새로운 작업을 추가해도 상관없다! 클래스 설계하기 먼저 쓰레드들을 보관할 컨테이너가 필요하다. // 총 Worker 쓰레드의 개수. size_t num_threads_; // Worker 쓰레드를 보관하는 벡터. std::vector worker_threads_; 편의상, 쓰레드풀에서 돌아가는 쓰레드들을 ..
모두의 코드를 참고하여 핵심 내용을 간추리고 있습니다. 자세한 내용은 모두의 코드의 씹어먹는 C++ 강좌를 참고해 주세요! 동기와 비동기 C++ 코드는 순차적으로 실행된다. 예를 들어, 파일을 읽고, 읽은 파일로 어떤 작업을 하고, 마지막으로 파일과 관계없는 작업을 수행하는 코드가 있다고 가정해 보자. 이 경우, 파일과 관계없는 작업을 하기 위해 파일을 읽기까지 기다려야 하는 지연 시간이 존재한다. 이전에 배운 쓰레드를 이용하면 이 작업을 비동기적으로 바꾸어 줄 수도 있다. void file_read(string* result) { string txt = read("a.txt"); *result = do_something_with_txt(txt); } int main() { string result; t..