[C++ 자료 구조와 알고리즘] #2 자료 구조 (2) - std::array (C++ STL container), std::array 기반 stack과 queue

Programming/C++ · 2023. 5. 18. 17:34

안녕하세요. C++을 다루기 위한 기본 적인 자료 구조와 코딩 테스트 등에서 응용될 수 있는 알고리즘을 알아보는 시간을 가지겠습니다.

 

이번 게시물은 std::array를 간단히 설명해 보려 합니다. 

게시물 끝에 std::array를 사용한 stack과 queue 구현 예시도 있으니까 참고 바랍니다!

 

1) 특징

std::array는 C++ 표준 라이브러리에서 제공하는 정적 배열 기반의 컨테이너입니다. 크기가 고정되어 있으며, 연속된 메모리 공간에 원소를 저장하는 특징을 가지고 있습니다. 또한, C 스타일 배열과 비교해 안전한 인덱스 접근과 편리한 기능을 제공합니다.

(연속된 자료 구조와 연결된 자료 구조에 대한 정보는 아래 게시물을 참조해 주세요!)

 

2023.05.18 - [Programming/C++] - [C++ 자료 구조와 알고리즘] #1 자료 구조 (1) - 연속된 자료 구조와 연결된 자료 구조

 

[C++ 자료 구조와 알고리즘] #1 자료 구조 (1) - 연속된 자료 구조와 연결된 자료 구조

안녕하세요. C++을 다루기 위한 기본 적인 자료 구조와 코딩 테스트 등에서 응용될 수 있는 알고리즘을 알아보는 시간을 가지겠습니다. 이번 게시물은 연속된 자료 구조와 연결된 자료 구조의 차

lsoovmee-rhino.tistory.com

 

std::array는 템플릿 클래스로 구현되어 있으며, 첫 번째 템플릿 매개변수는 원소의 타입을 두 번째 템플릿 매개변수로는 배열의 크기를 지정합니다. 자세한 사용 예시는 아래 예시 코드를 참고하시길 바랍니다.

이때 std::array의 크기는 컴파일 타임에 상수로 정의되므로 실행 시간에 동적으로 크기를 변경할 수 없습니다. 이러한 특징 때문에 실행 시간에 크기 검사를 수행하지 않아 성능 향상에 도움이 될 수 있습니다.

 

2) 속성 (Attributes)

std::array의 주요 속성은 다음과 같습니다.

 

- size(): 배열의 크기를 반환합니다.

- at(): 인덱스를 통해 배열의 원소에 접근합니다. 범위 검사를 수행하여 유효한 인덱스인지 확인합니다.

- operator[]: 인덱스를 통해 배열의 원소에 접근합니다. 범위 검사를 수행하지 않으므로 주의해야 합니다.

- front(): 첫 번째 원소에 접근합니다.

- back(): 마지막 원소에 접근합니다.

- begin(), end(): 반복자를 반환하여 배열의 원소를 순회합니다.

- empty(): 배열이 비어있는지 여부를 확인합니다.

 

다음은 예시 코드입니다.

 

#include <array>
#include <iostream>

int main() {
    std::array<int, 5> arr = {1, 2, 3, 4, 5};

    // 배열의 크기 얻기
    std::cout << "Size: " << arr.size() << std::endl;

    // 인덱스를 통한 원소 접근
    std::cout << "Element at index 2: " << arr[2] << std::endl;

    // at() 함수를 사용한 원소 접근
    std::cout << "Element at index 3: " << arr.at(3) << std::endl;

    // 첫 번째와 마지막 원소 접근
    std::cout << "First element: " << arr.front() << std::endl;
    std::cout << "Last element: " << arr.back() << std::endl;

    // 반복자를 사용한 원소 순회
    std::cout << "Elements: ";
    for (auto it = arr.begin(); it != arr.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    // 배열이 비어있는지 확인
    std::cout << "Is empty? " << (arr.empty() ? "Yes" : "No") << std::endl;

    return 0;
}

 

3) std::array를 사용한 stack과 queue 구현 예시

#include <array>
#include <iostream>

template<typename T, std::size_t N>
class Stack {
private:
    std::array<T, N> data;
    std::size_t top;

public:
    Stack() : top(0) {}

    void push(const T& item) {
        if (top < N) {
            data[top++] = item;
            std::cout << "Pushed: " << item << std::endl;
        } else {
            std::cout << "Stack Overflow!" << std::endl;
        }
    }

    T pop() {
        if (top > 0) {
            T item = data[--top];
            std::cout << "Popped: " << item << std::endl;
            return item;
        } else {
            std::cout << "Stack Underflow!" << std::endl;
            return T();
        }
    }

    std::size_t size() const {
        return top;
    }

    bool empty() const {
        return top == 0;
    }
};

template<typename T, std::size_t N>
class Queue {
private:
    std::array<T, N> data;
    std::size_t front;
    std::size_t rear;

public:
    Queue() : front(0), rear(0) {}

    void enqueue(const T& item) {
        if ((rear + 1) % N != front) {
            data[rear] = item;
            rear = (rear + 1) % N;
            std::cout << "Enqueued: " << item << std::endl;
        } else {
            std::cout << "Queue Overflow!" << std::endl;
        }
    }

    T dequeue() {
        if (front != rear) {
            T item = data[front];
            front = (front + 1) % N;
            std::cout << "Dequeued: " << item << std::endl;
            return item;
        } else {
            std::cout << "Queue Underflow!" << std::endl;
            return T();
        }
    }

    std::size_t size() const {
        return (rear - front + N) % N;
    }

    bool empty() const {
        return front == rear;
    }
};

int main() {
    Stack<int, 5> stack;
    stack.push(1);
    stack.push(2);
    stack.push(3);
    stack.pop();
    stack.pop();
    stack.pop();
    stack.pop();

    Queue<std::string, 3> queue;
    queue.enqueue("Apple");
    queue.enqueue("Banana");
    queue.enqueue("Cherry");
    queue.enqueue("Durian");
    queue.dequeue();
    queue.dequeue();
    queue.dequeue();
    queue.dequeue();

    return 0;
}

 

4) 결론

std::array는 고정된 크기의 배열을 다루는 경우에 유용하며, 안전한 인덱스 접근과 편리한 기능을 제공하여 C 스타일 배열보다 더욱 안전하고 효율적인 프로그래밍을 할 수 있게 해 줍니다.

 

 

반응형