Да и нет.
1. Локальный массив: нет, но вы легко можете найти размер
Если у вас есть локальный массив (int numbers[4] = {1, 2, 3, 4];
), тогда вы можете сделать size = sizeof(numbers) / sizeof(int)
.
2. Указатель на массив: совсем нет, вы должны передать размер отдельно
Если у вас есть указатель на массив (int* numbers = new int[4];
), вы не сможете определить размер, если не будете следить за ним самостоятельно. (или если в случае строки c она завершается нулем, но вам придется перебирать ее, что является линейным временем выполнения ...)
Обратите внимание, что я не верю, что указатель на массив является правильной терминологией, на самом деле у вас просто есть указатель на первый элемент массива, но выделено место для нескольких значений. Не уверен, как это называется. Может быть, просто указатель?
3. Контейнеры STL: Да, и вы можете сделать некоторые для магии цикла, используя итераторы, или просто использовать индексы, получив размер
Если у вас есть вектор (std::vector<int> v(3, 0);
), вы можете выполнить итерацию по нему следующими способами:
C ++ 11:
auto it = v.begin();
for (auto it = v.begin(); it != v.end(); it++)
{
UseElement(*it);
}
Или, по-видимому (также C ++ 11, спасибо jrok):
for (const int& i : v) { UseElement(i); }
C ++ (до 11):
std::vector<int>::iterator it;
for (it = v.begin(); it != v.end(); it++)
{
UseElement(*it);
}
или используя индексы:
for (int i = 0; i < v.size(); i++)
{
UseElement(v[i]);
}
Кроме того, вы можете использовать указатели функций или функторы с контейнерами STL, используя алгоритм std for_each (#include <algorithm>
), например:
void foo(int i)
{
std::cout << i;
}
{
std::for_each(myvector.begin(), myvector.end(), foo);
}