-
데브코스 자율주행_TIL_23.09.22데브코스 자율주행 Perception/_TIL(Today I Learned) 2023. 9. 22. 23:48
오늘 배운 내용
1. C++
- 반복자
- 입출력 스트림
2. STL
- 검색 알고리즘
- 유틸리티 알고리즘
3. Linux
- Network system1. C++
- 반복자
반복자는 특정 컨테이너의 항목을 어떻게 순회할지 알고 있는 포인터 객체이다.
C++은 템플릿 기반의 컨테이너(자료구조)를 제공하고 컨테이너 항목들에 범용적인 접근 방복을 제공하기 위해 반복자 패턴을 사용한다.
포인터 객체는 C++ 표준에서 정하고 있는 공용 인터페이스를 따르고 있으며 일관된 방법으로 각 컨테이너를 순회할 수 있도록 해준다.
입력 반복자는 입력스트림에서, 출력 반복자는 출력 스트림에서만 쓰인다.
순차, 연관, 비순차 컨테이너 등은 순방향, 양방향 임의 접근 반복자 중 하나를 지원하지만, 컨테이너 어댑터 클래스와 bitset 클래스는 반복자를 지원하지 않는다.
end는 메서드 마지막 항목의 다음 항목을 반환하고, rend는 첫 번째 항목의 이전 항목을 반환한다. 둘 다 유요하지 않은 대상을 가리킨다.
반복자를 복사하여 따로 관리할 수 있다. 하지만 반복자 무효화 현상에 유의해야 한다.
반복자는 포인터와 다를바 없이 가리키는 대상이 다른 곳으로 이동하거나 소멸하면 그 사실을 알지 못한다.
또한, 컨테이너의 작동 방식을 제대로 알지 못하면 반복자가 무효화 되지 않았다고 오해할 수 있다!!
- 입출력 스트림
C++은 C의 super set이기 때문에 C에서 사용하던 로우 레벨 입출력 함수들을 사용할 수 있다.
그러나 에러 처리가 완전하지 않고 커스텀 데이터 타입을 다룰 수 없다는 한계가 존재한다.
스트림 개념은 데이터를 받거나 생성하는 객체라면 모두 적용할 수 있으며, 대표적으로 콘솔 스트림, 파일 스트림, 문자열 스트림이 있다.
우리가 자주 사용하는 <iostream> 은 인클루드만 해도 메모리 사용량을 증가시키는데, 이는 cin, cout, cerr, clog와 같은 스트림 객체가 자동으로 인스턴스화 되기 때문이다.
endl은 스트림에 개행문자를 투가하고 출력 버퍼를 밀어내는(flush) 역할도 한다.
하지만, flush가 너무 잦으면 성능에 큰 영향을 미치므로 잦은 개행이 필요하다면 개행문자 "\n"을 사용하도록 하자.
입력 스트림과 출력 스트림은 tie메서드를 통해 서로 연관시킬 수 있다.
이렇게 연관된 스트림 쌍이 있으면 입력 스트림에서 데이터를 읽을 때 출력 스트림을 먼저 flush 한다.
기본적으로 cin과 cout은 서로 연관되어 있다.
하나의 콘솔을 통해 입력과 출력을 번갈아 하더라도 문제가 생기지 않는다는 장점이 있다.
하지만, flush의 빈도가 많으면 성능이 불리해진다. 만약 ux 측면에서 연관될 필요가 없다면 tie를 푸는게 성능상 유리하다!!
cin과 cout은 C언어에서의 낮은 수준의 입출력 함수들과 버퍼를 동기화 한다.
다중 스레드 환경에서 사용될 경우 레이스 컨디션을 막기 위해 적절한 락킹 메커니즘을 통해 동기화한다.
하지만 이러한 동기화는 비용이 상당히 크므로 필요한 상황이 아니면 사용하지 않는게 좋다.
ios::sync_with_stdio(false); //콘솔 입출력에 대해서 스레드, 버퍼 동기화 해제 cin.tie(nullptr); //cin과 cout의 연결 해제 cout.tie(nullptr); //cout과 cin의 연결 해제
2. STL
- 검색 알고리즘
find(), find_if()
주어진 값과 같거나, 주어진 조건이 true가 되는 첫 번째 항목을 찾아주며 선형 시간 복잡도를 갖는다.
min_element(), max_element(), minmax_element()
- min_element(): 최솟값
- max_element(): 최댓값
- minmax_element(): 최솟값, 최댓값의 쌍
선형시간 복잡도를 가진다.
binary_search(), lower_bound(), upper_bound(), equal_range()
이 함수들은 이미 정렬된 항목열을 대상으로 한다.
vector, deque, array, 배열에서 유용하게 사용이 된다. (로그 시간 복잡도를 가진다.)
list에서도 사용할 수 있지만, 랜덤 액세스 반복자를 지원하지 않아서 선형 시간 복잡도로 성능이 떨어진다.
- 유틸리티 알고리즘
min, max, minmax 가 있으며 이들은 STL 알고리즘 함수들과 달리 반복자를 사용하지 않는다.
생각보다 입출력 스트림의 내용이 다양해서 애를 먹었다. 생각없이 cin, cout, printf, scanf등을 사용했는데 그 외에도 여러가지 역할을 하는 함수들이 있었다.
Linux의 ssh통신이나 TCP/IP통신은 가끔 사용했지만, 내용이 세부적으로 들어가니 쉽지 않은 내용들이 많이 있다.
내용을 조금씩 정리하며 어느정도 알아두면 현업에 조금 도움이 될 수 있을거라 생각한다.
'TIL > _TIL(Today I Learned)' 카테고리의 다른 글
데브코스 자율주행_TIL_23.09.26 (0) 2023.09.26 데브코스 자율주행_TIL_23.09.25 (0) 2023.09.26 데브코스 자율주행_TIL_23.09.21 (0) 2023.09.21 데브코스 자율주행_TIL_23.09.20 (0) 2023.09.20 데브코스 자율주행_TIL_23.09.19 (0) 2023.09.19