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

 

[자료구조] std::array with C++

array ary2"

maloveforme.tistory.com

https://hofe-rnd.tistory.com/entry/C-STL-Array-%EC%A0%95%EB%A6%AC

 

[C++] STL - Array 정리

2021.12.24 - [programming/C++] - [C++] STL Container 특징 과 String class [C++] STL Container 특징 과 String class STL(Standard Template Librate ) 란 ? C++ 템플릿을 이용한 표준으로 정리된 라이브러리로 구성요소로 반복자,

hofe-rnd.tistory.com