Ch 3. [STL] Queue

hyeony·2025년 1월 15일

OOP

목록 보기
3/4

3.1 Queue란?

큐(Queue) 는 데이터를 FIFO(First In First Out) 방식으로 처리하는 자료구조이다. STL의 <queue>은 이러한 큐를 간단하게 구현할 수 있도록 한다.

3.2 사용법

3.2.1 주요 멤버 함수

push, front, back, size, pop, empty

#include <iostream>
#include <queue>

using namespace std;

int main() {
    queue<int> q;

    // push: 큐에 요소 추가
    q.push(10);
    q.push(20);
    q.push(30);

    // 큐 상태 확인
    cout << "Initial queue state:" << '\n';
    cout << "Front: " << q.front() << ", Back: " << q.back() << '\n';
    cout << "Size: " << q.size() << '\n';

    // pop: 요소 제거
    cout << "\nProcessing queue:" << '\n';
    while (!q.empty()) {  // empty: 큐가 비어 있는지 확인
        cout << "Front: " << q.front() << ", Back: " << q.back() << '\n';
        cout << "Popping: " << q.front() << '\n';
        q.pop();  // front 요소 제거
    }

    // 큐가 비었는지 확인
    cout << "\nIs queue empty? " << (q.empty() ? "Yes" : "No") << '\n';

    return 0;
}

3.2.2 사용자 정의 객체를 담은 Queue

#include <iostream>
#include <queue>
#include <string>

using namespace std;

class Task {
private:
    int priority;
    string name;

public:
    Task(int p, const string& n) : priority(p), name(n) {}

    // 우선순위 반환
    int getPriority() const {
        return priority;
    }

    // 이름 반환
    string getName() const {
        return name;
    }

    // 출력 함수
    void printTask() const {
        cout << "Task Name: " << name << ", Priority: " << priority << endl;
    }
};

int main() {
    queue<Task> taskQueue;

    // 작업 추가
    taskQueue.push(Task(1, "Design system"));
    taskQueue.push(Task(2, "Write documentation"));
    taskQueue.push(Task(3, "Test application"));

    // 큐 처리
    cout << "Processing tasks:\n";
    while (!taskQueue.empty()) {
        const Task& currentTask = taskQueue.front(); // front로 작업 가져오기
        currentTask.printTask(); // 작업 정보 출력
        taskQueue.pop();         // 처리한 작업 제거
    }

    return 0;
}

3.3 <queue> 내부 컨테이너 변경

기본적으로 <queue>는 내부적으로 std::deque를 사용하지만, std::vector 또는 std::list로 대체할 수도 있습니다.

#include <iostream>
#include <queue>
#include <list>

using namespace std;

int main() {
    queue<int, list<int>> q; // vector를 내부 컨테이너로 사용

    q.push(1);
    q.push(2);
    q.push(3);

    while (!q.empty()) {
        cout << q.front() << " ";
        q.pop();
    }

    return 0;
}

list가 아닌 vector을 쓴다면?
다음과 같은 오류가 뜨며 진행되지 않는다.

※ 정리

특징std::deque(기본값)std::vectorstd::list
push_back 지원지원지원지원
pop_front 지원지원未 지원지원
임의 접근([]) 지원지원지원未 지원
push_front 지원지원未 지원지원
push_back 지원지원지원지원
캐시 효율성좋음매우 좋음나쁨

위 사항 때문에, std::deque은 일반적인 큐 구현이나 앞뒤 작업이 많은 경우에 사용된다. std::vector은 큐에서 pop_front가 필요없거나 캐시 효율이 중요할 때 쓰인다. list은 삽입/삭제가 빈번할 때 사용된다.

profile
Chung-Ang Univ. EEE.

0개의 댓글