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

 

 

std::vector의 단점

  • 중간에 원소를 추가/삭제하는 작업이 O(n)으로 매우 비효율적이다.

 

std::forward_list

  • STL에서 제공하는 단일 연결 리스트 컨테이너이다.
  • 단일 연결 리스트이기 때문에 순방향 반복자만을 지원한다.
    (그렇기 때문에 std::sort가 아닌 컨테이너 자체적으로 sort 함수를 제공한다.)
  • 메모리나 성능을 극단적으로 최적화해야 하는 경우가 아니라면 std::list를 사용하는 것이 보통이다.

 

std::forward_list의 성능

  • 성능 유지를 위해 O(n) 복잡도의 크기 반환, 중간 원소 접근을 제공하지 않는다.
  • 원소의 삽입은 O(1) 복잡도를 갖는다.
    (삽입할 위치 전의 반복자를 알고 있다는 전제 하에)

 

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

insert_after(it, val):
    node = new Node {val, null}

    node->next = it->next
    it->next = node

 

#include <iostream>
#include <forward_list>

using namespace std;

template <typename T>
ostream& operator<<(ostream& os, const forward_list<T> fwd_list)
{
    for (T e : fwd_list)
        os << e << ' ';

    return os;
}

void main()
{
    forward_list<int> fwd_list = {1, 2, 3};

    // 맨 앞에 0 추가
    fwd_list.emplace_front(0);

    // 맨 앞 원소 뒤에 5 추가
    fwd_list.emplace_after(fwd_list.begin(), 5);

    // 맨 앞 원소 뒤에 6 추가
    fwd_list.emplace_after(fwd_list.begin(), 6);

    cout << fwd_list << endl;

    // 맨 앞 원소를 삭제
    fwd_list.pop_front();

    // 맨 앞 원소의 다음 원소를 삭제
    fwd_list.erase_after(fwd_list.begin());

    // 맨 앞 원소의 다음 원소부터 마지막 원소까지 삭제
    fwd_list.erase_after(fwd_list.begin(), fwd_list.end());

    cout << fwd_list << endl << endl;

    forward_list<int> fwd_list2 = {-3, 9, 1, 2, 5, 4, 9, 3, 2, 1, 6, 2, 11, 8};

    // 모든 2를 삭제
    fwd_list2.remove(2);

    // 10보다 큰 모든 수 삭제
    fwd_list2.remove_if([](const int& e) { return 10 < e; });

    cout << fwd_list2 << endl;

    // 오름차순 정렬
    fwd_list2.sort();

    cout << fwd_list2 << endl;

    // 내림차순 정렬
    fwd_list2.sort(std::greater<int>());

    cout << fwd_list2 << endl;

    // 원소 순서를 역순으로 변경
    fwd_list2.reverse();

    cout << fwd_list2 << endl;

    // 중복 원소를 제거
    // 인접한 원소들을 비교하여 O(n)에 처리된다.
    // 정순 혹은 역순 정렬된 상태에서만 정상 작동한다.
    fwd_list2.unique();

    cout << fwd_list2 << endl;
}

 

출력

0 6 5 1 2 3
6

-3 9 1 5 4 9 3 1 6 8
-3 1 1 3 4 5 6 8 9 9
9 9 8 6 5 4 3 1 1 -3
-3 1 1 3 4 5 6 8 9 9
-3 1 3 4 5 6 8 9

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

std::list  (0) 2023.01.26
반복자(Iterator)  (0) 2023.01.25
std::vector  (0) 2023.01.23
동적 크기 배열 구현  (0) 2023.01.21
std::array  (0) 2023.01.20
profile

Make Unreal REAL.

@diesuki4

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

검색 태그