мы можем проверить размер динамического массива во время выполнения

0

Я создаю массив размера int arr[50]; но я буду вставлять в него значение во время компиляции, например, мое решение будет вставлять в него 10 значений после выполнения некоторой функции (может появиться другое количество значений). Теперь во второй части моей программы мне нужно пройти через массив, как it should iterate <= total values of array как в int arr[50] моя программа сохраняет 10 значений, она должна переходить к ней только 10 раз, но как я могу получить, что в этом массиве всего 10 значений.

arr[50]=sum;
for (int ut=0; ut<=arr[100].length();ut++)

Хотя я знаю, что ut<=arr[100].length() неверен, но его просто предположение, эта функция будет работать, если я разрешу условие таким образом.

Редактировать:

Я знаю, что мы можем использовать вектор, но я просто рассматриваю этот тип вещей, используя массив.

Спасибо за ответ

  • 6
    Используйте вектор. Для того, чтобы избежать накладных расходов на изменение размера на push_back , вы можете вызвать reserve на него первым.
  • 0
    Нет, нет способа проверить, сколько элементов массива было инициализировано.
Показать ещё 7 комментариев
Теги:
arrays

1 ответ

2
Лучший ответ

Прежде всего, массив, который вы показываете, не является "динамическим массивом". Он создан в стеке; это автоматическая переменная.

Для вашего конкретного примера вы можете сделать что-то вроде этого:

int arr[50];
// ... some code
int elem_count = sizeof(arr) / sizeof(arr[0]);

В этом случае часть sizeof(arr) вернет общий размер массива в байтах, а sizeof(arr[0]) вернет размер одного элемента в байтах.

Тем не менее, массивы C-стиля имеют свою долю проблем. Я не говорю, что никогда их не используют, но имейте в виду, что, например, они приспосабливаются к указателям, когда они передаются как аргументы функции, а решение sizeof выше дает вам ответ, отличный от того, который вы ищете, потому что он return sizeof(int*).

Что касается реальных динамически распределенных массивов (где все, что у вас есть, является указателем на этот массив), объявляется следующим образом:

int *arr = new int[50];
// ... do some stuff
delete [] arr;

то sizeof(arr) также даст вам размер int* в байтах, который не является тем размером, который вы ищете.

Итак, по мере того, как предлагались комментарии, если вы ищете удобный контейнер произвольного доступа, в котором вы хотите удобно и дешево отслеживать размер, используйте std::vector или даже std::array.

ОБНОВИТЬ

Чтобы использовать std::array для получения эквивалентного кода в вашем вопросе:

std::array<int, 50> arr;

а затем использовать его как обычный массив. Имейте в виду, что делать что-то вроде arr[100] не будет проверять границы, но по крайней мере вы можете получить размер массива с помощью arr.size().

  • 0
    как использовать std :: array в этом случае? Вы можете просто дать подсказку?
  • 0
    Я обновил ответ, чтобы добавить объяснение
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню