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
블로그의 정보
Data+
Qerogram