190625 - 복습 STL 추가 짤막 강의
교육을 받으면서 노트필기 했던 내용을 날것 그대로 업로드합니다.
C++은
-
C언어
-
객체지향
-
STL
-
Template
을 포함한다.
STL(Standard Template Library)은 컴포넌트 라고 부르는 6가지 요소를 가지고 있다.
-
컨테이너 (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#에서는 제네릭)이후 < > 안에 타입을 정하면 클래스.
-
함수템플릿 :
'c언어 > c++' 카테고리의 다른 글
[c++] 메모리활용, vector 동적배열 사용하기 등 (0) | 2019.07.04 |
---|---|
[c++] 동적으로 배열 할당하여 사용하기 (new, 포인터) (0) | 2019.07.03 |
[c++/cpp] 연산자 오버로딩, 복사생성자, 템플릿(T) 등 (0) | 2019.07.01 |
[c++/cpp] 형변환 dynamic_cast, static_cast, const_cast, reinterpret_cast 등 (0) | 2019.07.01 |
[c++/cpp] 생성자, 복사생성자, 소멸자 등 (0) | 2019.07.01 |