STL_deque 컨테이너

1. deque 소개

Deque는 "double-ended queue"의 약어로 벡터와 같은 STL 컨테이너입니다. Deque는 양단 배열이고 벡터는 단일 종단입니다.

deque의 인터페이스는 vector와 매우 유사하며 많은 작업에서 직접 대체 할 수 있습니다.

Deque는 요소에 임의로 액세스 할 수 있습니다 ([] 연산자 또는 at () 메서드를 사용하여 인덱스 값 직접 액세스 지원).

** 데크 헤드와 테일은 요소를 매우 빠르게 추가하거나 제거합니다. ** 그러나 중간에 요소를 삽입하거나 제거하는 데 시간이 걸립니다.

#include <deque>

원리:

Deque 컨테이너는 적어도 논리적으로 연속적인 공간입니다. 연속적인 현재 공간은 항상 우리에게 배열과 벡터를 상기시킵니다. 배열은 성장할 수 없습니다. 벡터는 성장할 수 있지만 끝까지 만 성장할 수 있으며 실제로는 가짜입니다. (1) 더 많은 공간을 신청하십시오 (2) 원본 데이터의 새로운 공간을 복사하십시오 (3) 새로운 공간이 할당 될 때마다 벡터가 공간을 떠나는 것이 아니라면 원본 공간을 3 단계로 해제하십시오. 성장 환상은 매우 비쌉니다.

Deque는 양적 연속 공간의 섹션으로 구성됩니다. 데크의 앞이나 끝에 새 공간을 추가해야하는 경우 연속적인 양적 공간을 구성하고 데크의 머리 또는 끝에 직렬로 연결합니다. Deque의 가장 큰 임무는 이러한 세그먼트 화 된 연속 메모리 공간의 무결성에 대한 환상을 유지하고 랜덤 액세스 인터페이스를 제공하여 복잡한 반복기 아키텍처 비용으로 공간 재구성, 복사 및주기 해제를 피하는 것입니다.

deque는 분할 된 연속 메모리 공간이기 때문에 전체적인 연속성의 환상을 유지하기 위해 중앙 제어가 있어야합니다. 데이터 구조의 설계와 반복기의 순방향 및 역방향 작업은 매우 지루합니다. Deque 코드의 구현은 vector 또는 list 이상 입니다.

Deque는 소위 맵 (STL 맵 컨테이너가 아님)을 마스터 컨트롤로 사용합니다. 여기서 소위 맵은 작은 연속 메모리 공간이며, 여기에서 각 요소 (여기서는 노드가 됨)는 또 다른 연속 메모리 공간을 버퍼라고합니다. 버퍼는 데크 저장 공간의 본체입니다.

벡터와의 차이점 :

deque 컨테이너와 벡터 컨테이너의 가장 큰 차이점은 deque를 사용하면 일정한 항목 시간을 사용하여 헤드 끝에서 요소를 삽입하고 삭제할 수 있다는 것입니다. 두 번째는 deque가 분할 된 연속 공간과 동적으로 결합되기 때문에 용량 개념이 없다는 것입니다. 새 공간은 언제든지 추가 및 연결할 수 있습니다. 즉, 벡터처럼 "오래된 공간은 부족하고 새로운 공간이 재구성됩니다. 큰 공간, 그런 다음 요소를 복사 한 다음 이전 공간을 해제합니다. "그런 일이 발생하지 않습니다. 따라서 deque는 소위 예약 기능을 제공 할 필요가 없습니다.

deque 컨테이너는 Random Access Iterator도 제공하지만 해당 반복자는 일반 포인터가 아니며 복잡도는 벡터와 동일하지 않으므로 다양한 작업의 수준에 영향을줍니다. 따라서 필요한 경우 아니라면 가능한 한 deque 대신 벡터를 사용해야합니다 . deque 정렬 작업의 경우 효율성을 극대화하기 위해 deque를 벡터에 완전히 복사하고 벡터 컨테이너를 정렬 한 다음 deque에 다시 복사 할 수 있습니다 .

둘째, 데크 오브젝트의 구조

