Data+

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; this->= 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'50200);
  Pentagon b('B'2080);
  Pentagon c('C'7510);
  Pentagon d('D'13080);
  Pentagon e('E'100200);
  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'180150);
  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(200100);
      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

활동하기