공부장 17

cpp11 역방향반복자

역방향 반복자...Reverse_Iterator: ++해도.. 뒤로 가게 해주는(사기를 치는) 반복자왜 쓰는데?기존 for문법을 그대로 쓰면서 거꾸로 순회가 가능..void operator++() { --p; };로 만들어서.. 보이기엔 ++i 이지만.. 실제로는 뒤로 간다!!왜냐면 s.rbegin()은 s.end()랑 똑같기에... 뒤로 가야하는데 for문법에서 begin()부터 end()로 가는데.. --을 쓴다?뭔가 이상하잖아..보기에..그러니까 사기를 치는거임.reverse_iterator로.. 보이기엔 ++이지만 사실은 --로 뒤로가는... 거꾸로 순회가 가능하게 하는 반복자.. char& operator*() const { return *(p-1); };지금 역방향 반복자에서..왜 *(p-1)..

cpp(stl) 2025.05.25

cpp10 STRING객체(복사/이동)/push_back/emplace_back

STRING( const STRING& other )복사생성자 : 객체를 새로 만들 때, 복사를 이용해! (깊은 복사를 한다..)다른 객체와 똑같은 내용으로... 새로운 객체를 만드는 것.other.p의 내용을 새로운 p에다가 복사해주는 것.보다시피..STRING s2 = s1;이게 복사 생성자로 s2를 만들어 준것.. STRING& operator= ( const STRING& other ): 복사 할당 (복사 대입)이미 있는 객체에.. 복사 대입할 때 이미 존재하는 a에 대해, b의 내용을 복사하는 것..p.release()로 기존 자원을 해제한다.. make_unique로 새 메모리를 할당 후, memcpy를 통해 내용 복사!실제 호출은 이런 식으로..STRING(STRING&& other): 이동..

cpp(stl) 2025.05.24

cpp9 STRING객체/list/vector/deque

이렇게 하면...임시객체로 만들어 갖다 붙이는 거기에 실제로는 6,7,8번..에 이렇게 만들어진다고함.관찰로 돌려보니 진짜로 그렇게 됐다. 근데 왜??임시객체를 만들어 갖다붙인다는게 이해가 안돼서..찾아보았당일단 std::list?양방향 연결구조를 가진 자료노드 기반 자료구조.. vector나 array처럼 연속된 메모리 공간에 저장되지 않는다!! => contiguous하지 않은 memory따라서 임의 접근이 불가능... [ ]또는 at사용이 불가능하다... list[3] 이런식의 접근이 안됨.반복자를 통해 이동이 가능하다.. iterator참고로 반복자는 한칸씩 밖에 이동가능함. 그럼 장점이 뭐있는겨?리스트의 경우.. 원소를 추가하거나 제거하는 작업이 O(1)로 매우 빠르다vector는 O(n)이 ..

cpp(stl) 2025.05.23

cpp8(callable)

