C++ STL의 list는 Linked List를 구현한 템플릿 클래스이다
#include <iostream>
#include <string>
#include <list>
using namespace std;
int main()
{
list<int> numList;
list<int> *pList = new list<int>; // 리스트를 동적으로 생성할 수도 있음
numList.push_back(13);
numList.push_back(12);
numList.push_back(15);
numList.push_back(11);
numList.push_back(12);
//각 컨테이너에 포함된 iterator는 포인터의 일반화 표현이기 때문에
//자료형을 표시하지 않는다
list<int>::iterator iterator = numList.begin(); //첫번째 원소를 가리키는 반복자
// list는 원소에 대해 순차접근만 지원되므로 vector처럼 begin()+5 과 같은
// 임의의 위치에 접근하는 방식은 지원하지 않는다
// list::end() 함수는 리스트의 마지막 원소가 아닌 마지막 원소의 뒷 부분을 가리킨다
// list::back() 함수는 리스트의 마지막 원소를 리턴한다(반복자가 아님)
for (iterator = numList.begin(); iterator != numList.end(); iterator++)
{
cout << *iterator << " ";
}
cout << endl;
numList.sort(); // 오름차순 정렬
numList.sort(greater<int>()); // 내림차순 정렬(큰 수부터 먼저 오도록)
numList.remove(13); // 리스트에서 데이터가 13인 모든 원소 삭제
//삭제조건을 지정한 함수객체
//함수객체란 ()함수(괄호함수)를 가진 구조체나 클래스의 객체를 말한다
struct RemNumber {
bool operator()(int n) { // 리스트의 원소가 13보다 크면 삭제
if (n > 13) return true;
else return false;
}
};
numList.remove_if(RemNumber());
//리스트의 원소를 역순으로 참조하려면 rbegin(), rend()를 사용하여 구한 반복자를 사용한다
list<int>::reverse_iterator rIterator = numList.rbegin();
for (; rIterator != numList.rend(); rIterator++)
{
cout << *rIterator << " ";
}
cout << endl;
// 리스트에 저장할 커스텀 객체 정의
struct Player
{
int id; string name; int health;
Player(int id, string name, int health)
:id(id),name(name),health(health){}
void printPlayer() {
cout << id << ":" << name << ":" << health << endl;
}
};
// 리스트에 커스텀 객체를 저장하는 예
list<Player> playerList;
Player p1(11, "권종식", 79);
playerList.push_back(p1);
Player p2(12, "김희용", 85);
playerList.push_back(p2);
Player p3(13, "이관춘", 77);
playerList.push_back(p3);
list<Player>::iterator playerIterator = playerList.begin();
list<Player>::iterator endIterator = playerList.end();
for (playerIterator = playerList.begin(); playerIterator != endIterator; playerIterator++)
{
playerIterator->printPlayer();
}
cout << endl;
// remove_if() 사용하여 특정 조건을 가진 원소를 삭제하기
// remove_if(Predicate); // Predicate:삭제 조건을 정의한 함수객체
struct RemPlayer {
bool operator()(Player& player) {
if (player.health < 80) return true;
else return false;
}
};
playerList.remove_if(RemPlayer()); // 삭제조건 함수객체 생성 및 전달
for (playerIterator = playerList.begin(); playerIterator != endIterator; playerIterator++)
{
playerIterator->printPlayer();
}
cout << endl;
//리스트에 저장된 포인터 다루기
list<Player*> ppList;
ppList.push_back(new Player(21, "트럼프", 88));
ppList.push_back(new Player(22, "폼페이오", 79));
ppList.push_back(new Player(23, "김정은", 92));
list<Player*>::iterator it;
for (it = ppList.begin(); it != ppList.end(); it++) {
(**it).printPlayer();
}
cout << endl;
// 리스트의 원소 정렬을 위한 조건을 정의한 객체 생성
struct PlayerSort {
bool operator()(Player*pp1, Player *pp2) {
if (pp1->health < pp2->health) return true;
else return false;
}
};
ppList.sort(PlayerSort());
for (it = ppList.begin(); it != ppList.end(); it++) {
(**it).printPlayer();
}
cout << endl;
return 0;
}