Каждый массив имеет фиксированный размер, который является частью его типа и не может быть изменен:
#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