책정리/혼자 연구하는 C,C++ 2 18

42장 STL 알고리즘

42.1 읽기 알고리즘 42.1.1 find 원하는 정보를 구하기만 하는 알고리즘 find 함수 원형 Init find( Init first, Init last, const T& val ) ; 입력 반복자 두 개로 검색 대상 구간을 지정, 검색하고자하는 값을 세번째 인수로 전달 값이 있으면 그 반복자 리턴, 없으면 last 리턴 예제 find #include #include #include #include using namespace std ; void main ( void ) { string name[] = { "김정수", "구홍녀", "문병대", "김영주", "임재임", "박미영", "박윤자" } ; vector as( &name[0], &name[7] ) ; vector::iterator it ; ..

41장 연관 컨테이너

41.1 셋 41.1.1 pair 연관 컨테이너(Associative Container)는 키와 값처럼 관련이 있는 데이터를 하나의 쌍으로 저장하는 컨테이너 연관 컨테이너 분류 저장 대상 키 키 + 값 중복 불허 셋 맵 중복 허용 멀티셋 멀티맵 연관 컨테이너의 반복자는 모두 양방향 반복자이다. 자료들이 항상 정렬된 상태를 유지하므로 다시 정렬할 필요가 없으며 검색이 워낙 빠르기 대문에 이분 검색을 할 필요도 없다. 언제든지 순서대로 순회하면 정렬된 결과를 얻을 수 있고 검색은 원래부터 초고속이므로 굳이 임의 접근 반복자가 필요하지도 않다. 연관 컨테이너들은 키와 값의 쌍을 표현하기 위해 pair구조체를 사용 pair 구조체 연관 컨테이너들이 키와 값의 쌍을 표현하기 위해 사용하는 일종의 유틸리티 클래스,..

40장 시퀀스 컨테이너

40.1 벡터 40.1.1 벡터 벡터는 동일 타입의 자료 집합인 시퀀스 컨테이너 대표이다. 템플릿 기반이므로 임의 타입을 요소로 가질 수 있으며 요소의 개수에 따라 자동으로 메모리를 관리한다. 임의 타입의 동적 배열 벡터의 내구적인 구성 원리는 C의 정적 배열과 거의 유사, 특성과 장단점도 배열과 동일 요소들의 크기가 똑같고 인접한 위치에 이웃하여 배치되어, 메모리를 적게 차지하며 임의 위치를 빠른 속도로 액세스 가능 삽입, 삭제 속도가 느리다 벡터의 선언문 template class vector Type은 벡터에 저장되는 요소의 타입이며 벡터는 이 타입의 집합을 관리 Allocator는 내부적인 메모리관리에 사용되는 할당기인데 디폴트가 제공되므로 생략 가능 컨테이너 조작을 위해 사용되는 타입 타입 설명..

39장 반복자

39-1 반복자의 정의 가. 반복자의 정의 반복자는 컨테이너의 한 지점을 가리키는 객체이다. 배열의 첨자나 연결 리스트의 노드 포인터도 이런 역할을 하지만 반복자는 기존의 포인터에 비해 훨씬 더 일반화된 개념이다. 컨테이너의 종류와 내부 구조에 상관없이 한 요소를 가리키는 목적으로 반복자라는 동일한 장치를 일관된 방법을 사용할 수 있다. 컨테이너에 대해 어떤 작업을 하고 싶다면 먼저 이 컨테이너에 저장되어 있는 요소에 접근해야 하므로 순회가 꼭 필요하다. 알고리즘이란 컨테이너 자체에 대해 적용되는 것이 아니라 결국은 컨테이너의 요소들에 적용되는 것이므로 요소를 읽고 쓸 수 있어야 하는데 이를 위해 반복자가 사용된다. 반복자를 관리하는 기본적은 방법은 ++, --, *, ==, >, < 등의 연산자이며 이..

38장 함수 객체

38-1 함수 객체 가. 함수 객체 STL의 알고리즘들은 전역 함수가 처리하여 문제를 풀기 위한 반복자 구간, 검색 대상, 채울 값 따위의 정보들이 함수의 인수로 전달된다. 알고리즘 함수들은 입력된 정보를 바탕으로 알아서 동작하지만 어떤 함수들은 내부에서 모든 동작을 다 처리하지 않거나 할 수 없는 경우도 있다. 검색하고자 하는 값이 정확하게 어떤 조건인지, 정렬을 위해 요소를 비교할 때 어떤 방식으로 비교할 것인질르 함수가 마음대로 결정할 수 없다. 이럴때 함수에게 좀 더 구체적인 처리 방식을 지정하기 위해 사용자가 미리 만들어 놓은 함수 객체를 전달한다. 똑같은 함수를 호출하더라도 함수 객체를 어떻게 작성하는가에 따라 알고리즘의 활용도가 대폭 향상되는 효과가 있다. for_each 함수를 사용하면 순..

37장 STL 개요

