Найти длину массива в C++
В этой статье мы узнаем о различных способах определения длины массива в C++.
По сути, когда мы говорим о длине массива, на самом деле мы имеем в виду общее количество элементов, присутствующих в соответствующем массиве. Например, для массива, как показано ниже:
int array1[] =
Размер массива или длина массива здесь равна общему количеству элементов в нем. В данном случае это «5».
Способы найти длину массива в C++
Теперь давайте посмотрим на различные способы, с помощью которых мы можем найти длину массива в C++, они следующие:
- Поэлементный подсчет
- begin() и end() , функция
- sizeof() , Функция
- size() в STL,
- Указатели.
Теперь давайте обсудим каждый метод один за другим с примерами и подробно.
1. Поэлементный подсчет
Обход по заданному массиву и одновременный подсчет общего количества пройденных элементов может дать нам длину массива, верно?
Но для обхода мы не можем использовать цикл for напрямую, если заранее не знаем длину массива. Эту проблему можно решить, используя простой цикл for-each. Внимательно посмотрите на приведенный ниже код.
#include #include using namespace std; int main() < int c; int arr[]=; cout cout
The array is: 1 2 3 4 5 6 7 8 9 0 The length of the given Array is: 10
Здесь, как мы сказали, мы проходим через весь массив arr, используя цикл for-each с итератором i. Одновременно увеличивается счетчик c. Наконец, когда обход завершен, c содержит длину данного массива.
2. Использование begin() и end()
Мы также можем вычислить длину массива, используя функции стандартной библиотеки begin() и end() . Две функции возвращают итераторы, указывающие на начало и конец соответствующего массива соответственно. Внимательно посмотрите на данный код,
#include #include using namespace std; int main() < //Given Array int arr[] = < 11, 22, 33, 44 >; cout
The Length of the Array is : 4
Следовательно, здесь, как мы видим, разница между возвращаемыми значениями двух функций end() и begin() дает нам размер или длину данного массива, привязка . То есть в нашем случае 4.
3. Использование функции sizeof() для определения длины массива в C++
Оператор sizeof() в C++ возвращает размер переданной переменной или данных в байтах. Точно так же он возвращает общее количество байтов, необходимых для хранения массива. Следовательно, если мы просто разделим размер массива на размер, получаемый каждым его элементом, мы можем получить общее количество элементов, присутствующих в массиве.
Давайте как это работает
#include #include using namespace std; int main() < //Given array int arr[] = ; int al = sizeof(arr)/sizeof(arr[0]); //length calculation cout
The length of the array is: 3
Как мы видим, мы получаем желаемый результат.
4. Использование функции size() в STL
У нас есть функция size() , определенная в стандартной библиотеке, которая возвращает количество элементов в данном контейнере (массив в нашем случае).
#include #include using namespace std; int main() < //Given array arrayarr< 1, 2, 3, 4, 5 >; //Using the size() function from STL cout
The length of the given Array is: 5
По желанию, мы получаем вывод, как показано выше.
5. Использование указателей для определения длины массива в C++
Мы также можем найти длину данного массива с помощью указателей. Давайте посмотрим, как
#include #include using namespace std; int main() < //Given array int arr[6] = ; int len = *(&arr + 1) - arr; //*(&arr + 1) is the address of the next memory location // just after the last element of the array cout
The length of the array is: 6
Выражение *(arr+1) дает нам адрес области памяти сразу после последнего элемента массива. Следовательно, разница между ним и начальным местоположением массива или базовым адресом (arr) дает нам общее количество элементов, присутствующих в данном массиве.
Заключение
Итак, в этом уроке мы обсудили различные методы определения длины массива в C++. Несмотря на то, что с каждым из приведенных выше примеров легко работать, мы предпочитаем тот, в котором используется цикл for-each. Не только из-за удобочитаемости кода, но и из-за его кросс-платформенной надежности.
Если у вас возникнут дополнительные вопросы, не стесняйтесь использовать комментарии ниже.
Рекомендации
- Как найти длину массива? – Вопрос о переполнении стека,
- цикл for-each в C++ — сообщение JournalDev.
Длина массива в функции с++
Ваш вопрос настолько популярен, что попал даже в FAQ по языку C: [1], [2].
Дело в том, что в параметрах функций массивы «превращаются» в указатели. Поэтому ваше объявление функции ничем не отличается от
int myfunc(int* arr)
Вы можете проверить, что в вашей функции sizeof(arr) даёт размер указателя (на современных архитектурах обычно 4 или 8).
Практический выход: передавайте длину массива отдельным параметром.
Отслеживать
ответ дан 24 мая 2016 в 20:28
207k 28 28 золотых знаков 293 293 серебряных знака 526 526 бронзовых знаков
В си++ не обязательно так. Можно размер массива упихать в аргумент шаблона, как делает std::end .
25 мая 2016 в 1:55
@Qwertiy: в C++ можно просто использовать std::vector .
25 мая 2016 в 7:07
В Си++ можно использовать шаблонную функцию, в которой размер станет параметром шаблона. В любом случае, так не стоит делать, т. к. это не позволит использовать функцию с динамическими массивами.
#include using namespace std; template void f(typed (&a)[n]) < for (size_t q=0; qint main() < int a[] = ; char s[] = "Just a string"; double b[] = ; f(a); f(b); f(s); return 0; >
Отслеживать
ответ дан 25 мая 2016 в 2:01
123k 24 24 золотых знака 126 126 серебряных знаков 303 303 бронзовых знака
В C тоже можно, через указатель на массив. Как и в C++ через ссылку, без шаблона.
25 мая 2016 в 5:05
@ixSci, но без шаблонов придётся руками копипастить (ну или дефайнить) по функции на каждый размер. Да ещё под разными именами, т. к. перегрузки там тоже нет.
25 мая 2016 в 11:30
Я не говорил, что это удобно 🙂 Просто так можно сделать, вот и всё. А у Вас написано, что в C это никак не сделать, что формально неверно.
25 мая 2016 в 14:44
@ixSci, но это будет не одна функция (впрочем, шаблонная после компиляции тоже не будет одной), и выбирать между функциями придётся программисту, а не компилятору. Так что это совсем не то.
25 мая 2016 в 17:33
В теле функции вы можете узнать длинну массива из передаваемого по соседству аргумента:
int foo(int *buffer, const size_t bufferSize)
Интересней же вопрос о том как возвращать массив из функции. Для этих целей в C++11 появился std::array , который является ничем иным, как оберткой над обычными статическими буферами, которая, среди прочего, содержит метод size().
Отслеживать
ответ дан 25 мая 2016 в 7:00
8,656 1 1 золотой знак 16 16 серебряных знаков 32 32 бронзовых знака
А зачем пометили bufferSize как const ?
25 мая 2016 в 7:53
@ixSci подчеркиваю семантику переменной.
25 мая 2016 в 9:42
@free_ze тогда почему не int * const buffer ? 🙂
25 мая 2016 в 12:59
@alexolut можно и так. Вас не смущает, что точки стоят в теле функции?)
25 мая 2016 в 14:50
@free_ze Если Вы хотите сказать, что . подразумевают возможность изменять данные по указателю, то при int * const buffer это тоже будет возможно (это же не const int * buffer ). Но при этом остается единообразность при подчеркивании семантики переменной. Как нельзя изменить bufferSize , так нельзя изменить и buffer .
25 мая 2016 в 15:02
Как вариант - использовать vector и получать размер массива с помощью arr.size()
Отслеживать
ответ дан 24 мая 2016 в 23:55
125 1 1 серебряный знак 11 11 бронзовых знаков
тогда лучше std::array , вектор это динамический массив.
25 мая 2016 в 5:06
@ixSci std::array не позволит передавать в функцию массивы разной длины.
25 мая 2016 в 13:08
@alexolut, добавить шаблон и будет принимать.
25 мая 2016 в 14:43
@ixSci шаблон породит уже семейство функций.
25 мая 2016 в 14:45
@alexolut, какая разница для пользователя функции?
25 мая 2016 в 14:45
Столкнулся с данной проблемой сегодня, но всё-таки нашёл выход. Длинну массива можно определить с помощью такой функции:
int getLength(char text[]) < int arrayLength=0; for(int i=0;text[i];i++)< arrayLength++; >return arrayLength; > int main(void)
Также для возврата массива в функцию достаточно написать char * перед названием функции.
Отслеживать
4,306 14 14 золотых знаков 42 42 серебряных знака 93 93 бронзовых знака
ответ дан 3 фев 2018 в 4:08
Нет. У вас в функции делается определение длины С-строки, а не длины массива. Длина строки никакого отношения к длине передаваемого массива в общем случае не имеет. О каком "возврате массива в функцию" вы ведете речь и при чем он здесь - не ясно. Это не говоря уже о том, что на вопросе стоит тег [C++], а в С++ передавать строковый литерал "Symbols" как char * уже давно запрещено.
Array.length
Свойство length объекта, который является экземпляром типа Array , устанавливает или возвращает число элементов этого массива. Значение данного свойства 32-битное безнаковое целое число, которое всегда численно больше чем самый наибольший индекс в массиве.
var items = ["shoes", "shirts", "socks", "sweaters"]; items.length; // возвращает 4
Синтаксис
arr.length
Описание
Свойство length является целым числом с положительным знаком и значением, меньшим чем 2 в степени 32 (232).
var namelistA = new Array(4294967296); //2 в 32 степени = 4294967296 var namelistC = new Array(-100); //отрицательная величина console.log(namelistA.length); //RangeError: Invalid array length console.log(namelistC.length); //RangeError: Invalid array length var namelistB = []; namelistB.length = Math.pow(2, 32) - 1; //устанавливает длину массива меньше 2 в 32 степени console.log(namelistB.length); //4294967295
В любой момент вы можете установить свойство length для обрезки массива. Когда вы расширяете массив, изменяя его свойство length , реальное количество элементов в массиве увеличивается; например, если вы установите свойство length в 3, когда оно равно 2, массив будет из 3 элементов, где значение третьего элемента будет равно undefined .
var arr = [1, 2, 3]; printEntries(arr); arr.length = 5; // устанавливает длину массива 5. printEntries(arr); function printEntries(arr) var goNext = true; var entries = arr.entries(); while (goNext) var result = entries.next(); if (result.done !== true) console.log(result.value[1]); goNext = true; > else goNext = false; > console.log("=== printed == token punctuation">); > // 1 // 2 // 3 // === printed === // 1 // 2 // 3 // undefined // undefined // === printed ===
Таким образом, свойство length ничего не говорит о количестве определённых значений в массиве. Также смотрите раздел Взаимосвязь свойства length с числовыми свойствами.
| Атрибуты свойства Array.length | |
|---|---|
| Записываемое | да |
| Перечисляемое | нет |
| Настраиваемое | нет |
Примеры
Пример: итерирование по массиву
В следующем примере массив numbers итерируется до значения свойства length , показывающего, сколько элементов содержит массив. Значение каждого элемента удваивается.
var numbers = [1, 2, 3, 4, 5]; for (var i = 0; i numbers.length; i++) numbers[i] *= 2; > // Массив numbers теперь равен [2, 4, 6, 8, 10];
Пример: сокращение массива
Следующий пример сокращает массив statesUS до длины в 50 элементов, если текущая длина массива больше 50.
if (statesUS.length > 50) statesUS.length = 50; >
Спецификации
| Specification |
|---|
| ECMAScript Language Specification # sec-properties-of-array-instances-length |
Совместимость с браузерами
BCD tables only load in the browser
Смотрите также
Found a content problem with this page?
- Edit the page on GitHub.
- Report the content issue.
- View the source on GitHub.
This page was last modified on 4 авг. 2023 г. by MDN contributors.
Your blueprint for a better internet.
MDN
Support
- Product help
- Report an issue
Our communities
Developers
- Web Technologies
- Learn Web Development
- MDN Plus
- Hacks Blog
- Website Privacy Notice
- Cookies
- Legal
- Community Participation Guidelines
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998– 2024 by individual mozilla.org contributors. Content available under a Creative Commons license.
Как узнать длину массива
Массив представляет набор однотипных данных. Формальное определение массива выглядит следующим образом:
тип_переменной название_массива [длина_массива]
После типа переменной идет название массива, а затем в квадратных скобках его размер. Например, определим массив из 4 чисел:
int numbers[4];
Число элементов массива также можно определять через константу:
const int n = 4; int numbers[n]; // содержит 4 элемента
Некоторые компиляторы (например, G++) также поддерживают установку размера с помощью переменных.
Данный массив имеет четыре числа, но все эти числа имеют неопределенное значение. Чтобы установить значения элементов массива, указываются фигурные скобки (инициализатор), внутри которых перечисляются значения для элементов массива:
int numbers[4] <>; //
В данном случае фигурные скобки пусты, поэтому все элементы массива получают нулевые значения.
Также мы можем указать конкретные значения для всех элементов массива:
int numbers[4] ;
В данном случае в памяти выделяется некоторая область из четырех ячеек по 4 байта (размер типа int), где каждая ячейка содержит определенный элемент массива:
Если значений в инициализаторе меньше, чем элементов в массиве, то значения передаются первым элементам, а остальные получают нулевые значения:
int numbers[4] ; //
Если значений в инициализаторе больше, чем элементов в массиве, то при компиляции возникнет ошибка:
int numbers[4] ; // ! Ошибка
Здесь массив имеет размер 4, однако ему передается 6 значений.
Если размер массива не указан явно, то он выводится из количества переданных значений:
int numbers[] ;
В данном случае в массиве есть 6 элементов.
При этом не допускается присвоение одному массиву другого массива:
int nums1[] ; int nums2[] = nums1; // ошибка
Индексы. Получение и изменение элементов массива
После определения массива мы можем обратиться к его отдельным элементам по индексу. Индексы начинаются с нуля, поэтому для обращения к первому элементу необходимо использовать индекс 0. Обратившись к элементу по индексу, мы можем получить его значение, либо изменить его. Например, получим второй элемент (индекс 1):
int n = numbers[1];
Изменение значения второго элемента:
numbers[1] = 123;
Например, получим и изменим значения элементов:
#include int main() < int numbers[4]; int first = numbers[0]; // получаем первый элемент std::cout
При обращении по индексу следует учитывать, что мы не можем обратиться по несуществующему индексу. Так, если в массиве 4 элемента, то мы можем использовать индексы с 0 до 3 для обращения к его элементам. Использование любого другого индекса приведет к ошибке:
int numbers[4]; int forth = numbers[4]; // !Ошибка - в массиве только 4 элемента
Константные массивы
Если необходимо, чтобы нельзя было изменять значения элементов массива, то такой массив можно определить как константный с помощью ключевого слова const
const int numbers[4]; // numbers[1] = 23; // ошибка - значения элементов массива изменить нельзя
Длина массива
Длина массива не всегда бывает известна. Однако может потребоваться получить ее. Для этого можно использовать несколько способов. Первый способ, который пришел из языка С, представляет применение оператора sizeof :
#include int main() < int numbers[]; std::cout
По сути длина массива равна совокупной длине его элементов. Все элементы представляют один и тот же тип и занимают один и тот же размер в памяти. Поэтому с помощью выражения sizeof(numbers) находим длину всего массива в байтах, а с помощью выражения sizeof(numbers[0]) - длину одного элемента в байтах. Разделив два значения, можно получить количество элементов в массиве.
Второй способ представляет применение встроенной библиотечной функции std::size() :
#include int main() < int numbers[]; int count = std::size(numbers); std::cout
Перебор массивов
Используя циклы, можно пробежаться по всему массиву и через индексы обратиться к его элементам:
#include int main() < const int n = 4; int numbers[n] ; for(int i=0; i < n; i++) < std::cout >
Чтобы пройтись по массиву в цикле, надо знать его длину. Здесь длина задана константой n.вначале надо найти длину массива. И в цикле for перебираем все элементы, пока счетчик i не станет равным длине массива. В итоге на консоль будут выведены все элементы массива:
11 12 13 14
Другой пример - вычислим сумму элементов массива:
#include int main() < int numbers[]; int sum <>; for (int i <>; i < std::size(numbers); sum += numbers[i++]); std::cout
Здесь длина массива вычисляется динамически - с помощью функции std::size() .
Перебор элементов в стиле for-each
Используем другую форму цикла for , которая предназначена специально для перебора последовательностей, в том числе для массивов
#include int main() < int numbers[4] ; for(int n : numbers) < std::cout >
При переборе массива каждый перебираемый элемент будет помещаться в переменную number, значение которой в цикле выводится на консоль.
Если нам неизвестен тип объектов в массиве, то мы можем использовать спецификатор auto для определения типа:
for(auto n : numbers)
Ввод значений массива с консоли
Подобно тому, как вводятся данные для отдельных переменных, можно вводить значения для отдельных элементов массива. Например, пусть пользователь вводит значения числового массива:
#include int main() < const int max ; // максимальная длина массива - не больше 6 чисел int numbers[max]; // массив для ввода чисел int i<>; // счетчик введенных чисел std::cout > numbers[i]; // вводим число i++; > // выводим массив for (i =0; i < max; ++i) < std::cout std::cout
Здесь в цикле сначала вводятся шесть чисел для каждого элемента массива, затем выводим этот массив.