Data+

19. STL deque1

by Qerogram

* 덱(deque)

- Double Ended Queue의 약자이며 Queue와 비슷(FIFO)

- vector와 거의 동일하다.(앞뒤 삽입/삭제에 유용, 하지만 나머지는 모두 vector에 밀린다.)

- vector나 list와 동일하게 동적할당이 가능하고 헤더는 #include <deque>

- deque의 멤버 method들을 활용해본 예시이다.(vector나 list의 예제와 거의 동일)

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
63
64
#include <iostream>
#include <deque>
 
using namespace std;
 
struct Packet {
  unsigned short Index;
  unsigned short BodySize;
  char acBodyData[100];
};
 
int main() {
  Packet pkt1, pkt2, pkt3;
  pkt1.Index=1; pkt1.BodySize=10;
  pkt2.Index=2; pkt2.BodySize=12;
  pkt3.Index=3; pkt3.BodySize=14;
  
  deque<Packet> ReceivePackets;
  ReceivePackets.push_back(pkt2);
  ReceivePackets.push_back(pkt3);
  ReceivePackets.push_front(pkt1);
  
  for(deque<Packet>::iterator iterPos = ReceivePackets.begin(); iterPos != ReceivePackets.end(); ++iterPos) {
    cout <<"패킷 인덱스 : " << iterPos->Index << endl;
    cout <<"패킷 바디 크기 : " << iterPos->BodySize << endl;
  }
  cout << endl << "역방향 출력" << endl;
  
  for(deque<Packet>::reverse_iterator iterPos = ReceivePackets.rbegin(); iterPos != ReceivePackets.rend(); ++iterPos ) {
    cout << "패킷 인덱스 : " << iterPos->Index << endl;
    cout << "패킷 바디 크기 : " << iterPos->BodySize << endl;
  }
  
  cout << endl << "배열 방식으로 접근" << endl;
  int ReceiveCount = ReceivePackets.size();
  cout << "총 패킷 수 : " << ReceiveCount << endl;
  for(int i = 0; i < ReceiveCount; ++i) {
    cout << "패킷 인덱스 : " << ReceivePackets[i].Index << endl;
    cout << "패킷 바디 크기 : " << ReceivePackets[i].BodySize << endl;
  }
  cout << endl;
  Packet& FirstPacket = ReceivePackets.front();
  cout << "첫번째 패킷의 인덱스 : " << FirstPacket.Index << endl;
 
  Packet& LastPacket = ReceivePackets.back();
  cout <<"마지막 패킷의 인덱스 : " << LastPacket.Index << endl;
  
  Packet& PacketAt = ReceivePackets.at(1);
  cout << "두번째 패킷의 인덱스 : " << PacketAt.Index << endl;
 
  ReceivePackets.pop_front();
  cout << "첫번째 패킷의 인덱스 : " << ReceivePackets[0].Index << endl;
  
  ReceivePackets.pop_back();
  LastPacket = ReceivePackets.back();
  cout << "마지막 패킷의 인덱스 : " << LastPacket.Index << endl;
  
  if(false == ReceivePackets.empty()) {
    cout << "모든 패킷을 삭제합니다" << endl;
    ReceivePackets.clear();
  }
  
  return 0;
}
cs

* 결과

패킷 인덱스 : 1
패킷 바디 크기 : 10
패킷 인덱스 : 2
패킷 바디 크기 : 12
패킷 인덱스 : 3
패킷 바디 크기 : 14

역방향 출력
패킷 인덱스 : 3
패킷 바디 크기 : 14
패킷 인덱스 : 2
패킷 바디 크기 : 12
패킷 인덱스 : 1
패킷 바디 크기 : 10

배열 방식으로 접근
총 패킷 수 : 3
패킷 인덱스 : 1
패킷 바디 크기 : 10
패킷 인덱스 : 2
패킷 바디 크기 : 12
패킷 인덱스 : 3
패킷 바디 크기 : 14

첫번째 패킷의 인덱스 : 1
마지막 패킷의 인덱스 : 3
두번째 패킷의 인덱스 : 2
첫번째 패킷의 인덱스 : 2
마지막 패킷의 인덱스 : 2
모든 패킷을 삭제합니다


# deque의 insert/erase

- vector와 둘다 완전히 일치한다.(단지, insert가 전면에 넣을수 있을 뿐.)

- insert 예시1 deque.insert(iterInsertPos, 3, 10); // iterInsertPos에 10을 3번 추가.

- insert 예시2 deque.insert(iterInsertPos, deque2.begin(), deque2.end()); //iterInsertPos에 deque2내용 삽입

- erase 예시1 deque.erase(deque.begin(), deque.end()); // 처음부터 끝 삭제.

