4. 이번에는 내년에 새로 투표권이 생기는 사람을 알아보겠습니다.
citizens_copy.remove_if([](const citizen &c) {
return (c.age != 18);
});
std::cout << "내년에 투표권이 생기는 시민들: ";
for (const auto &c : citizens_copy)
std::cout << c << " ";
std::cout << std::endl;
}
이 코드에서는 나이가 18세인 사람을 제외한 나머지 시민들은 모두 리스트에서 삭제됩니다.
5. 연습 문제 3을 실행하면 다음과 같은 출력을 확인할 수 있습니다.
전체 시민들: [Kim, 22] [Lee, 25] [Park, 18] [Jin, 16]
투표권이 있는 시민들: [Kim, 22] [Lee, 25]
내년에 투표권이 생기는 시민들: [Park, 18]
remove()와 remove_if() 함수는 리스트 전체를 순회하면서 조건에 맞는 원소를 모두 삭제하므로 O(n)의 시간 복잡도를 갖습니다.
std::forward_list는 원소 데이터를 정렬하는 sort() 멤버 함수를 제공합니다. std::array, std::vector 등에 저장된 데이터는 범용적인 std::sort(first_iterator, last_iterator) 함수를 이용하여 원소를 정렬할 수 있습니다. 그러나 연결 리스트 같은 자료 구조는 특정 원소에 임의 접근이 불가능하므로 std::sort() 함수를 사용할 수 없습니다. 또한 std::forward_list에서 사용하는 반복자는 std::array 또는 std::vector의 반복자와 다릅니다. 반복자의 차이점에 대해서는 다음 절에서 따로 언급하겠습니다. std::forward_list에서 제공하는 sort() 함수는 두 가지 형태를 지원합니다. 하나는 < 연산자를 기반으로 정렬하고, 다른 하나는 매개변수로 전달된 비교자(comparator)를 사용합니다. 기본 sort() 함수는 std::less<value_type>을 비교자로 사용합니다. 이 비교자는 첫 번째 인자가 두 번째보다 작으면 true를 반환하며, 사용자 정의 타입 원소를 사용할 경우에는 < 연산자가 재정의되어 있어야 합니다.