deque는 템플릿 클래스와 deque 개체의 기본 구조를 사용하여 구현됩니다. deque <T> deqT;

  • deque <int> deqInt; // int를 저장하기위한 deque 컨테이너.

  • deque <float> deqFloat; // float를위한 deque 컨테이너.

  • deque <string> deqString; // 문자열을 저장하기위한 deque 컨테이너.

  • // 각괄호 안에 포인터 유형 또는 사용자 정의 유형을 설정할 수도 있습니다.

deque (beg, end); // 생성자는 [beg, end) 범위의 요소를 자신에게 복사합니다.

deque (n, elem); // 생성자는 n 개의 elem을 자신에게 복사합니다.

deque (const deque & deq); // 복사 생성자.

	deque<int> d1;
	deque<int> d2(10, 5);
	deque<int> d3(d2.begin(), d2.end());
	deque<int> d4(d3);

셋, 데크 끝에 작업 추가 및 제거

deque.push_back (elem); // 컨테이너 끝에 데이터 추가

deque.push_front (elem); // 컨테이너 헤드에 데이터 삽입

deque.pop_back (); // 컨테이너의 마지막 데이터 삭제

deque.pop_front (); // 컨테이너의 첫 번째 데이터 삭제

	deque<int> deqInt;

    deqInt.push_back(1);
    deqInt.push_back(3);
    deqInt.push_back(5);
    deqInt.push_back(7);

    deqInt.pop_front();
    deqInt.pop_front();

    deqInt.push_front(11);
    deqInt.push_front(13);

    deqInt.pop_back();

//deqInt { 13,11,5}

네, 데크 데이터 액세스

deque.at (idx); // idx가 범위를 벗어난 경우 out_of_range를 throw하고 idx 인덱스가 가리키는 데이터를 반환합니다.

deque [idx]; // 인덱스 idx가 가리키는 데이터를 반환합니다. idx가 범위를 벗어난 경우 예외가 발생하지 않고 직접 오류가 발생합니다.

deque.front (); // 첫 번째 데이터를 반환합니다.

deque.back (); // 마지막 데이터 반환

	deque<int> deqInt;
 
 	deqInt.push_back(1);
    deqInt.push_back(3);
    deqInt.push_back(5);
    deqInt.push_back(7);
    deqInt.push_back(9);

	int iA = deqInt.at(0);        //1
    int iB = deqInt[1];           //3
    deqInt.at(0) = 99;           //99
    deqInt[1] = 88;         //88
    int iFront = deqInt.front();    //99
    int iBack = deqInt.back();    //9
    deqInt.front() = 77;         //77
    deqInt.back() = 66;         //66

다섯, deque 및 반복자

deque.begin (); // 컨테이너에있는 첫 번째 요소의 반복자를 반환합니다.

deque.end (); // 컨테이너의 마지막 요소 뒤의 반복자를 반환합니다.

deque.rbegin (); // 컨테이너의 맨 아래에서 첫 번째 요소의 반복자를 반환합니다.

deque.rend (); // 컨테이너의 마지막 요소 뒤의 반복자를 반환합니다.

	deque<int> deqInt;

    deqInt.push_back(1);
    deqInt.push_back(3);
	deqInt.push_back(5);
    deqInt.push_back(7);
    deqInt.push_back(9);

    for (deque<int>::iterator it=deqInt.begin(); it!=deqInt.end(); ++it)
    {
    
    
         cout << *it;
         cout << "";
     }
    // 1 3 5 7 9

	for (deque<int>::reverse_iterator rit=deqInt.rbegin(); rit!=deqInt.rend(); ++rit)
    {
    
    
	     cout << *rit;
         cout << "";
    }
    //9 7 5 3 1

여섯, 데크 할당

deque.assign (beg, end); // [beg, end) 간격의 데이터 복사본을 자신에게 할당합니다. 간격은 닫힌 상태로 있고 오른쪽은 열린 상태입니다.

deque.assign (n, elem); // n 개의 elem 사본을 자신에게 할당합니다.

deque & operator = (const deque & deq); // 등호 연산자 오버로드