- erase 예시2 deque.erase(deque.begin()); // 첫번째 element 삭제

= 활용 예시

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
#include <iostream>
#include <deque>
 
using namespace std;
 
struct Packet {
  unsigned short Index;
  unsigned short BodySize;
  char acBodyData[100];
};
 
void print(deque<Packet> ReceivePackets) {
  for(deque<Packet>::iterator iterPos = ReceivePackets.begin(); iterPos != ReceivePackets.end(); ++iterPos) {
    cout << "패킷 인덱스 : " << iterPos->Index << endl;
    cout << "패킷 바디 크기 : " << iterPos->BodySize << endl;
  }
}
 
int main() {
  Packet pkt1, pkt2, pkt3, pkt4;
  pkt1.Index=1; pkt1.BodySize=10;
  pkt2.Index=2; pkt2.BodySize=12;
  pkt3.Index=3; pkt3.BodySize=14;
  pkt4.Index=4; pkt4.BodySize=16;
  deque<Packet> ReceivePackets;
  ReceivePackets.push_back(pkt1);
  ReceivePackets.push_back(pkt2);
  ReceivePackets.push_back(pkt3);
  
  cout << "<insert>" << endl;
  cout << "insert1" << endl;
  ReceivePackets.insert(ReceivePackets.begin(), pkt3);
  print(ReceivePackets);
  
  cout << endl << "insert2" << endl;
  ReceivePackets.insert(++ReceivePackets.begin(), 2, pkt4);
  print(ReceivePackets);
  
  cout << endl << "insert3" << endl;
  deque<Packet> ReceivePackets2;
  ReceivePackets2.push_back(pkt3);
  ReceivePackets2.push_back(pkt4);
  ReceivePackets2.push_back(pkt1);
  ReceivePackets.insert(ReceivePackets.begin(), ReceivePackets2.begin(), ReceivePackets2.end());
  print(ReceivePackets);
  
  cout << "<erase>" << endl;
  cout << "erase 1" << endl;
  ReceivePackets.erase(++ReceivePackets.begin());
  print(ReceivePackets);
  
  cout << endl << "erase 2" << endl;
  ReceivePackets.erase(++ReceivePackets.begin(), ReceivePackets.end());
  print(ReceivePackets);
  return 0;
}
cs

* 결과

<insert>
insert1
패킷 인덱스 : 3
패킷 바디 크기 : 14
패킷 인덱스 : 1
패킷 바디 크기 : 10
패킷 인덱스 : 2
패킷 바디 크기 : 12
패킷 인덱스 : 3
패킷 바디 크기 : 14

insert2
패킷 인덱스 : 3
패킷 바디 크기 : 14
패킷 인덱스 : 4
패킷 바디 크기 : 16
패킷 인덱스 : 4
패킷 바디 크기 : 16
패킷 인덱스 : 1
패킷 바디 크기 : 10
패킷 인덱스 : 2
패킷 바디 크기 : 12
패킷 인덱스 : 3
패킷 바디 크기 : 14

insert3
패킷 인덱스 : 3
패킷 바디 크기 : 14
패킷 인덱스 : 4
패킷 바디 크기 : 16
패킷 인덱스 : 1
패킷 바디 크기 : 10
패킷 인덱스 : 3
패킷 바디 크기 : 14
패킷 인덱스 : 4
패킷 바디 크기 : 16
패킷 인덱스 : 4
패킷 바디 크기 : 16
패킷 인덱스 : 1
패킷 바디 크기 : 10
패킷 인덱스 : 2
패킷 바디 크기 : 12
패킷 인덱스 : 3
패킷 바디 크기 : 14
<erase>
erase 1
패킷 인덱스 : 3
패킷 바디 크기 : 14
패킷 인덱스 : 1
패킷 바디 크기 : 10
패킷 인덱스 : 3
패킷 바디 크기 : 14
패킷 인덱스 : 4
패킷 바디 크기 : 16
패킷 인덱스 : 4
패킷 바디 크기 : 16
패킷 인덱스 : 1
패킷 바디 크기 : 10
패킷 인덱스 : 2
패킷 바디 크기 : 12
패킷 인덱스 : 3
패킷 바디 크기 : 14

erase2
패킷 인덱스 : 3
패킷 바디 크기 : 14


* 참고 : Thinking About C++ STL Programming

'코딩 > C&C++' 카테고리의 다른 글

21. STL hash_map  (0) 2017.04.20
20. STL deque2  (0) 2017.04.19
18. STL vector3  (0) 2017.04.18
17. STL vector2  (0) 2017.04.18
16. STL vector1  (0) 2017.04.17

블로그의 정보

Data+

Qerogram

활동하기