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;

}


Posted by cwisky