std::forward_list<int> fwd_list = {1, 2, 3};
fwd_list.push_front(0); // 맨 앞에 0 추가: {0, 1, 2, 3}
auto it = fwd_list.begin();
fwd_list.insert_after(it, 5); // 맨 처음 원소 뒤에 5 추가: {0, 5, 1, 2, 3}
fwd_list.insert_after(it, 6); // 맨 처음 원소 뒤에 6 추가: {0, 6, 5, 1, 2, 3}
std::forward_list<int> fwd_list = {1, 2, 3, 4, 5};
fwd_list.pop_front(); // 맨 앞 원소를 삭제: {2, 3, 4, 5}
auto it = fwd_list.begin();
fwd_list.erase_after(it); // 맨 앞의 다음 원소를 삭제: {2, 4, 5}
fwd_list.erase_after(it, fwd_list.end()); // 맨 앞 원소 다음부터 맨 마지막 원소까지 삭제: {2}
#include <string>
#include <iostream>
#include <forward_list>
// citizen 구조체 정의
struct citizen
{
std::string name;
int age;
};
// 출력 시 이름과 나이를 표시
std::ostream &operator<<(std::ostream &os, const citizen &c)
{
return (os << "[" << c.name << ", " << c.age << "]");
}
int main()
{
// 시민 정보 초기화
std::forward_list<citizen> citizens = {
{"Kim", 22}, {"Lee", 25}, {"Park", 18}, {"Jin", 16}
};
auto citizens_copy = citizens; // 깊은 복사
std::cout << "전체 시민들: ";
for(const auto &c : citizens)
std::cout << c << " ";
std::cout << std::endl;
// 투표권이 없는 시민을 리스트에서 제거
citizens.remove_if([](const citizen &c) {
return (c.age < 19);
});
std::cout << "투표권이 있는 시민들: ";
for (const auto &c : citizens)
std::cout << c << " ";
std::cout << std::endl;
// 내년에 투표권이 생기는 사람 확인
// 내년에 투표권이 생기는 사람을 제외하고 모두 삭제
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;
}
실행 후 출력 내용
참고: 깊은 복사가 가능한 이유
remove()와 remove_if() 함수는 리스트 전체를 순회하며 조건에 맞는 원소를 모두 삭제하므로 O(n)의 시간 복잡도를 갖는다.
void sort(): < 연산자 기반 정렬
void sort( Compare comp ): 이항 조건자(binary predicate) 기반 정렬
정렬 예제 코드
std::forward_list<int> list1 = {23, 0, 1, -3, 34, 32};
list1.sort(); // {-3, 0, 1, 23, 32, 34}
list1.sort(std::greater<int>()); // {34, 32, 23, 1, 0, -3}
std::forward_list<int> list1 = {2, 53, 1, 0, 4, 10};
list1.reverse(); // 실행 결과 : {10, 4, 0, 1, 53, 2}
list1 = {0, 1, 0, 1, -1, 10, 5, 5, 10, 0};
list1.unique(); // 실행 결과: {0, 1, 0, 1, -1, 10, 5, 10, 0}
list1 = {0, 1, 0, 1, -1, 10, 5, 5, 10, 0};
list1.sort(); // 실행 결과: {-1, 0, 0, 0, 1, 1, 5, 5, 10, 10}
list1.unique(); // 실행 결과: {-1, 0, 1, 5, 10}
list1.unique([](int a, int b) { return (b - a) < 2; }); // 실행 결과: {-1, 1, 5, 10}
#include <iostream>
#include <string>
#include <list>
using namespace std;
int main() {
int M;
string input;
list<char> editor;
cin >> input;
editor = list<char>(input.begin(), input.end());
// 커서의 위치를 문자열의 끝으로 설정
auto cursor = editor.end();
// 명령어의 개수 입력 받기
cin >> M;
for (int i = 0; i < M; i++) {
char cmd;
cin >> cmd;
switch (cmd) {
case 'L': // 커서를 왼쪽으로 이동
if (cursor != editor.begin()) cursor--;
break;
case 'D': // 커서를 오른쪽으로 이동
if (cursor != editor.end()) cursor++;
break;
case 'B': // 커서 왼쪽 문자 삭제
if (cursor != editor.begin()) {
cursor--;
cursor = editor.erase(cursor);
}
break;
case 'P': // 문자 삽입
char c;
cin >> c;
editor.insert(cursor, c);
break;
}
}
// 수정된 내용 출력
for (char ch : editor) {
cout << ch;
}
return 0;
}