Edit: C++ 11 đã được giới thiệu từ câu trả lời này đã được viết, và nó bao gồm các chức năng để thực hiện chính xác những gì tôi hiển thị bên dưới: std::begin
và std::end
. Các phiên bản Const std::cbegin
và std::cend
cũng đi vào một phiên bản tương lai của tiêu chuẩn (C++ 14?) Và có thể đã có trong trình biên dịch của bạn rồi. Thậm chí không cân nhắc việc sử dụng các chức năng của tôi bên dưới nếu bạn có quyền truy cập vào các chức năng tiêu chuẩn.
Tôi muốn xây dựng một chút trên
Benoît's answer. Thay vì chỉ chuyển địa chỉ bắt đầu của mảng dưới dạng con trỏ, hoặc con trỏ cộng với kích thước như những người khác đã gợi ý, hãy lấy một gợi ý từ thư viện chuẩn và chuyển hai con trỏ tới đầu và cuối của mảng đó. Điều này không chỉ làm cho mã của bạn giống như C++ hiện đại hơn, mà bạn có thể sử dụng bất kỳ thuật toán thư viện chuẩn nào trên mảng của bạn!
template<typename T, int N>
T * BEGIN(T (& array)[N])
{
return &array[0];
}
template<typename T, int N>
T * END(T (& array)[N])
{
return &array[N];
}
template<typename T, int N>
const T * BEGIN_CONST(const T (& array)[N])
{
return &array[0];
}
template<typename T, int N>
const T * END_CONST(const T (& array)[N])
{
return &array[N];
}
void
foo(int * begin, int * end)
{
printf("arr : %x\n", begin);
printf ("sizeof arr: %d\n", end - begin);
}
int
main()
{
int arr[] = {1, 2, 3, 4};
printf("arr : %x\n", arr);
printf ("sizeof arr: %d\n", END(arr) - BEGIN(arr));
foo(BEGIN(arr), END(arr));
}
Đây là định nghĩa thay thế cho BEGIN và END, nếu các mẫu không hoạt động.
#define BEGIN(array) array
#define END(array) (array + sizeof(array)/sizeof(array[0]))
Cập nhật: Đoạn mã trên với các mẫu làm việc trong MS VC++ 2005 và GCC 3.4.6, như nó phải. Tôi cần phải có một trình biên dịch mới.
Tôi cũng đang xem xét lại quy ước đặt tên được sử dụng tại đây - các chức năng mẫu giả mạo khi macro chỉ cảm thấy sai. Tôi chắc chắn rằng tôi sẽ sử dụng điều này trong mã của riêng tôi đôi khi sớm, và tôi nghĩ rằng tôi sẽ sử dụng ArrayBegin, ArrayEnd, ArrayConstBegin, và ArrayConstEnd.
Gọi thông số foo cùng tên đang làm cho điều này phản trực giác đối với bạn. Xem xét cho một tên khác mô phỏng những gì trình biên dịch đang xem xét. – ojblass