728x90
반응형
당연하게도 배열을 포함하는 구조체와 구체의 배열을 사용할 수 있다.
struct Point {
int x,y
};
Point points[3] {{1,2},{3,4},{5,6}};
int x2 = points[2].x;
struct Array {
Point elem[3];
};
Array points2 {{1,2},{3,4},{5,6}};
int y2 = points2.elem[2].y;
구조체에 built-in 된 배열은 해당 객체로 취급할 수 있다. 초기화(인수 전달 및 함수 반환 포함) 및 할당에서 배열을 포함하는 구조체를 복사할 수 있다.
Array shift(Array a, Point p)
{
for (int i=0; i!=3; ++i) {
a.elem[i].x += p.x;
a.elem[i].y += p.y;
}
return a;
}
Array ax = shift(points2,{10,20});
배열의 표기법은 약간 원시적이다.
왜 i != 3 일까?
왜 .elem[i]를 계속 반복할까?
Point 유형의 요소만 사용하는 이유는 무엇일까?
std::array를 구조체로 고정 크기 배열에 대한 아이디어를 보다 완전하고 훌륭하게 개발하기 위함이다.
template<typename T, siz e_t N >
struct array { // simplified (see §34.2.1)
T elem[N];
T∗ begin() noexcept { return elem; }
const T∗ begin() const noexcept {return elem; }
T∗ end() noexcept { return elem+N; }
const T∗ end() const noexcept { return elem+N; }
constexpr size_t size() noexcept;
T& operator[](size_t n) { return elem[n]; }
const T& operator[](size_type n) const { return elem[n]; }
T ∗ data() noexcept { return elem; }
const T ∗ data() const noexcept { return elem; }
// ...
};
이 배열은 임의 유형의 임의 수의 요소를 허용하는 템플릿이다. 또한 예외 및 const 객체의 가능성을 직접 다룬다. 배열을 사용하여 이제 다음과 같이 작성할 수 있다.
struct Point {
int x,y
};
using Array = array<Point,3>; // array of 3 Points
Array points {{1,2},{3,4},{5,6}};
int x2 = points[2].x;
int y2 = points[2].y;
Array shift(Array a, Point p)
{
for (int i=0; i!=a.size(); ++i) {
a[i].x += p.x;
a[i].y += p.y;
}
return a;
}
Array ax = shift(points,{10,20});
built-in 된 배열에 대한 std::array의 주요 장점은 적절한 객체 유형(할당 등)이며 개별 요소에 대한 포인터로 암시적으로 변환하지 않는다는 것이다.
ostream& operator<<(ostream& os, Point p)
{
cout << '{' << p[i].x << ',' << p[i].y << '}';
}
void print(Point a[],int s) // must specify number of elements
{
for (int i=0; i!=s; ++i)
cout << a[i] << '\n';
}
template<typename T, int N>
void print(array<T,N>& a)
{
for (int i=0; i!=a.size(); ++i)
cout << a[i] << '\n';
}
Point point1[] = {{1,2},{3,4},{5,6}}; // 3 elements
array<Point,3> point2 = {{1,2},{3,4},{5,6}}; // 3 elements
void f()
{
print(point1,4); // 4 is a bad error
print(point2);
}
built-in 된 배열에 비해 std::array의 단점은 초기화 길이에서 요소 수를 추론할 수 없다는 것이다.
Point point1[] = {{1,2},{3,4},{5,6}}; // 3 elements
array<Point,3> point2 = {{1,2},{3,4},{5,6}}; // 3 elements
array<Point> point3 = {{1,2},{3,4},{5,6}}; // error : number of elements not given
728x90
반응형
'Program Language > C & C++' 카테고리의 다른 글
[C++] 구조체의 POD(plain old data) (0) | 2022.01.04 |
---|---|
[C++] 구조체 타입 동등성 (2) | 2022.01.03 |
[C++] 구조체와 클래스 (0) | 2022.01.03 |
[C++] 구조체 이름 (0) | 2022.01.03 |
[C++] 구조체 layout (0) | 2022.01.03 |