STL - List #2

이승덱·2021년 7월 21일

CPP

목록 보기
52/70
#include <iostream>

#include <vector>

#include <list>

using namespace std;

// List

// vector 동적배열

// [             ]

// 단일 / 이중 / 원형

// [1] -> [2] -> [3] -> [4] -> [5]

// [1] <-> [2] <-> [3] <-> [4] <-> [5] <-> [ Myhead : end() ] <->  메모리 상으로는 end()와 begin()이 연결되어 있지만 오류를 잡아내기위한 오류임

// [1] <-> [2] <-> [3] <-> [4] <-> [5] <-> [1]

// list : 연결 리스트

class Node {

public:

public:

 Node* _next; //객체가 직접 들어갈 순 없고 포인터여야함

 Node* _prev;

 int _data;

};

// 연속적이지 않게 저장됨

// 즉 다음 데이터가 어디있는지 알고있음

int main()

{

 // list (연결 리스트)

 // - list 동작 원리

 // - 중간 삽입/삭제 (GOOD / GOOD)

 // - 처음/끝 삽입/삭제 (GOOD / GOOD)

 // - 임의 접근 (1번째 데이터는 어디 있습니까?) li[3] 굉장히 느리다...

 list<int> li;

 list<int>::iterator itRemember;

 for (int i = 0;i < 100;i++) {

 if (i == 50) {

 itRemember = li.insert(li.end(), i);

 }

 else {

 li.push_back(i);

 }

 }

 // 벡터와는 다르게 push_front를 지원함

 // 어느정도 벡터보단 처음 삽입이 효율적으로 작동한다는 증거?

 li.push_front(10);

 int size = li.size();

 //int cap=li.capacity; 지원하지 않음 why? 실시간으로 노드를 생성해 연결하기 때문

 int first = li.front();

 int last = li.back();

 //li[3]=10; 임의 접근 지원하지 않음  노드에 접근해 다음 노드로 하나씩 이동하는 방식이기 때문에 지원하지 않음

 list<int>::iterator it; //iterator 지원 그러나 벡터의 iterator와는 다르게 작동함

 list<int>::iterator itBegin=li.begin();

 list<int>::iterator itEnd=li.end();

 it = ++itBegin;

 it = --itBegin;

 it = itBegin++;

 it = itBegin--;

 // it = itBegin + 10; 지원하지않음

 for (list<int>::iterator it1 = li.begin();it1 != li.end();++it1) {

 cout << *it1 << endl;

 }

 li.insert(itBegin, 100);

 li.erase(li.begin()); li.pop_front(); //처음 삭제

 li.remove(10); // 10이라는 값을 가진 모든 데이터를 삭제함. 중간 삭제가 쉽기 때문

 // 임의 접근이 안된다.

 // 중간 삽입/삭제는 빠르다 (?)

 // 50번 인덱스에 있는 데이터를 삭제!

 //it = li.begin();

 //for (int i = 0;i < 50;i++) {

 // it++; //굉장히 연산이 많이 필요함

 //}

 //li.erase(it);

 // 그럼 왜 중간 삽입/삭제가 빠르다고 하는 걸까

 // 이유 list::insert()를 이용하면 삽입된 주소를 반환할 수 있다.

 // 그 주소를 저장해 둔 후 후에 삭제가 필요할 때 바로 접근이 가능

 li.erase(itRemember);

 for (list<int>::iterator it1 = li.begin();it1 != li.end();++it1) {

 cout << *it1 << endl;

 }

 return 0;

}
profile
공부 기록용 블로그입니다

0개의 댓글