Make Unreal REAL.
article thumbnail
코딩 테스트를 위한 자료 구조와 알고리즘 with C++

 

 

std::forward_list의 단점

  • 성능상 이유로 마지막에 원소 추가, 역방향 진행, 크기 반환 등을 지원하지 않는다.
  • 빠른 원소 삽입에 적합한 컨테이너는 아니다.

 

std::list

  • STL에서 제공하는 이중 연결 리스트 컨테이너이다.
  • 양방향 반복자를 제공한다.
  • 마지막에 원소 추가, 크기 반환을 지원한다.

 

std::list의 성능

  • 삽입, 삭제 연산시 2개의 포인터를 처리해야 하므로 std::forward_list보다는 시간이 좀 더 걸린다.
  • 크기를 저장하므로 크기 반환은 O(1)에 수행된다.
  • 원소의 삽입 삭제는 O(1)에 수행된다.
    (삽입할 위치 전의 반복자를 알고 있다는 전제 하에)
  • 특정 위치의 원소를 참조하기 위해서는 반복자를 직접 진행해야 하며 O(n) 복잡도를 갖는다.

 

std::list의 원소 삽입 의사 코드

insert(it, val):
    node = new Node {val, null, null}
    
    node->next = it
    node->prev = it->prev
    it->prev->next = node
    it->prev = node

 

#include <iostream>
#include <list>

using namespace std;

ostream& operator<<(ostream& os, const list<int>& lst)
{
    for (int e : lst)
        cout << e << ' ';

    return os;
}

void main()
{
    list<int> lst = {1, 2, 3, 4, 5};

    // 맨 앞에 0 추가
    lst.emplace_front(0);
    cout << lst << endl;

    // 맨 뒤에 6 추가
    lst.emplace_back(6);
    cout << lst << endl;

    // 맨 뒤에 7 추가
    lst.emplace(lst.end(), 7);
    cout << lst << endl;

    // 2번째 위치에 8 추가
    lst.emplace(next(lst.begin()), 8);
    cout << lst << endl;

    // 맨 앞 원소 삭제
    lst.pop_front();
    cout << lst << endl;

    // 맨 뒤 원소 삭제
    lst.pop_back();
    cout << lst << endl;

    // 1번째 ~ 3번째 원소 삭제
    // lst.begin() + 3은 지원하지 않는다.
    lst.erase(lst.begin(), next(lst.begin(), 3));
    cout << lst << endl;

    // 첫 번째 원소
    cout << lst.front() << " " << *lst.begin() << endl;

    // 마지막 원소
    cout << lst.back() << " " << *lst.rbegin() << endl;

    cout << "크기: " << lst.size() << endl;
}

 

출력

0 1 2 3 4 5 
0 1 2 3 4 5 6 
0 1 2 3 4 5 6 7 
0 8 1 2 3 4 5 6 7 
8 1 2 3 4 5 6 7 
8 1 2 3 4 5 6 
3 4 5 6 
3 3
6 6
크기: 4

'자료구조 & 알고리즘 > 코딩 테스트를 위한 자료 구조와 알고리즘 with C++' 카테고리의 다른 글

std::deque  (0) 2023.01.28
반복자 무효화(Iterator Invalidation)  (0) 2023.01.27
반복자(Iterator)  (0) 2023.01.25
std::forward_list  (0) 2023.01.24
std::vector  (0) 2023.01.23
profile

Make Unreal REAL.

@diesuki4

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그