deque.swap (deq); // vec를 자체 요소로 교체

	deque<int> deqIntA,deqIntB,deqIntC,deqIntD;

    deqIntA.push_back(1);
    deqIntA.push_back(3);
    deqIntA.push_back(5);
	deqIntA.push_back(7);
    deqIntA.push_back(9);

    deqIntB.assign(deqIntA.begin(),deqIntA.end());   // 1 3 5 7 9
   
    deqIntC.assign(5,8);                         //8 8 8 8 8

    deqIntD = deqIntA;                          //1 3 5 7 9

	deqIntC.swap(deqIntD);                      //互换

일곱, 데크의 크기

deque.size (); // 컨테이너의 요소 수를 반환합니다.

deque.empty (); // 컨테이너가 비어 있는지 확인

deque.resize (num); // 컨테이너의 길이를 num으로 다시 지정합니다. 컨테이너가 길어지면 새 위치를 기본값으로 채 웁니다. 컨테이너가 더 짧아지면 컨테이너 길이를 초과하는 끝에있는 요소가 삭제됩니다.

deque.resize (num, elem); // 컨테이너 길이를 num으로 다시 지정합니다. 컨테이너가 길어지면 elem 값으로 새 위치를 채 웁니다. 컨테이너가 더 짧아지면 컨테이너 길이를 초과하는 끝에있는 요소가 삭제됩니다.

	deque<int> deqIntA;

	deqIntA.push_back(1);
    deqIntA.push_back(3);
    deqIntA.push_back(5);

    int iSize = deqIntA.size(); //3

	if (!deqIntA.empty())
    {
    
    
        deqIntA.resize(5);      //1 3 5 0 0
        deqIntA.resize(7,1); 	//1 3 5 0 0 1 1
        deqIntA.resize(2);      //1 3
    }

여덟, 데크 삽입

deque.insert (pos, elem); // pos 위치에 요소 요소의 복사본을 삽입하고 새 데이터의 위치를 ​​반환합니다.

deque.insert (pos, n, elem); // 위치 pos에 n 개의 elem 데이터를 삽입하고 반환 값은 없습니다.

deque.insert (pos, beg, end); // [beg, end) 간격의 pos 위치에 데이터를 삽입합니다. 반환 값은 없습니다.

	deque<int> deqA;
    deque<int> deqB;

    deqA.push_back(1);
	deqA.push_back(3);
    deqA.push_back(5);
	deqA.push_back(7);
    deqA.push_back(9);

	deqB.push_back(2);
    deqB.push_back(4);
    deqB.push_back(6);
    deqB.push_back(8);
   
    deqA.insert(deqA.begin(), 11);        //{11, 1, 3, 5, 7, 9}
    deqA.insert(deqA.begin()+1,2,33);     //{11,33,33,1,3,5,7,9}
    deqA.insert(deqA.begin() , deqB.begin() , deqB.end() ); //{2,4,6,8,11,33,33,1,3,5,7,9}

아홉, 데크 삭제

deque.clear (); // 컨테이너의 모든 데이터 제거

deque.erase (beg, end); // [beg, end) 구간의 데이터를 삭제하고 다음 데이터의 위치를 ​​반환합니다.

deque.erase (pos); // pos 위치의 데이터를 삭제하고 다음 데이터의 위치를 ​​반환합니다.

	//删除区间内的元素

	//deqInt是用deque<int>声明的容器,现已包含按顺序的1,3,5,6,9元素。
	deque<int>::iterator itBegin=deqInt.begin()+1;
	deque<int>::iterator itEnd=deqInt.begin()+3;
	deqInt.erase(itBegin,itEnd);
	//此时容器deqInt包含按顺序的1,6,9三个元素。 

	//假设 deqInt 包含1,3,2,3,3,3,4,3,5,3,删除容器中等于3的元素
	for(deque<int>::iterator it=deqInt.being(); it!=deqInt.end(); )  {
    
    
        //小括号里不需写 ++it	
		if(*it == 3){
    
    
			it = deqInt.erase(it);    
            //以迭代器为参数,删除元素3,并把数据删除后的下一个元素位置返回给迭代器。
		    //此时,不执行 ++it; 
		}
		else{
    
    
		    ++it;
		}
	}
 
//删除deqInt的所有元素
deqInt.clear();         //容器为空

추천

출처blog.csdn.net/weixin_45341339/article/details/113092870