Я видел, как вы задали несколько вопросов об этом сейчас, поэтому я хочу показать вам разницу между изменением размера динамического массива c и использованием std::vector
, который упаковывает все необходимые вам функции. в блоке динамического размера непрерывной памяти.
Следующий код показывает, как увеличить динамический массив c для хранения пользовательского ввода. Мы не знаем, как долго пользователь хочет вводить цифры, поэтому мы должны постоянно изменять размеры каждый раз, когда они вводят новый номер.
int number = 0;
std::size_t array_size = 0; // we need to track the size of the thing
int *array = nullptr; // nothing in here yet
std::cout << "Enter a number, non-number to exit: ";
while (std::cin >> number)
{
// we need to request more memory
++array_size;
int *new_array = new int[array_size];
// we have to copy the old array to the new array
// fun note: as pointed out in the comments below, using memcpy on
// either src or dest == nullptr is undefined behavior. Just goes to
// show how hard it is to get something like this correct.
// Don't do this when we have perfectly good STL containers!
std::memcpy(new_array, array, (array_size - 1) * sizeof(int));
// delete the old array, if it exists (we can safely call delete on a nullptr)
delete[] array;
// assign the new block of memory to array
array = new_array;
// add the retrieved element to array
array[array_size - 1] = number;
std::cout << "Enter a number, non-number to exit: ";
}
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
// output the array
for (std::size_t i = 0; i < array_size; i++)
{
std::cout << array[i] << "\n";
}
// all done, delete the memory that was allocated
delete[] array;
array = nullptr; // not strictly required, but can prevent us from accidentally deleting the same block of memory twice, which would be bad
Мы можем сделать то же самое, используя std::vector
:
int number;
std::vector<int> vec; // this is a vector that holds ints, it tracks its own size and memmory
std::cout << "Enter a number, non-number to exit: ";
while (std::cin >> number)
{
vec.push_back(number); // all done
std::cout << "Enter a number, non-number to exit: ";
}
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
for (std::size_t i = 0; i < vec.size(); i++)
{
std::cout << vec[i] << "\n";
}
// or we can used range-based for loops, which are awesome
for (auto& v : vec)
{
std::cout << v << "\n";
}
Обратите внимание, что в примере std::vector
я выводил содержимое std::vector
дважды, просто чтобы показать, что у нас есть опция для перебора вектора, который недоступен для int *
. Нам не нужно отслеживать память. Нам не нужно new
и delete
. Когда текущая область действия программы выходит (например, если это функция), вызывается деструктор std::vector
, который очищает память для нас.
ИСПОЛЬЗОВАТЬ ВЕКТОРЫ !!!