https://ko.linux-console.net/?p=6025#gsc.tab=0


소개

이 자습서에서는 C++의 함수에서 배열을 반환하는 방법을 이해할 것입니다.

C++ 함수에서 배열을 반환하는 방법

일반적으로 전체 배열을 함수 호출로 반환하는 것은 불가능합니다. 포인터를 사용해야만 할 수 있습니다.

게다가 반환 유형이 포인터인 함수를 선언하고 C++에서 C 유형 배열의 주소를 반환하는 것은 모든 경우에 작동하지 않습니다. 컴파일러는 지역 변수 반환에 대한 경고를 발생시키고 심지어 출력에 일부 비정상적인 동작을 표시합니다.

따라서 C++의 함수에서 배열을 반환하는 것은 그리 쉬운 일이 아닙니다. 그러나 아래 언급된 방법 중 하나를 따르면 이를 달성할 수 있습니다.

바로 시작합시다.

1. 포인터 사용

앞에서 언급했듯이 포인터를 사용하여 함수에서 일반 배열을 반환하면 때때로 예기치 않은 결과가 발생합니다. 그러나 이 동작과 경고는 배열을 정적 배열로 선언함으로써 피할 수 있습니다.

방법을 살펴보겠습니다.

#include<iostream>
using namespace std;

int* demo() //return type- address of integer array
{
	static int a[5]; //array declared as static
	for(int i = 0; i<5; i++)
	{
		a[i] = i; //array initialisation
	}

	return a; //address of a returned
}

int main()
{
	int* ptr; //pointer to hold address
	int i;
	ptr = demo(); //address of a
	cout<<"Array is: ";
	for(i=0 ; i<5; i++)
		cout<<ptr[i]<<"\t"; //ptr[i] is equivalent to *(ptr+i)
		
	return 0;
}

산출:

Array is: 0     1       2       3       4

여기에서 demo() 함수를 반환 유형 int *(포인터)로 선언했으며 그 정의에서 a를 반환했습니다( main()에서 함수 호출 사이트에 대한 배열 이름 및 기본 주소로 사용됨).

위 출력에서 볼 수 있듯이 배열은 함수에 의해 성공적으로 반환됩니다.

2. C++에서 구조체 사용하기

또한 C++의 구조체 내부에 선언하여 함수가 배열을 반환하도록 만들 수 있습니다. 방법을 살펴보겠습니다.

#include <iostream>
using namespace std;

struct demo
{
	//array declared inside structure
	int arr[100];
};

struct demo func(int n) //return type is struct demo
{
	struct demo demo_mem; //demo structure member declared
	for(int i=0;i<n;i++)
	{
		//array initialisation
		demo_mem.arr[i] = i;
	}
	return demo_mem; //address of structure member returned
}

int main() 
{
	struct demo a;
	int n=5; //number of elements
	
	a=func(n); //address of arr
	
	cout<<"The Array is : ";
	for(int i=0;i<n;i++)
	{
		cout<<a.arr[i]<<"\t";
	}
	
	return 0;
}

산출:

Array is: 0     1       2       3       4

여기에서 demo 구조 내부에 arr 배열을 선언했음을 주목하십시오. 그리고 이번에는 함수가 구조체 자체의 반환 유형을 가지며 배열 대신 demo_mem(구조 변수)을 반환합니다.

이와 같이 다른 구조 변수 a를 사용하여 main() 함수에서 배열 arr에 액세스할 수 있습니다.

3. std::array 사용

C++의 std::array의 경우 함수에서 배열 이름을 반환하면 실제로 함수 호출 사이트로 반환되는 전체 배열로 변환됩니다.

#include <iostream>
#include<array>
using namespace std;

std::array<int,5> func() //function with return type std::array
{
    std::array<int,5> f_array; //array declared
    
	for(int i=0;i<5;i++)
	{
		//array initialisation
		f_array[i] = i;
	}

    return f_array; //array returned
}

int main() 
{
	std::array<int,5> arr; //array with length 5
	
	arr=func(); //function call
	
	cout<<"The Array is : ";
	for(int i=0;i<5;i++)
	{
		cout<<arr[i]<<"\t";
	}
	
	return 0;
}

산출:

Array is: 0     1       2       3       4

따라서 func() 함수에 의한 배열 반환이 성공적이라는 것이 출력에서 분명합니다.

결론

따라서 이 자습서에서는 C++ 함수에서 배열을 반환할 수 있는 다양한 방법에 대해 배웠습니다.

추가 질문이 있으시면 아래 의견을 자유롭게 사용하십시오.

참조

  • 함수에서 C++ 반환 배열 - StackOverflow 질문,
  • C++의 2차원 배열 - Journal Dev Post.

 

array container 멤버 함수 정리

가정 : array<int, 10> arr = {1,2,3,4,5,6,7,8,9,10};으로 arr 변수 명을 사용했다고 가정

함수 이름함수 설명함수 원형
arr.begin()배열의 맨 첫번째 원소를 가리킴 (iterator와 사용)iterator begin() noexcept;
arr.end()배열의 맨 마지막 "다음" 원소를 가리킴 (with iterator)iterator end() noexcept;
arr.rbegin()배열을 거꾸로 했을때 첫번째 원소를 가리킴(with iterator)reverse_iterator rbegin() noexcept;
arr.rend()배열을 거꾸로 했을때 마지막의 "다음" 원소를 가리킴 (with iterator)reverse_iterator rend() noexcept;
arr.cbegin(), cend()위쪽 begin, end와 같지만 const가 붙어서 iterator를 이용해서 원소를 수정할 수 없음const_iterator --() noexcept;
arr.crbegin(), crend()위와 동일const_reverse_iterator --() nocept;
arr.front()배열의 맨 앞의 원소를 반환reference front();
arr.back()배열의 맨 뒤의 원소를 반환reference back();
arr.data()
배열의 포인터 타입으로 반환(배열의 첫번째 주소를 반환)value_type* data() noexcept;
arr.fill(val)배열의 인자를 val으로 다 바꿔줌void fill(const value_type& val);
arr.swap(arr2)arr2의 배열 인자와 arr의 인자들을 교체
(이때, 길이와 타입이 같아야함)
void swap(array& arr) noexcept....;
arr.at(N)N번째 인자를 반환reference operator ar(size_type n);
arr[N]N번째 인자를 반환reference operator[](size_type n);
arr.empty()
비어있는지 확인constexpr bool empty() noexcept;
arr.max_size()
배열의 최대 사이즈를 반환(size와 같음)constexpr size_type max_size() noexcept;
arr.size()
배열의 사이즈를 반환(max_size와 같음)constexpr size_type size() noexcept;