오븐 노트

[C++] list #2 본문

Develop/C++

[C++] list #2

오 븐 2023. 6. 9. 20:08
#include <iostream>
using namespace std;
#include <vector>
#include <list>

class Node // 이중 연결 리스트
{
public:
    Node*   _next;
    Node*   _prev;
    int     _data;
};

// 단일 / 이중 / 원형
// list : 연결 리스트

// [] 한칸이 노드의 개념
// [1] -> [2] -> [3] -> [4] -> [5]
// [1] <-> [2] <-> [3] <-> [4] <-> [5]
// [1] <-> [2] <-> [3] <-> [4] <-> [5] <-> [1]

int main()
{
    // list (연결 리스트)
    // - list의 동작 원리
    // - 중간 삽입/삭제
    // - 처음/끝 삽입/삭제
    // - 임의 접근

    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);
        }

        li.push_back(i);
    }

    //li.push_front(10);
    int size = li.size();
    //li.capacity(); // vector와 다르게 동적 배열 형태가 아니기 때문에 용량의 개념이 없다.

    int first = li.front();
    int last = li.back();

    //li[3] = 10; // 임의 접근을 허용하지 않음. 한칸씩 이동하여 서치해야하기때문에 비효율적이기 때문.

    list<int>::iterator itBegin = li.begin(); // vector의 iterator와는 완전히 다르게 동작
    list<int>::iterator itEnd = li.end();

    //list<int>::iterator it2 = itBegin + 10; // vector는 메모리 크기를 연산해서 한번에 주소값을 이동 할 수 있어 가능한 연산이지만, list에서는 한칸씩 이동하기에 효율이 떨어져 기능적으로 불가능 한 문법

    //list<int>::iterator itTest1 = --itBegin; // 이와 같이 한칸씩 가는 연산은 가능
    //list<int>::iterator itTest2 = --itEnd;
    //list<int>::iterator itTest3 = ++itEnd;

    int* ptrBegin = &(li.front());
    int* ptrEnd = &(li.back());

    for (list<int>::iterator it = li.begin(); it != li.end(); ++it)
    {
        cout << *it << endl;
    }

    //li.insert(itBegin, 100);
    //li.erase(li.begin()); // 중간값까지 삭제 가능
    //li.pop_front(); // 첫 값 삭제(빼오기)
    //li.remove(10); // vector에서는 for문을 돌며 하나씩 삭제를 해야했는데 list는 remove를 지원

    // * 임의 접근이 안된다
    // * 중간 삽입/삭제 빠르다?
    // 50번 인덱스 데이터를 삭제하라
    /*list<int>::iterator it = li.begin(); // 서치는 느림. 임의 접근과 삽입/삭제를 다르게 생각해야함.
    for (int i = 0; i < 50; i++)
        ++it;*/

    // 임의 접근은 데이터를 하나씩 찾아내는 과정이어서 느리지만,
    // 중간 삽입/삭제 할 위치를 기억하고 있다면, 데이터를 삭제하고 next, prev 값만 조정해주면 되므로 빠르다.
    // vector는 원소를 밀어내야하지만 list는 노드만 연결하면 되므로 list가 시간복잡도의 우위를 가진다.
    li.erase(itRemember);


    return 0;
}

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 - 인프런 | 강의
 
C++ 카테고리의 글은 인프런 Rookiss님의 강의를 공부하며 정리하는 내용입니다.
이미 알고 있는 내용도 다시 정리 되어있을 수 있습니다.

 

모든 글은 제가 공부하기 위해 작성합니다.

 

참고용

https://velog.io/@doorbals_512/C-list-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EC%82%AC%EC%9A%A9%EB%B2%95

'Develop > C++' 카테고리의 다른 글

[C++] deque  (0) 2023.06.26
[C++] list #3  (0) 2023.06.09
[C++] list #1  (0) 2023.06.08
[C++] vector #4  (0) 2023.05.31
[C++] vector #3  (0) 2023.05.29