안녕하세요. C++을 다루기 위한 기본 적인 자료 구조와 코딩 테스트 등에서 응용될 수 있는 알고리즘을 알아보는 시간을 가지겠습니다.
이번 게시물은 std::array를 간단히 설명해 보려 합니다.
게시물 끝에 std::array를 사용한 stack과 queue 구현 예시도 있으니까 참고 바랍니다!
1) 특징
std::array는 C++ 표준 라이브러리에서 제공하는 정적 배열 기반의 컨테이너입니다. 크기가 고정되어 있으며, 연속된 메모리 공간에 원소를 저장하는 특징을 가지고 있습니다. 또한, C 스타일 배열과 비교해 안전한 인덱스 접근과 편리한 기능을 제공합니다.
(연속된 자료 구조와 연결된 자료 구조에 대한 정보는 아래 게시물을 참조해 주세요!)
2023.05.18 - [Programming/C++] - [C++ 자료 구조와 알고리즘] #1 자료 구조 (1) - 연속된 자료 구조와 연결된 자료 구조
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 스타일 배열보다 더욱 안전하고 효율적인 프로그래밍을 할 수 있게 해 줍니다.
'Programming > C++' 카테고리의 다른 글
[C++ 자료 구조와 알고리즘] #4 자료 구조 (4) - std::list (C++ STL container), std::list 기반 stack과 queue (0) | 2023.05.23 |
---|---|
[C++ 자료 구조와 알고리즘] #3 자료 구조 (3) - std::vector (C++ STL container), std::vector 기반 stack과 queue (0) | 2023.05.18 |
[C++ 자료 구조와 알고리즘] #1 자료 구조 (1) - 연속된 자료 구조와 연결된 자료 구조 (0) | 2023.05.18 |
[C++] #2: namespace, reference(참조자, Dangling reference) (0) | 2020.08.13 |
[C++] #1: C++ 개요 (0) | 2020.08.13 |