15. STL list3
by Qerogram* STL list1, 2 게시글을 통해 기본 개념을 익혔으니, 이전에 만들었던 Stack을 다듬어보자.
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 45 46 47 48 49 50 51 52 53 54 55 56 57 | #include <iostream> #include <string.h> #include <list> using namespace std; template <typename T> class Stack { public : Stack() { Clear(); } void SetInOutType(bool bLIFO) { m_bLIFO = bLIFO; } void Clear() { if(false==m_Datas.empty()) m_Datas.clear(); } int Count() const { return m_Datas.size(); } bool IsEmpty() const { return m_Datas.empty(); } void push(T data) { m_Datas.push_back(data); } bool pop(T* data) { if(IsEmpty()) return false; if(m_bLIFO) { memcpy(data, &m_Datas.back(), sizeof(T)); m_Datas.pop_back(); } else { memcpy(data, &m_Datas.front(), sizeof(T)); m_Datas.pop_front(); } return true; } private : list<T> m_Datas; bool m_bLIFO; }; int main() { Stack<int> Int_Stack; Int_Stack.SetInOutType(true); Int_Stack.push(10); Int_Stack.push(20); Int_Stack.push(30); int Value = 0; Int_Stack.pop(&Value); cout << "LIFO pop : " << Value << endl << endl; Int_Stack.Clear(); Int_Stack.SetInOutType(false); Int_Stack.push(10); Int_Stack.push(20); Int_Stack.push(30); Int_Stack.pop(&Value); cout << "FIFO pop : " << Value << endl << endl; return 0; } | cs |
* 결과
LIFO pop : 30
FIFO pop : 10
* 마지막으로 책에서는 과제를 내어준다.
점 5개로 이루어진 도형을 하나 주고, 좌표는 A(50, 200), B(20, 80), C(75, 10), D(130, 80), E(100, 200)
1. 리스트를 사용하여 제작한다.(A-B-C-D-E 순으로 링크드리스트마냥.)
2. 점 F(180,150)을 추가한다(여전히 1과같이 순차적)
3. D 좌표를(200,100)으로 변경.
4. C를 삭제.
- 구현한 코드는 아래와 같다.
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 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | #include <iostream> #include <list> using namespace std; class Pentagon { public : Pentagon(char name, int x, int y) : name(name), x(x), y(y) { } void GetPos() const { cout << name << ": x : " << x << ", y : " << y << endl; } void SetPos(int x, int y) { this->x = x; this->y = y; } char GetName() const { return name; } private : int x, y; char name; }; void List_Print(list<Pentagon> PL) { list<Pentagon>::iterator iterEnd = PL.end(); for(list<Pentagon>::iterator iterPos = PL.begin(); iterPos != iterEnd; ++iterPos) { iterPos->GetPos(); } cout << endl; } int main() { // 1번 list<Pentagon> PosList; Pentagon a('A', 50, 200); Pentagon b('B', 20, 80); Pentagon c('C', 75, 10); Pentagon d('D', 130, 80); Pentagon e('E', 100, 200); PosList.push_back(a); PosList.push_back(b); PosList.push_back(c); PosList.push_back(d); PosList.push_back(e); List_Print(PosList); // 2번 F를 추가. Pentagon f('F', 180, 150); PosList.push_back(f); List_Print(PosList); // 3번 D의 값을 변경. list<Pentagon>::iterator iterEnd = PosList.end(); for(list<Pentagon>::iterator iterPos = PosList.begin(); iterPos != iterEnd; ++iterPos) { if(iterPos->GetName() == 'D') { iterPos->SetPos(200, 100); break; } } List_Print(PosList); // 4번 C 삭제 iterEnd = PosList.end(); for(list<Pentagon>::iterator iterPos = PosList.begin(); iterPos != iterEnd; ++iterPos){ if(iterPos->GetName() == 'C') { PosList.erase(iterPos); break; } } List_Print(PosList); return 0; } | cs |
* 결과
A: x : 50, y : 200
B: x : 20, y : 80
C: x : 75, y : 10
D: x : 130, y : 80
E: x : 100, y : 200
A: x : 50, y : 200
B: x : 20, y : 80
C: x : 75, y : 10
D: x : 130, y : 80
E: x : 100, y : 200
F: x : 180, y : 150
A: x : 50, y : 200
B: x : 20, y : 80
C: x : 75, y : 10
D: x : 200, y : 100
E: x : 100, y : 200
F: x : 180, y : 150
A: x : 50, y : 200
B: x : 20, y : 80
D: x : 200, y : 100
E: x : 100, y : 200
F: x : 180, y : 150
* 참고 : Thinking About C++ STL Programming
'코딩 > C&C++' 카테고리의 다른 글
17. STL vector2 (0) | 2017.04.18 |
---|---|
16. STL vector1 (0) | 2017.04.17 |
14. STL list2 (0) | 2017.04.16 |
13. STL list1 (0) | 2017.04.15 |
12. 클래스 템플릿의 이해3 (0) | 2017.04.15 |
블로그의 정보
Data+
Qerogram