STL - Deque

2017. 1. 4. 22:42IT-개발/C및C++

반응형


장점


1. 크기가 가변적이다. 리스트와 같이 데이터를 담을 수 있는 크기가 가변적이다.

2. 앞과 뒤에서 삽입과 삭제가 좋다. Deque이 다른 자료구조와 가장 다른 점으로 앞과 뒤에서 삽입, 삭제가 좋다.

3. 중간에 데이터 삽입, 삭제가 용이하지 않다. 데이터를 중간에 삽입하거나 삭제하는 것은 피해야 한다. 삽입과 삭제를 중간

   에 한다면 삽입하거나 삭제한 위치 앞뒤 데이터를 모두 이동해야 한다.

4. 구현이 쉽지 않다.Deque은 Stack과 Queue가 결합된 자료구조로 연결 리스트보다 구현하기가더 어렵다.

5. 랜덤 접근이 가능하다. 연결 리스트처럼 리스트를 탐색하지 않고 원하는 요소에 바로 접근할 수 있다.


• deque은 앞과 뒤에서 삽입과 삭제 성능이 vector보다 더 좋다.

• deque은 앞과 뒤 삽입, 삭제를 제외한 기능은 vector보다 성능이 좋지 못하다.



deque을 사용하는 경우


1. 앞과 뒤에서 삽입, 삭제를 한다.

이것이 deque을 사용하는 가장 큰 이유이다. 대부분 작업이 데이터를 앞이나

뒤에 삽입, 삭제를 한다면 STL 컨테이너 라이브러리 중에서 deque을 사용할

때 성능이 가장 좋다.


2. 저장할 데이터 개수가 가변적이다.

저장할 데이터 개수를 미리 알 수 없어도 deque은 크기가 동적으로 변하므로

유연하게 사용할 수 있다.


3. 검색을 거의 하지 않는다.

많은 데이터를 저장한다면 앞에서 여러 번 언급했듯이 map, set, hash_map

중 하나를 선택해서 사용하는 편이 좋다.


4. 데이터 접근을 랜덤하게 하고 싶다.

vector와 같이 랜덤 접근이 가능하다. 사용하는 방법도 같다.



sample)))


#include <iostream>

#include <deque>

using namespace std;


// 서버/ 클라이언트간에 주고 받는 패킷

struct Packet

{

unsigned short Index; // 패킷 인덱스

unsigned short BodySize; // 패킷 보디(실제 데이터)의 크기

char acBodyData[100]; // 패킷의 데이터

};


int main()

{

Packet Pkt1;

Pkt1.Index = 1; Pkt1.BodySize = 10;

Packet Pkt2;

Pkt2.Index = 2; Pkt2.BodySize = 12;

Packet Pkt3;

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 ReceivePacketCount = ReceivePackets.size();

cout << "총 패킷 수: " << ReceivePacketCount << endl;

for( int i = 0; i < ReceivePacketCount; ++i )

{

cout << "패킷 인덱스: " << ReceivePackets[i].Index << endl;

cout << "패킷 바디 크기: " << ReceivePackets[i].BodySize << endl;

}


// 첫 번째, 마지막 위치에 있는 패킷

Packet& FirstPacket = ReceivePackets.front();

cout << "첫 번째 패킷의 인덱스: " << FirstPacket.Index << endl;

Packet& LastPacket = ReceivePackets.back();


cout << "마지막 패킷의 인덱스: " << LastPacket.Index << endl;


// at을 사용하여 두 번째 패킷

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();

}


}



'IT-개발 > C및C++' 카테고리의 다른 글

STL - hash_map - sample(1)  (0) 2017.01.04
STL - Deque - sample(1)  (0) 2017.01.04
문법 - C++ - static_cast, dynamic_cast, const_cast, reinterpret_cast  (0) 2016.12.02
STL - list - Sample (3)  (0) 2016.12.02
STL - list - Sample (2)  (0) 2016.12.02