HOWTO · C++
C++에서 배열 크기를 찾는 방법
이 기사는 배열의 길이를 찾는 방법을 보여줍니다.
이 페이지의 내용
C++에서 배열의 길이를 구하려면 요소 수를 세면 됩니다. 적절한 방법은 배열의 종류에 따라 다릅니다. 선언된 범위 안에 있는 내장 배열에는 sizeof를, std::array나 std::vector에는 size()를, 표준 라이브러리의 공통 함수 호출에는 std::size를 사용할 수 있습니다. 이미 순회할 수 있는 범위라면 범위 기반 for 루프로 요소 수를 셀 수도 있습니다.
범위 기반 for 루프로 C++ 배열 요소 수 세기
범위 기반 for 루프는 배열이나 그 밖의 순회 가능한 범위에 있는 요소를 하나씩 방문합니다. 방문할 때마다 카운터를 1씩 늘리면 요소 수를 셀 수 있습니다.
#include <iostream>
int main() {
int values[] = {10, 20, 30, 40, 50};
int count = 0;
for (int value : values) {
(void)value;
++count;
}
std::cout << "Element count: " << count << '\n';
}
이 방법은 values가 제공하는 범위의 요소 수를 셉니다. 원시 포인터나 동적 할당된 저장 공간의 크기를 알아내지는 못합니다. 이런 경우에는 요소 수를 별도로 보관하거나 크기를 제공하는 컨테이너를 사용하세요.
sizeof로 내장 배열의 길이 구하기
현재 범위에서 여전히 배열인 내장 배열은 전체 바이트 크기를 요소 하나의 바이트 크기로 나누면 길이를 구할 수 있습니다.
#include <iostream>
#include <cstddef>
int main() {
int values[] = {1, 2, 3, 4, 5};
const std::size_t count = sizeof(values) / sizeof(values[0]);
std::cout << "Element count: " << count << '\n';
}
sizeof(values)는 배열 전체가 차지하는 바이트 수를 반환하고, sizeof(values[0])은 요소 하나가 차지하는 바이트 수를 반환합니다. 두 값을 나눈 몫이 요소 수입니다. 예제에서 std::size_t를 사용하기 위해 <cstddef>를 포함합니다.
배열을 함수에 전달하면 이 계산으로 요소 수를 구할 수 없습니다. int values[]처럼 선언한 매개변수는 int* values로 조정됩니다. 따라서 함수 안에서 sizeof(values)는 원래 배열이 아니라 포인터의 크기를 측정합니다. 이때 나눗셈 결과는 구현의 포인터 및 요소 크기에 따라 달라지므로 이식 가능한 요소 수가 아닙니다. 요소 수를 별도로 전달하거나 컨테이너를 매개변수로 받으세요.
std::array와 std::vector에서 size() 사용하기
std::array와 std::vector는 모두 요소 수를 반환하는 size() 멤버 함수를 제공합니다. std::array는 크기가 고정된 배열을 나타내고, 벡터는 요소를 추가하거나 제거할 때 크기가 바뀔 수 있습니다.
#include <array>
#include <iostream>
#include <vector>
int main() {
std::array<int, 3> fixed{4, 8, 12};
std::vector<int> resizable{5, 10, 15, 20};
std::cout << "std::array: " << fixed.size() << '\n';
std::cout << "std::vector: " << resizable.size() << '\n';
}
사용 중인 컨테이너의 멤버 함수를 사용하세요. std::array::size()는 고정된 요소 수를 반환하고, std::vector::size()는 벡터의 현재 요소 수를 반환합니다.
std::end()와 std::begin()으로 배열 길이 구하기
내장 배열에서 std::begin은 첫 요소를 가리키고 std::end는 마지막 요소 바로 다음 위치를 가리킵니다. 두 포인터를 빼면 그 사이에 있는 요소 수를 구할 수 있습니다. 이 함수들을 사용하려면 <iterator>를 포함하세요.
#include <iostream>
#include <iterator>
int main() {
int values[] = {2, 4, 6, 8};
const auto count = std::end(values) - std::begin(values);
std::cout << "Element count: " << count << '\n';
}
두 포인터가 같은 배열 안의 위치를 가리키거나 배열의 끝 바로 다음 위치를 가리키므로 뺄셈이 유효합니다. 이 방법은 내장 배열을 다룰 때 유용합니다. std::array나 std::vector에는 보통 size() 멤버가 더 명확합니다.
std::size()로 요소 수 구하기
std::size는 요소 수를 반환하는 표준 라이브러리 함수입니다. 내장 배열과 std::array, std::vector 같은 표준 컨테이너에 사용할 수 있습니다. 사용하려면 <iterator>를 포함하세요.
#include <array>
#include <iostream>
#include <iterator>
#include <vector>
int main() {
int built_in[] = {3, 6, 9};
std::array<int, 2> fixed{7, 14};
std::vector<int> resizable{11, 22, 33, 44};
std::cout << "Built-in array: " << std::size(built_in) << '\n';
std::cout << "std::array: " << std::size(fixed) << '\n';
std::cout << "std::vector: " << std::size(resizable) << '\n';
}
멤버 함수인 size()와 달리 std::size(container)는 독립 함수 호출입니다. 지원되는 배열과 컨테이너 유형에 같은 호출 형식을 사용할 수 있으며, 각 컨테이너가 제공하는 size() 멤버도 계속 사용할 수 있습니다.
배열 유형에 맞는 방법 선택하기
- 선언된 범위 안에 있는 내장 배열에는
sizeof(array) / sizeof(array[0])또는std::size(array)를 사용하세요. std::array와std::vector에는 해당 컨테이너의size()멤버를 사용하는 편이 좋습니다. 공통 함수 호출 형식이 유용하다면std::size(container)를 사용하세요.- 주변 코드에서 반복자 뺄셈이 적절하다면
std::end(array) - std::begin(array)를 사용하세요. - 순회 가능한 범위의 요소를 직접 방문하며 세려면 범위 기반
for루프를 사용하세요. - 포인터나 동적 할당 배열을 다룰 때는 요소 수를 별도로 보관하거나 컨테이너를 사용하세요. 포인터만으로는 할당된 요소 수를 알 수 없습니다.
핵심은 바이트 단위의 저장 공간 크기와 요소 수를 구분하는 것입니다. sizeof는 바이트 수를 측정합니다. 식이 완전한 내장 배열을 계속 가리키는 동안에만 요소 하나의 바이트 크기로 나누세요. 컨테이너의 크기 함수와 반복자 뺄셈은 요소 수를 직접 반환합니다.