37.1 STL 소개 37.1.1 일반화 프로그래밍 프로그램은 자료 구조와 알고리즘으로 구성된다. 자료구조는 처리하고자 하는 데이터를 표현하는 방법이고 알고리즘은 이 자료들을 가공하여 유용한 정보를 생산하는 기법이다. 좋은 프로그램을 만들려면 이 두 가지가 모두 필요하며 어느 한 쪽이 허술하면 전체적인 프로그램의 질이 떨어진다. 어떤 자료구조를 사용할 것인가는 프로그램의 특수한 상황에 따라 달라진다. 각 자료 구조마다 고유한 특징과 장단점이 있어서 모든 형태의 데이터에 다 어울리는 이상적인 자료구조는 없으며 상황에 따라 가장 효율적인 자료구조를 선택해야 한다. OOP 이후의 또다른 시도인 STL은 일반화 프로그래밍 기법이라는 좀 더 발전된 개념의 재사용성을 제공한다. 일반화(Generic)는 객체 지향의..

36장 표준 라이브러리

36-1 iostream 가. 입출력 스트림의 구조 C++의 표준 입출력 스트림은 여러 가지 복잡한 상황에 대해서도 입출력을 처리할 수 있도록 확장 가능한 클래스 계층을 구성하고 있다. C++의 헤더 파일을 기준으로 그려본 간단한 클래스 계층도이다. ios_base 클래스는 입출력과 관련된 여러 가지 상수나 플래그들을 가지며 이 클래스로부터 입출력 클래스들이 파생된다. 출력 클래스인 basic_ostream의 선언문은 다음과 같다 template class basic_ostream : virtual public basic_ios { ... :: _Elem 출력하는 데이터의 기본 타입이다. 통산 문자열 형태로 출력되므로 가거에는 char 타입의 문자들을 출력했으나 모든 문자를 16비트 코드를 표현하는 유니..

34장 네임 스페이스

34-1 네임 스페이스 가. 명칭의 충돌 C/C++ 소스를 구성하는 7가지 요소 중의 하나인 명칭(Identifier)은 변수, 함수, 타입 등 다양한 요소를 정의할 때 사용한다. 몇 가지 규칙만 지키면 자유롭게 정의할 수 있으며 그래서 가급적이면 기억하기 쉽고 대상을 명확하게 표현할 수 있는 이름을 붙인다. 그러나 프로그램이 복잡해지고 규모가 커질수록 더 많은 명칭이 필요해져서 고유한 이름을 붙이는 일이 점점 더 어려워지고 있다. 게다가 팀 단위로 작업할 때는 혼자서 명칭을 다 만드는 것이 아니며 외부 라이브러리를 가져다 쓰는 일도 흔해져서 우연히 명칭이 충돌하는 일이 잦아졌다. 외부 라이브러리끼리 명칭이 충돌하면 수정할 수도 없어 한쪽 라이브러리의 사용을 포기해야 하는 곤란한 상태가 되기도 한다. 그..

33장 타입 정보

33-1 RTTI 가. 실시간 타입 정보 RTTI는 RunTime Type Information의 약자이며 실시간 타입 정보라는 뜻이다. 일반적으로 변수의 이름이나 구조체, 클래스의 타입은 컴파일러가 컴파일을 하는 동안에만 필요할 뿐이며 이진 파일로 번역되고 나면 이 정보들은 필요가 없다. 변수의 타입은 읽어들일 길이와 비트를 해석하는 정보로만 사용되며 기계어 수준에서는 길이와 비트해석 방법에 따라 생성되는 기계어 코드가 달라진다. 클래스도 마찬가지로 기계어로 바뀌면 구조체와 똑같되 다만 가상 함수가 있을 때 vtable을 가리키는 포인터를 하나 더 가진다는 정도만 다르다. 다만 첫 번째 인수가 this로 고정되어 있는 호출 규약을 사용하므로 이 함수를 호출 할 때는 항상 호출 객체의 포인터가 같이 전달..

32장 예외 처리

32-1 예외 가. 전통적인 예외 처리 예외(Exception)란 프로그램의 정상적인 실행을 방해하는 조건이나 상태를 의미하는데 프로그램을 잘못 작성해서 오작동하거나 다운되게 만드는 에러(Error)와는 다르다. 원칙적으로 에러는 개발 중에 모두 수정해야 하는데 모르고 그냥 남겨두지 않을 것이다. 최종 릴리즈할 때까지 미처 발견하지 못하면 이것을 버그라고 부르며 그 중에서도 아주 악질적인 에러를 버그라고 부른다. 예외란 버그와는 달리 제대로 만들었지만 원하는 대로 동작하지 못하게 방해하는 외부의 불가항력적인 상황을 말한다. 프로그램을 아무리 치밀하게 논리적으로 잘 작성하더라도 예외는 항상 발생할 수 있는데 왜냐하면 작성 시점에서 실행 시의 모든 상황을 정확하게 예측 할 수 없기 때문이다. 항상 정해진 절..