C++
<STL> Array
hanseongbugi
2024. 2. 1. 16:54
Array의 특징
- Array는 크기가 정해진 캡슐화된 컨테이너 클래스 플릿이다.
- 크기가 고정되어 있어 heap이 아닌 stack 공간에 원소가 저장된다.
- 기본 자료형으로 제공하는 고정 배열과 동일한 공간에 저장된다.
- Array는 원소의 타입과 배열의 크기를 매개변수로 사용한다.
- Array는 배열이기 때문에 연속된 메모리 공간에 데이터를 저장한다.
- Array 컨테이너를 사용 시 고정 배열을 사용할 때와 다르게 함수 전달 시 포인터로 형 변환 되지 않는다.
- 고정 배열보다 Array를 사용하면 내장 멤버 함수를 통해 편리하게 원소에 접근할 수 있다.
- [], at()을 통한 임의 접근으로 원소에 접근할 수 있다.
생성 및 원소 접근
- Array는 요소의 자료형과 원소의 개수를 명시하여 생성할 수 있다.
- []과 at() 함수를 통해 요소에 접근할 수 있다.
#include <iostream>
#include <array>
using namespace std;
int main()
{
// [] 연산자를 이용해 초기화 하는 방법
array<char, 3> arr1;
arr1[0] = 'a'; arr1[1] = 'b'; arr1[2] = 'c';
// 선언과 동시에 초기화하는 방법
array<char, 3> arr2 = { 'A', 'B', 'C' };
cout << "arr1의 원소: ";
for (char& ch : arr1)
cout << ch << ' ';
cout << '\n' << "arr2의 원소: ";
for (int i = 0; i < arr2.size(); i++)
cout << arr2.at(i) << ' ';
}
// 출력
arr1의 원소: a b c
arr2의 원소: A B C
Array 함수 전달
- array 컨테이너를 함수 전달 시 매개변수로 값 또는 참조를 전달할 수 있다.
- const와 함께 사용하여 깊은 복사를 피할 수도 있다.
- 깊은 복사를 통해 함수 전달 시 새로운 메모리 공간에 배열의 모든 원소가 복사되어 메모리 누수가 생길 수 있다.
- const를 사용하여 앝은 복사로 전달 시 디폴트 복사 생성자로 원본 메모리 공간에 접근할 수 있다.
#include <iostream>
#include <array>
using namespace std;
void print(const array<char, 5>& arr) {
for (int i = 0; i < arr.size(); i++)
cout << arr[i] << ' ';
}
int main()
{
array<char, 5> arr = { 'a','b','c','d','e' };
print(arr);
}
// 출력
a b c d e
반복자
- Array 컨테이너도 STL에서 제공하는 iterator를 통한 순회가 가능하다.
- front()
- array의 첫번째 요소를 가리키는 iterator를 반환
- back()
- array의 마지막 요소를 가리키는 iterator를 반환
- data()
- 객체 내부에서 실제 메모리 버퍼를 가리키는 포인터를 반환
#include <array>
#include <iostream>
using namespace std;
int main()
{
array<int, 5> myArr = { 1,2,3,4,5 };
cout << myArr.front() << '\n'; // 1
cout << myArr.back() << '\n'; // 5
cout << *(myArr.data() + 1) << '\n'; // 2
}
깊은 비교&깊은 복사
- 일반적으로 사용하는 배열은 깊은 비교를 지원하지 않고, 앝은 비교를 지원한다,
- 앝은 비교는 기본 타입 데이터의 경우 값의 동일 여부만 비교한다.
- 객체의 경우 객체의 주소 값만 비교하기 때문에 동일한 값이 배열의 요소로 존재하여도 주소가 다르면 같지 않다고 출력하게 된다.
#include <iostream>
using namespace std;
int main()
{
int arr1[10] = { 1,1,1,1,1,2,2,2,2,2 };
int arr2[10] = { 1,1,1,1,1,2,2,2,2,2 };
if (arr1 == arr2)
cout << "int Arr1[10] == int Arr2[10]" << endl;
else
cout << "int Arr1[10] != int Arr2[10]" << endl;
}
// 출력
int Arr1[10] != int Arr2[10]
- Array의 경우 깊은 비교를 지원하기 때문에 객체의 경우에도 값으로 비교하게 된다.
- 객체의 주소 값을 비교하는 것이 아닌 객체 간의 내용이 같은지 비교하는 것
- 일반적으로 깊은 비교를 위해서 연산자 재정의가 필요하지만, array는 이를 제공하고 있다.
#include <iostream>
#include<array>
using namespace std;
int main()
{
array<int, 10> arr1 = { 1,1,1,1,1,2,2,2,2,2 };
array<int, 10> arr2 = { 1,1,1,1,1,2,2,2,2,2 };
if (arr1 == arr2)
cout << "int Arr1[10] == int Arr2[10]" << endl;
else
cout << "int Arr1[10] != int Arr2[10]" << endl;
}
// 출력
int Arr1[10] == int Arr2[10]
- array는 깊은 복사를 위한 복사 할당 연산자(Copy Assignment Operator)도 제공한다
- 관계 연산자를 이용하여 array간 배열을 비교하는 용도로 사용할 수 있다.
- 단, 관계 연산자의 경우 array는 배열의 크기도 데이터 타입으로 인식하여 크기가 다르면 비교 연산을 진행할 수 없다.
#include <iostream>
#include <array>
using namespace std;
int main()
{
array<int, 10> myAry1 = { 1,1,1,1,2,2,2,2,2,2 };
array<int, 10> myAry2 = { 1,1,1,1,1,2,2,2,2,2 };
array<int, 9> myAry3 = { 1,1,1,1,2,3,4,5,6 };
if (myAry1 > myAry2)
cout << "array<int,10> ary1 > array<int,10> ary2" << endl;
else
cout << "array<int,10> ary1 !> array<int,10> ary2" << endl;
if (myAry1 > myAry3) // Error
cout << "array<int,10> ary1 > array<int,9> ary3" << endl;
}
출처
https://maloveforme.tistory.com/36
https://hofe-rnd.tistory.com/entry/C-STL-Array-%EC%A0%95%EB%A6%AC