티스토리 뷰

c언어/c++

[STL] Template, 시퀀스 사용 등

열혈허슬러 상추님 2019.07.02 00:12
190625 - 복습 STL 추가 짤막 강의
 

교육을 받으면서 노트필기 했던 내용을 날것 그대로 업로드합니다.


 
C++은
  • C언어
  • 객체지향
  • STL
  • Template
을 포함한다.
 
STL(Standard Template Library)은 컴포넌트 라고 부르는 6가지 요소를 가지고 있다.
  1. 컨테이너 (JAVA나 C#에서는 컬렉션)
  • 시퀀스(Vector,List)
  • 연관 컨
  • 알고리즘 (100여개)
  • 반복자
  • 함수자
  • 어뎁터
  • 할당기
 
 
  • 저장
    • 연속
    • 비연속
 
vector< > V;
list< > L; // 상수시간 삽입삭제
 
STL 연산자 중복이 중요 (C++에서도 연산자 중복이 중요하다. 태생적인 이유로.)
벡터에서 [] 연산자 중복을 해놓았다. 접근을 편하게 하려고.
 
#include <iostream>
#include <vector>
#include <list>
 
//using std::vector;
using namespace std;
int main() {
    list<int> lt;
 
    lt.push_back(100);
    lt.push_back(101);
    lt.push_back(102);
    lt.push_back(103);
    lt.push_back(104);
 
 
    for (list<int>::iterator iter = lt.begin(); iter != lt.end(); ++iter) {
        cout << *iter << endl;
    }
 
    //list<int>::iterator iter;
    //iter = lt.begin();
    //cout << *iter << endl;
    //++iter;
    //cout << *iter << endl;
 
}
 
리스트의 이터레이터는 한 번에 2개이상을 건너 뛸 수 없다.
이터레이터에 -2 할 수 없다. 일일이 --iter; --iter 를 해야한다.
 
    list<int>::iterator biter = lt.begin();
    list<int>::iterator eiter = find(lt.begin(), lt.end(), 104);
 
    for (list<int>::iterator iter = biter; iter != eiter; ++iter) {
        cout << *iter << endl;
    }
 
      list<int>::iterator iter = biter;
      ++iter;
      ++iter;
      lt.erase(iter); // 이터레이터가 가리키는 원소제거
 
lt.insert(iter, 100); // 삽입.
 

 
벡터를 c스타일로 만들어보고 왜 stl이 생겼는지? 알아보자.
C는 기본적으로 연속된 메모리를 생성해야한다.
배열은 원소들이 순서를 지켜야한다. 순서를 유지하는 또다른 방법이 필요하다.
넉넉한 메모리와 저장될 곳을 가리키는 위치가 필요하다.
 
 
//C++에서는 struct 생략 가능하다.
 
 
malloc(sizeof(int)*n) == 주소밖에 알 수 없다. (void* 반환)
new int[100] == 주소와 사이즈가 100이라는 심볼테이블. 알 수 있다. 
(별로 중요하진 않음_)
 
#include <iostream>
using namespace std;
// C에서는 이정도가 거의 완벽하게 만든 코드이다.
struct Vector { // Vector 구조체 정의
    int* buf;
    int count; // 원소의위치 (또는 원소의 개수)
};
 
void Add(Vector* v, int data) {
    v->buf[v->count] = data; //
    ++v->count;
}
void Erase(Vector* v, int idx) {
    for (int i = idx/*번째 요소 제거*/; i < v->count - 1; ++i) {
        v->buf[i] = v->buf[i + 1];
    }
    --v->count;
}
void InitVector(Vector* v, int cap = 100) {
    v->count = 0;
    v->buf = new int[cap];
}
void UninitVector(Vector* v) {
    v->count = 0;
    delete[] v->buf;
}
int main() {
    /*
    벡터를 c스타일로 만들어보고 왜 stl이 생겼는지? 알아보자.
    */
 
    Vector v; //C++에서는 struct 생략 가능하다.
    InitVector(&v, 5);
 
    Add(&v, 20);
    Add(&v, 35);
    Add(&v, 40);
    Add(&v, 60);
    Add(&v, 50);
 
    Erase(&v, 2);
 
    for (int i = 0; i < v.count; ++i) {
        cout << v.buf[i] << endl;
    }
    cout << endl;
 
    UninitVector(&v);
}
 
 
템플릿
  • 클래스템플릿 : 클래스를 만들어내는 틀 (C#에서는 제네릭)
    이후 < > 안에 타입을 정하면 클래스.
  • 함수템플릿 : 
공유하기 링크
TAG
댓글
댓글쓰기 폼
네이버 이웃추가
«   2019/10   »
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
글 보관함