250401 5w1 수업 정리Callble Type다시.. callable은?! 함수처럼.. ()를 붙여서 호출할 수 있는 아기들을 말한다..1.함수2.함수포인터3.람다4.함수객체 - 함수호출연산자를 오버로딩한 클래스로 만든 객체5.멤버함수전에 람다..?까지 다뤘던 것 같은데 이번에는 함수객체(함수호출연산자)와 멤버함수에 대해 다뤄보겠다.. 아 .. 술먹고싶다.. 일단 함수호출연산자는... () () 이 괄호 두짝은 함수를 부르는 연산자임우리는 ()이 연산자도 operator()로 오버로딩해서 사용해줄 수 있다..원래 클래스 객체는 ()를 지원해주지 않는다.. 그래서 직접 operator()를 오버로딩해주는 것..왜 사용하는데?!객체를 함수처럼 사용하고 싶을때.... (이게 함수객체임!!! functio..

cpp(stl) 2025.04.11

cpp7(함수포인터/collable/람다) 4w2

250327 수업정리..(4w2) Callable Types호출 가능한 타입..함수처럼 호출()할 수 있는 모~~든 것을 callable 이라고 함.1. 함수 : 이름 있는 함수2. 함수 포인터 : 함수 주소를 가리키는 포인터3. 람다[] lambda : 이름 없는 즉석 함수이것들 모두 () 연산자로 호출할 수 있기에.. callbale type 이라고 함 void*이건.. 어떤 타입이든 가리킬 수 있는 일반적인 포인터임!!!이건 함수 포인터가 아님... 그냥 타입이 없는 포인터!!!!!이런식으로... int값을 반환하는 내림차순()이라는 함수안에 매개변수로cosnt void* a, const void* b 가 들어가있음.여기서 void*는 void라는 함수를 가리키는게 아니라... 저 void*는 어떠..

cpp(stl) 2025.04.11

cpp6(RAII/throw/unique_ptr) 4w1

밀린 공부...4w1 RAII (Resource Acquisition Is Initialization)└ 자원의 할당과 해제를 객체의 생명주기와 일치시키는 기법- 우리는 자원의 해제(delete)를 직접 해줄필요가 없음! 이거는 스마트포인터로 구현이 된다..- 생성자에서 자원을 획득하고, 소멸자에서 자원을 반환하는 패턴..! throwthrow는.. 예외가 생기면 throw가 실행되는것? vs throw가 예외를 만드는 것?정답은.. throw는 예외를 만 드 는 아이! throw가 실행되면, 예외가 발생하는 것임..근데 왜 굳이 예외를 .. 발생시키지?코드를 진행하면서.. 더이상 정상적인 흐름으로 처리할 수 없는 상황에서 프로그램을 비상탈출하려고!throw를 던지면.. catch가 잡아준다. try내에..

cpp(stl) 2025.04.08

다중서버정리(iocp)

iocp기반임. 250401/250403 수업 (아직 미완성..) 비동기 다중접속에서 Accept는 AcceptEx로 해준다..일단 여기서도 EXP_OVER로 OVERLAPPED 구조체를 확장시켜줘서 사용함.각 EXP_OVER는 자기가 어떤... 작업인지 정보를 갖고있음(수업에선 enum통해서 작업 구분함.. IO_RECV, IO_SEND, IO_SEND로..) EXP_OVER안에... os에 넘길 비동기 정보 WASOVERLAPPED구조체가 있음Overlapped 구조체... 모든 send, recv는 이 구조체가 필요.하나의 구조체를 여러 호출에서 사용하는건 불가능!! 개당 하나씩 필요.소켓당, recv호출은, 무조건 하나씩...!!!!소켓당, send호출은 여러개 가능하다.. -> 이게 브로드 캐스..

서버 2025.04.06

일대일서버정리

IOCP가 뭐야? (InputOutputCompletionPort)Windows에서 고성능 네트워크/파일 비동기 처리를 위해 만든 시스템 큐비동기 작업이 끝나면 os가 큐에 완료했다고 넣어주고, 우리는 그걸 꺼내쓰는 방식...게임서버의 핵심은 IOCP.. iocp를 쓰겠다고 하면, 커널에 iocp 객체를 생성, 걔를 통해서 io를 진행! WSAOVERLAPPED└ Windows에서 비동기 io작업을 위한 구조체임...작업의 상태와 완료 정보를 담는 상자... 그냥 recv, send└ 이 함수들을 호출 시 작업이 끝날 때 까지 코드가 멈춘다.. WSARecv, WSASend└ 작업만 시작해주고, 바로 리턴. 나중에 작업이 완료되면 그 사실을 IOCP나 이벤트를 통해 통지받음.이때 이 작업 진행 상태 및 ..

서버 2025.04.06

cpp5(stream_iterator/vector로 파일읽기/structured binding/연산자오버로딩)

250320 수업 + 모르는 이것저것 폰트랑 글자 크기 다 설정해놓고 막상 올리면 자꾸 초기화됨..너무짜증남..왜이래요티스토리ㅡㅡ 메모리영역 메모리가 어디에 들어가야할지..->이건 os가 정함.크게 Data, Stack, free-store 가 있다.먼저 Data영역(Static)└ 프로그램이 실행될 때, 초기화된 전역변수와 정적변수가 저장되는 공간.프로그램이 종료될 때 까지 이 데이터는 유지된다!int a = 10;   => 전역변수static int b = 5; => 정적변수 Stack영역└ 함수 호출 시 생성되는 지역변수, 매개변수가 저장되는 공간.LIFO구조로.. 함수 호출/리턴에 따라 자동으로 메모리 할당과 해제가 일어남.stack은.. 메모리 한계를 초과하면 스택 오버플로우가 발생한다!!! f..

cpp(stl) 2025.03.27