목록C++ (54)
Coding Memo
이 글은 `알고리즘 문제해결전략 - 구종만 (인사이트)의 내용을 일부 참고하여 작성하였습니다. 에라토스테네스의 체를 이용한 소수 찾기 기법은 2 부터 시작해 해당 값이 소수이면, 그 값의 배수를 숫자가 있는 풀(pool)에서 지워나가는 방법을 이용해 풀에 소수만 남기는 기법이다. 어떤 소수인 n에 대해서 n * i (i > 0)에 해당하는 값을 걸러내는 체를 이용한다. 위 방법에서 체에 대한 배열의 크기는 확인하려는 값의 최댓값이 될 것이다. 만약 1억까지의 수를 확인하려고 하면 boolean 타입의 배열을 써도 1억 바이트나 사용해야 한다는 것이다. 사실 0과 1만을 표현하는데 있어서 가장 좋은 데이터는 비트이다. 하지만 보통 프로그램 언어에서는 true/false를 표현하는데 사용되는 boolean ..
C++에서 상수를 정의하는 방법으로 2가지가 있다. 첫 번째로, define을 이용하여 매크로로 상수를 정의하는 방법이 있고, 두 번째로는 constexpr을 이용하여 상수를 정의하는 방법이 있다. #define PI 3.141592 constexpr double PI = 3.141592; 두 방법의 특징과 차이점을 보고 무엇을 사용하면 더 좋을지 확인해보자. define define은 전처리기(preprocessor) 지시자로, C++의 전처리기를 통해 상수를 정의하는 방법이다. 이는 매크로를 이용하는데, 매크로는 컴파일 전에 사용된 매크로값이 텍스트 치환을 통해 해당 정의 내용으로 그대로 바뀐다. (말 그대로 매크로 값에 정의했던 내용이 그대로 들어간다. 단순히 텍스트 치환 기능이다.) define의..
vector, deque, set, map, stack, queue, priority_queue 등의 컨테이너와 자료구조에서 자주 사용하는 함수들을 간단하게 요약하였다. 먼저, 간단하게 표현하기 위해서... 편의상 템플릿 타입과 컨테이너 사이즈 타입(size_t)은 int 형으로 하였다. 템플릿 타입 명시 를 생략하였다. const를 생략했고 각 컨테이너의 iterator는 간단하게 iterator로만 표현했다. 진짜 진짜 주요한 함수만 확인해보려면 스크롤을 맨 아래로 내리자! 참조: https://en.cppreference.com/w/cpp/container vector Sequence Container로 요소에 대해 순차적으로 접근 할 수 있다. (forward, backward 둘 다 순회 가능)..
C++에서 출력을 표처럼 간격에 맞춰서 깔끔하게 출력하고 싶다. double이나 float 타입의 숫자를 특정 자릿수까지 출력하고 싶다. 특정 숫자를 16진수, 8진수로 바로 출력하고 싶다. double을 출력했는데 자릿수가 얼마 안나온다. ... int main() { double pi = 3.1415926535; cout
소켓이란? 네트워크를 통해 두 프로그램이나 프로세스 간의 통신을 위한 끝 점(EndPoint) 이다. 두 프로그램은 이 소켓을 통해 네트워크에서 데이터를 서로 주고 받을 수 있다. IP 주소와 포트 넘버을 소켓에 지정하여 컴퓨터의 주소와 프로그램을 식별할 수 있다. 소켓 생성은 OS에 의해 실행된다. (시스템 호출로 소켓 생성 시, context-switching이 일어난다.) 프로그램이 종료되면, OS에 의해 사용했던 소켓에 할당된 리소스를 해제한다. 자주 사용하는 TCP 타입과 UDP 타입 외에도 다양한 소켓 타입이 있다. 소켓 프로그래밍 소켓 프로그래밍 시에 공통적인 사항이 있다. 1. 소켓 생성 시 소켓 타입, 프로토콜 등을 지정한다. 2. 엔드포인트 (소켓 주소) 생성 시, 호스트(ip주소 등)..
각 용어의 정의를 간단히 설명 하자면... (요약) Atomic: 말그대로 원자성이란 뜻으로 Atomic 명령 실행 중에는 다른 어떤 간섭 없이 끝까지 실행됨을 보장 Lock: Multi-Thread 환경에서 여러 쓰레드가 공유하는 어떤 리소스(변수 등)에 접근하는 방법에 대한 메커니즘 Critical Section: Multi-Thread 환경에서 상호 배제를 보장하는 특정 구역(section) 공유 리소스 접근 컨트롤이 필요한 이유 아래 코드를 살펴보자. int n = 0; void Thread1() { for (int i = 0; i < 100000; i++) { n++; } } void Thread2() { for (int i = 0; i < 100000; i++) { n--; } } int ma..
변수에 넣는 값을 리터럴이라고 한다. (= 메모리에 저장되는 값) int a = 1; 위 코드에서 리터럴은 1이 된다. C++ 에서의 여러가지 타입에 대한 리터럴 표기법 * 1를 표시한다고 했을 때, 형식 리터럴 int 1 unsigned int 1u long 1l unsigned long 1ul double 1.0 float 1.0f long double 1.0l 이 외에도 2진수, 8진수, 16진수 표기법이 각각 따로 있다. (2진수는 C++11 부터) 형식 접두사 예시 2진수 0b, 0B 0b1110 8진수 0 015 16진수 0x, 0X 0XAABB00 주의: 접두사 이후에 나오는 숫자나 문자는 당연히 해당 형식에 포함된 숫자나 문자여야 한다! (아니면 오류가 날 것이다.) Tip : 조금 긴 숫..
C++에서 자신이 사용할 클래스를 템플릿화 시켜서 코드를 작성했다고 하자. 다음과 같은 코드가 있다. (별 의미가 없는 클래스이다) #pragma once template class MyData { public: int size() { return _data.size(); } void addData(T t) { _data.push_back(t); } vector data() { return _data; } private: vector _data; }; 이 클래스를 main함수가 포함되어 있는 파일에 추가하거나 다음과 같이 헤더파일을 include하여 main에서 사용하면 문제가 없다. 오류 없이 '10'이 제대로 출력되고 프로그램이 종료될 것이다. #include "MyData.h" int main() ..