본문 바로가기
Programming

C++ Queue 초기화 방법

by 느리게 걷는 즐거움 2024. 11. 16.
반응형

C++에서 `queue`는 순차적으로 데이터를 처리해야 하는 상황에서 매우 유용한 자료구조입니다. 기본적인 사용 방법을 익혔다면, 효율적으로 `queue`를 초기화하는 방법도 알아두는 것이 좋습니다. 이번 글에서는 C++ `queue`를 초기화하는 여러 가지 방법에 대해 살펴보겠습니다.
 

1. 기본 생성자를 통한 초기화

가장 간단한 초기화 방법은 기본 생성자를 사용하는 것입니다. 이 방식은 빈 큐를 생성하며, 이후에 `push()`를 사용하여 요소를 추가할 수 있습니다.

#include <queue>
#include <iostream>

int main() {
    std::queue<int> q; // 빈 큐 생성
    q.push(1);
    q.push(2);
    q.push(3);

    std::cout << "큐의 첫 번째 요소: " << q.front() << std::endl;
    return 0;
}

이 방식은 큐를 빈 상태로 생성하며, 필요에 따라 요소를 추가할 수 있어 기본적인 초기화에 자주 사용됩니다.
 

2. 다른 컨테이너로 초기화하기

`queue`는 내부적으로 `deque` 컨테이너를 사용하지만, 다른 컨테이너(`deque` 또는 `list`)를 기반으로 초기화할 수 있습니다. 이 방법은 기존에 데이터를 저장한 컨테이너가 있을 때 유용합니다.

예시: `deque`로 초기화
#include <queue>
#include <deque>
#include <iostream>

int main() {
    std::deque<int> d = {1, 2, 3, 4, 5};
    std::queue<int> q(d); // deque을 이용해 queue 초기화

    std::cout << "큐의 첫 번째 요소: " << q.front() << std::endl;
    return 0;
}

위 코드에서 `deque` 컨테이너 `d`의 모든 요소가 `queue`에 복사되어 초기화됩니다.

예시: `list`로 초기화

`list`를 이용하여 `queue`를 초기화할 수도 있습니다. 다만, `queue`는 내부적으로 `deque`를 기본 컨테이너로 사용하기 때문에, `list` 초기화는 상대적으로 덜 일반적입니다.

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

int main() {
    std::list<int> l = {10, 20, 30};
    std::queue<int, std::list<int>> q(l); // list를 이용해 queue 초기화

    std::cout << "큐의 첫 번째 요소: " << q.front() << std::endl;
    return 0;
}

위와 같이 `list`로 `queue`를 초기화하려면, `std::queue<int, std::list<int>>`와 같이 컨테이너 형식을 명시해야 합니다.
 

3. 범위 기반 초기화 (C++11 이상)

C++11부터는 `std::initializer_list`를 통해 여러 요소를 간편하게 초기화할 수 있습니다. 하지만 `queue`는 `initializer_list`를 직접 지원하지 않으므로, `std::deque` 또는 `std::list`를 중간에 사용하여 초기화해야 합니다.

#include <queue>
#include <deque>
#include <iostream>

int main() {
    std::queue<int> q(std::deque<int>{1, 2, 3, 4}); // initializer_list 사용

    std::cout << "큐의 첫 번째 요소: " << q.front() << std::endl;
    return 0;
}

위 코드에서는 `std::deque`를 통해 초기화 리스트를 간접적으로 사용하여 큐를 초기화하고 있습니다. `std::deque<int>{1, 2, 3, 4}`와 같이 초기값을 지정해 간결하게 큐를 초기화할 수 있습니다.
 

4. 빈 `queue`를 복사하여 초기화하기

다른 `queue`를 복사하여 초기화할 수도 있습니다. 이 방법은 동일한 요소를 가진 또 다른 큐가 필요할 때 유용합니다.

#include <queue>
#include <iostream>

int main() {
    std::queue<int> originalQueue;
    originalQueue.push(1);
    originalQueue.push(2);
    originalQueue.push(3);

    // 기존 큐를 복사하여 새 큐 생성
    std::queue<int> copiedQueue = originalQueue;

    std::cout << "복사된 큐의 첫 번째 요소: " << copiedQueue.front() << std::endl;
    return 0;
}

이 예제에서는 `originalQueue`에 있는 모든 요소가 `copiedQueue`로 복사됩니다. 복사된 큐를 독립적으로 사용할 수 있어 데이터 복사가 필요한 경우에 유용합니다.
 

5. 사용자 정의 함수로 초기화하기

초기화 작업이 복잡하거나 특정 규칙에 따라 큐를 초기화해야 하는 경우, 사용자 정의 함수를 통해 큐를 초기화할 수 있습니다.

#include <queue>
#include <iostream>

std::queue<int> initializeQueue() {
    std::queue<int> q;
    for (int i = 1; i <= 5; ++i) {
        q.push(i * 10); // 규칙에 따라 요소 추가
    }
    return q;
}

int main() {
    std::queue<int> q = initializeQueue();
    std::cout << "초기화된 큐의 첫 번째 요소: " << q.front() << std::endl;

    return 0;
}

위 코드에서는 `initializeQueue()` 함수를 통해 규칙에 맞는 요소를 추가하여 큐를 초기화했습니다. 이 방법은 요소를 추가하는 로직이 복잡하거나, 코드의 가독성을 높이고자 할 때 효과적입니다.
 

반응형