Нужно ли массиву строк максимальное измерение в c ++? - PullRequest
0 голосов
/ 16 декабря 2018

Нужно ли объявлять максимальное измерение массива или есть способ иметь масштаб массива при добавлении элементов?

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

Каждый массив имеет фиксированный размер, который является частью его типа и не может быть изменен:

#include <cstddef>

int main() 
{ 
  const std::size_t sz = 5;
  int iarr[sz];
  return 0;
}

Здесь размер массива равен 5, то есть он содержит максимум 5 элементов.Попытка добавить больше не определена:

iarr[5] = 10; // undefined 

Хотя поведение не определено, если вы попытаетесь назначить вне пределов, компилятор не будет вас сдерживать.Таким образом, вам нужно структурировать свой код таким образом, чтобы избежать таких случаев:

for (std::size_t i = 0; i != sz; ++i)
{
  iarr[i] = 10;
}

Этот код здесь совершенно законный и вполне вероятный, что вы обычно хотите.Но если вы используете C ++ 11 или более позднюю версию, вы можете использовать цикл for на основе диапазона и заставить компилятор беспокоиться о размере:

for (auto &elm : iarr)
{
  elm = 10;
}

В этом примере делается то же самое.

Сказав это, лучше всего всегда использовать std :: vector .Используя векторный объект, вам не нужно беспокоиться о размере контейнера, и вы можете просто продолжать добавлять элементы:

#include <vector>

int main() 
{
  std::vector<int> ivec;

  for (std::size_t i = 0; i != 5; ++i) // you may replace 5 any with non-negative integer
  {
    ivec.push_back(10);
  }
  return 0;
}

После сбора всех необходимых элементов, перебирая векторный объект, чтобы увидетьвсе его элементы снова очень легко возможны с помощью цикла for на основе диапазона:

#include <iostream>
#include <vector>
#include <string>
#include <cstddef>

int main() 
{
  std::vector<std::string> svec;

  for (std::size_t i = 0; i != 5; ++i)
  {
    svec.push_back("hello");
  }

  for (const auto &elm : svec)
  {
    std::cout << elm << std::endl;
  }

  return 0;
}

Вывод:

hello
hello
hello
hello
hello
0 голосов
/ 16 декабря 2018

Массивы имеют фиксированный размер, определенный во время компиляции.Так что да, если вы используете массив, то вам нужно будет создать ряд элементов, которые, вероятно, не будут превышены, но в то же время не являются чрезмерными.Хотя для оценки верхнего предела может быть полезно просмотреть возможные варианты использования и наборы данных, зачастую трудно придумать жесткий верхний предел просто потому, что никто не может видеть будущее.

Кроме того, вам придется отслеживать количество элементов, которые фактически заняты, и, поскольку вы, как правило, не можете быть полностью уверены в каком-либо практическом верхнем пределе, вам все равно придется проверять, не превышает ли размер массива.

По этой причине рекомендуется использовать std::vector, который отслеживает количество его элементов и выделяет новую память по мере необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...