2 분 소요

  • (C++11~) forward_list가 추가되어 단방향 리스트를 제공합니다. 기존 양방향 리스트인 list보다 요소 관리 공간을 작게 차지하며, push_front()로 요소의 앞쪽 방향으로 리스트를 구성합니다.

개요

기존의 list는 양방향 리스트였습니다. 그러다 보니 단방향 리스트가 필요한 경우에는 비효울적이었습니다.

forward_list가 추가되어 단방향 리스트를 제공합니다. 기존 양방향 리스트인 list보다 요소 관리 공간을 작게 차지하며, push_front()로 요소의 앞쪽 방향으로 리스트를 구성합니다. 이에 따라 가장 마지막에 입력된 요소의 위치가 begin()이 됩니다.

image

  1. 역방향 이터레이터가 없으며(rbegin(), rend(), crbegin(), crend()),
  2. forward_list에서 마지막에 입력된 요소 제어를 위해 before_begin()이 제공되며,
  3. 컨테이너의 끝에 추가하거나 마지막 요소에 접근하는 기능이 없으며(back(), push_back(), emplace_back(), pop_back()),
  4. 요소 추가 방향과 이터레이터 방향이 달라, 요소 삭제, 삽입, 이동시 별도의 _after 버전을 제공합니다.(erase_after(), insert_after(), emplace_after(), splice_after())
항목 공통 forward_list list
첫번째 요소 front() O O
마지막 요소 forward_list는 단방향이어서 제공 안합니다. X back()
순방향 이터레이터 begin(), end()
cbegin(), cend()
forward_list에서는 마지막에 입력된 요소가 begin()이고, list에서는 처음 입력된 요소가 begin()입니다.
O O
역방향 이터레이터 forward_list는 단방향이어서 제공 안합니다. X rbegin(), rend()
crbegin(), crend()
begin()의 앞 이터레이터 forward_list에서 마지막에 입력된 요소 제어를 위해 제공합니다. before_begin() X
리스트가 비었는지 검사 empty() O O
요소 갯수 forward_list에서는 제공하지 않습니다. X size()
리스트의 최대 요소 갯수 max_size() O O
모든 요소 삭제 clear() O O
이터레이터로 요소 삭제 forward_list는 주어진 위치 뒤의 요소를 삭제하고, list는 주어진 위치의 요소를 삭제함 erase_after() erase()
값으로 요소 삭제 remove()
remove_if()
O O
삽입 forward_list는 주어진 위치 뒤에 삽입하고, list는 앞에 삽입합니다. insert_after()
emplace_after()
insert()
emplace()
앞에 추가/삭제 push_front()
emplace_front()
pop_front()
O O
뒤에 추가/삭제 forward_list는 단방향이어서 제공 안합니다. X push_back()
emplace_back()
pop_back()
요소 크기 재설정 resize() O O
바꿔치기 swap() O O
리스트 병합 merge() O O
요소 이동   splice_after() splice()
요소 순서 반전 reverse() O O
중복 요소 제거 unique() O O
요소 정렬 sort() O O
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
std::forward_list<int> list;
for(int i{0};i < 4; ++i) { // 0, 1, 2, 3의 순서로 삽입합니다.
    list.push_front(i); 
}

// 가장 마지막에 넣은 요소가 begin입니다.
std::vector<int> v;
for(auto val : list) {
    v.push_back(val);
}
EXPECT_TRUE(v[0] == 3 && v[1] == 2 && v[2] == 1 && v[3] == 0);

// insert after는 주어진 위치 뒤에 삽입합니다.
list.insert_after(list.begin(), 10);
v.clear();
for(auto val : list) {
    v.push_back(val);
}
EXPECT_TRUE(v[0] == 3 && v[1] == 10 && v[2] == 2 && v[3] == 1 && v[4] == 0);

// erase_after는 주어진 위치 뒤를 삭제합니다.
list.erase_after(list.begin());
v.clear();
for(auto val : list) {
    v.push_back(val);
}
EXPECT_TRUE(v[0] == 3 && v[1] == 2 && v[2] == 1 && v[3] == 0);  

// before_begin()은 begin()의 앞 이터레이터입니다. erase_after()는 주어진 위치 뒤를 삭제하므로 begin()이 삭제됩니다.
list.erase_after(list.before_begin());
v.clear();
for(auto val : list) {
    v.push_back(val);
}
EXPECT_TRUE(v[0] == 2 && v[1] == 1 && v[2] == 0);


// slice_after()는 주어진 요소 뒤부터 이동합니다.
std::forward_list<int> temp;
list.splice_after(list.begin(), temp); 
for(auto val : list) {
    v.push_back(val);
}
EXPECT_TRUE(v[0] == 2); // begin 다음부터 이동했으므로 2만 남았습니다.

forward_list 멤버 함수

항목 내용
= (C++11~) (작성중)
assign() (C++11~) (작성중)
assign_range() (C++23~) (작성중)
get_allocator() (C++11~) (작성중)
front() (C++11~) (작성중)
before_begin(), cbefore_begin() (C++11~) (작성중)
begin(), end() (C++11~) (작성중)
cbegin(), cend() (C++11~) (작성중)
clear() (C++11~) (작성중)
insert_after() (C++11~) (작성중)
emplace_after() (C++11~) (작성중)
insert_range_after() (C++23~) (작성중)
erase_after() (C++11~) (작성중)
push_front() (C++11~) (작성중)
emplace_front() (C++11~) (작성중)
prepend_range()(C++23~) (작성중)
pop_front() (C++11~) (작성중)
resize() (C++11~) (작성중)
swap() (C++11~) (작성중)
merge() (C++11~) (작성중)
splice_after() (C++11~) (작성중)
remove() (C++11~)
remove_if() (C++11~)
(작성중)
reverse() (C++11~) (작성중)
unique() (C++11~) (작성중)
sort() (C++11~) (작성중)
== (C++11~)
!= (C++11~C++20)
(작성중)
<, <=, >, >= (C++11~C++20)
<=> (C++20~)
(작성중)

태그:

카테고리:

업데이트:

댓글남기기