티스토리 뷰

C++/참고

[C++] std::forward_list

춘햄 2023. 12. 18. 23:43

 std::forward_list는 C++ 표준 라이브러리의 일부로, 단방향 연결 리스트를 구현하고 있다. 각 원소는 다음 원소를 가리키는 포인터를 포함하며, 이 구조는 원소의 삽입과 삭제를 유연하게 만든다.


초기화 및 원소 셋팅

#include <forward_list>
#include <iostream>

int main() {
    std::forward_list<int> flist; // 빈 forward_list 생성

    // 원소 삽입
    flist.push_front(1);
    flist.push_front(2);
    flist.push_front(3);

    // 출력
    for (int n : flist) {
        std::cout << n << ' ';
    }
    std::cout << '\n';
}

원소 삽입

  • insert_after() 함수는 삽입할 위치를 나타내는 반복자와 삽입할 원소를 인자로 받는다. 이 함수는 지정된 위치의 바로 다음에 새로운 원소를 삽입한다. 반복자를 활용하여 리스트 내 특정 위치에 원소를 추가할 수 있다.
#include <forward_list>
#include <iostream>

int main() {
    std::forward_list<int> flist = {1, 2, 3};
    auto it = flist.begin(); // 첫 번째 원소를 가리키는 반복자

    // 첫 번째 원소 뒤에 4 삽입
    flist.insert_after(it, 4);

    for (int n : flist) {
        std::cout << n << ' ';
    }
    std::cout << '\n';
}

>> 1 4 2 3
  • emplace_after()는 새로운 원소를 생성하여 직접 삽입하는 기능을 제공한다. insert_after()와 유사하지만, emplace_after()는 원소를 먼저 생성하지 않고, 지정된 위치에 바로 원소를 구성한다. 이는 성능 면에서 유리하다.
#include <forward_list>
#include <iostream>

int main() {
    std::forward_list<int> flist = {1, 2, 3};
    auto it = flist.begin(); 

    // 첫 번째 원소 뒤에 직접 4 생성하여 삽입
    flist.emplace_after(it, 4);

    for (int n : flist) {
        std::cout << n << ' ';
    }
    std::cout << '\n';
}

>> 1 4 2 3

원소 삭제

  • erase_after() 함수는 특정 위치의 다음 원소를 삭제한다. 삭제할 원소의 바로 앞 원소를 가리키는 반복자를 인자로 받아, 그 다음 원소를 제거한다.
#include <forward_list>
#include <iostream>

int main() {
    std::forward_list<int> flist = {1, 2, 3, 4};

    // 첫 번째 원소 뒤의 원소 삭제
    flist.erase_after(flist.begin());

    for (int n : flist) {
        std::cout << n << ' ';
    }
    std::cout << '\n';
}

>> 1 3 4
  • pop_front() 함수는 리스트의 첫 번째 원소를 제거한다. 단방향 리스트의 특성 상, 첫 원소를 제외한 다른 위치의 원소를 직접 삭제하는 함수는 제공하지 않는다.
#include <forward_list>
#include <iostream>

int main() {
    std::forward_list<int> flist = {1, 2, 3};

    // 첫 번째 원소 삭제
    flist.pop_front();

    for (int n : flist) {
        std::cout << n << ' ';
    }
    std::cout << '\n';
}

>> 2 3

기타 자주 사용되는 멤버 함수들

  • clear() 함수는 리스트의 모든 원소를 삭제한다.
  • empty() 함수는 리스트가 비어 있는지 여부를 반환한다.
  • front() 함수는 리스트의 첫 번째 원소에 대한 참조를 반환한다.
#include <forward_list>
#include <iostream>

int main() {
    std::forward_list<int> flist = {1, 2, 3};

    // 리스트가 비어있는지 확인
    if (!flist.empty()) {
        std::cout << "첫 번째 원소: " << flist.front() << '\n';
    }

    // 모든 원소 삭제
    flist.clear();

    // 리스트가 비어있는지 다시 확인
    if (flist.empty()) {
        std::cout << "리스트가 비어있습니다." << '\n';
    }
}
  • assign() 함수는 리스트에 새로운 내용을 할당한다. 범위 또는 초기화 목록을 이용하여 리스트의 내용을 대체할 수 있다.
#include <forward_list>
#include <iostream>

int main() {
    std::forward_list<int> flist;

    // assign을 사용하여 새 원소 할당
    flist.assign({4, 3, 2, 1});

    for (int n : flist) {
        std::cout << n << ' ';
    }
    std::cout << '\n';
}

>> 4 3 2 1
  • sort() 함수는 리스트의 원소를 정렬한다.
#include <forward_list>
#include <iostream>

int main() {
    std::forward_list<int> flist = {4, 1, 3, 2};

    // 리스트 정렬
    flist.sort();

    for (int n : flist) {
        std::cout << n << ' ';
    }
    std::cout << '\n';
}

>> 1 2 3 4
  • merge() 함수는 다른 forward_list와 합병한다. 두 리스트는 사전에 정렬되어 있어야 한다.
#include <forward_list>
#include <iostream>

int main() {
    std::forward_list<int> flist1 = {1, 3, 5};
    std::forward_list<int> flist2 = {2, 4, 6};

    flist1.sort();
    flist2.sort();

    // flist1과 flist2 합병
    flist1.merge(flist2);

    for (int n : flist1) {
        std::cout << n << ' ';
    }
    std::cout << '\n';
}

>> 1 2 3 4 5 6
  • reverse() 함수는 리스트의 원소 순서를 반전시킨다.
#include <forward_list>
#include <iostream>

int main() {
    std::forward_list<int> flist = {1, 2, 3, 4};

    // 리스트 원소 순서 반전
    flist.reverse();

    for (int n : flist) {
        std::cout << n << ' ';
    }
    std::cout << '\n';
}

>>4 3 2 1

이러한 기능들 덕분에 std::forward_list는 유연성과 효율성을 제공하며, 특히 원소의 삽입과 삭제가 자주 발생하는 상황에서 유용하게 사용될 수 있다.

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

[C++] std::deque & std:stack  (2) 2024.01.04
[C++] std::vector  (0) 2023.12.18
[C++] 문법: 후행타입반환  (0) 2023.12.17
[C++] 문법: 범위 지정 연산자와 점 연산자 차이  (0) 2023.12.17
[C++] 문법: 범용 참조 (Args&&... args)  (0) 2023.12.17
Comments