배열$($Array$)$란?
배열(Array)은 자료구조의 한 형태로, 동일한 자료형의 데이터를 연속적인 메모리 공간에 순차적으로 저장하는 구조이다. 배열은 다음과 같은 특징을 가지고 있다.
- 고정 크기: 배열을 생성할 때, 그 크기가 정해지며, 대부분의 프로그래밍 언어에서는 배열의 크기를 변경할 수 없다
- 인덱스 접근: 배열의 각 요소는 인덱스(또는 위치)를 통해 접근할 수 있다. 이 인덱스는 0부터 시작하여 $($배열의 크기$)$ - 1 까지의 값을 가진다
- 동일한 자료형: 배열에 저장되는 모든 요소는 동일한 자료형이어야 한다. 예를 들어, 정수형 배열에는 정수만 저장할 수 있다.
자료구조에서의 Array
- std::array는 메모리를 자동으로 할당하고 해제한다.
- std::array는 원소의 타입과 배열 크기를 매개변수로 사용한다.
<예제 코드>
#include <iostream>
#include <array>
int main()
{
std::array<int, 10> arr1;
arr1[0] = 1;
std::cout<< "arr1의 첫 번째 원소: " << arr1[0] << std::endl;
std::array<int, 4> arr2 = {1,2,3,4};
std::cout<< "arr2의 모든 원소: ";
for (int i = 0; i < arr2.size(); i++)
std::cout << arr2[i] << " ";
std::cout << std::endl;
}
std::array는 at(index) 형식의 함수도 함께 제공한다. 만약 인자로 전달된 index 값이 유효하지 않다면 예외를 발생시킨다.
#include <iostream>
#include <array>
int main()
{
std::array<int, 4> arr3 = {1,2,3,4};
std::cout<< arr3.at(3) << std::endl; // 에러 아님
std::cout<< arr3.at(4) << std::endl; // out_of_range
}
std::array의 원소 접근 함수
함수명 | 설명 |
begin() | 첫 번째 원소를 가리키는 반복자를 반환 |
end() | 마지막 원소를 가리키는 반복자를 반환 |
front() | 첫 번째 원소의 값을 반환 |
back() | 마지막 원소의 값을 반환 |
data() | 배열 객체 내부에서 포인터를 반환, 이는 배열의 첫 번째 요소를 가리킨다 |
★ begin(), end() 와 front(), back() 가 어떻게 다른 지 감이 잘 안 잡힐 수 있는데, begin(), end()는 어떤 배열에서 각각 첫번째와 마지막 원소의 반복자(iterator), 즉 "위치"를 반환하지만, front(), back()은 그 위치에 해당하는 원소 "값"을 반환한다. 따라서 만약 begin 이나 end로 원소에 접근하고자 한다면, 반드시 포인터 연산자를 수행해줘야 한다.
<예제 코드 1>
#include <iostream>
#include <array>
int main() {
std::array<int, 5> arr = {10, 20, 30, 40, 50};
auto it = arr.begin(); // vec의 첫 번째 요소를 가리키는 반복자
// it 자체를 출력하려고 시도하는 경우 (컴파일러 오류 또는 의도하지 않은 출력 발생)
std::cout << "it의 값: " << it << std::endl; // 이 줄은 컴파일되지 않거나 예상치 못한 출력을 생성합니다.
// it를 역참조하여 첫 번째 요소의 값을 얻음
std::cout << "첫 번째 요소의 값: " << *it << std::endl; //첫 번째 요소인 10 출력
int FirstElement = arr.front();
std::cout << "첫 번째 요소의 값: " << FirstElement << std::endl; //첫 번째 요소인 10 출력
}
<예제 코드 2>
#include <iostream>
#include <array>
int main() {
std::array<int, 5> arr = {10, 20, 30, 40, 50};
std::cout << arr.front() << std::endl; // 출력: 10
std::cout << arr.back() << std::endl; // 출력: 50
std::cout << *(arr.data() + 1) << std::endl; //출력: 20
}
※ 실제로 *(arr.begin()), arr.front, *(arr.data())는 같은 값을 출력한다
참고 문헌
코딩 테스트를 위한 자료 구조와 알고리즘 with C++ " title="코딩 테스트를 위한 자료구조와 알고리즘 with C++" rel="noopener" data-mce-href="http:// 코딩 테스트를 위한 자료 구조와 알고리즘 with C++ ">http:// 코딩 테스트를 위한 자료 구조와 알고리즘 with C++
코딩 테스트를 위한 자료 구조와 알고리즘 with C++ - 예스24
67개 문제 풀이로 익히는 C++ 자료 구조와 알고리즘!코딩 테스트 준비 및 최신 C++ 문법으로 알고리즘을 학습하자!C++ 자료 구조부터 그리디 알고리즘, 분할 정복 알고리즘, 그래프 알고리즘, 동적
www.yes24.com
'산업공학 > 자료구조' 카테고리의 다른 글
[자료구조] 스택 (Stack) (1) | 2024.07.21 |
---|---|
[자료구조 in C++] 동적 배열(Vector) (1) | 2024.02.15 |
[자료구조 in C++] 연속된 자료구조와 연결된 자료구조 (1) | 2024.02.08 |