C ++ копирование и изменение размера выделенного массива, инициализированного с помощью оператора new

int* array1 = new[ 10 ]( );

Как правильно копировать этот массив? Следующее — моя попытка.

int* array2 = array1;

С учетом сказанного, является ли следующий правильный способ добавить значение в полный массив1?

int val = 2;
int* array2 = new[ 11 ]( );

for ( int i = 0; i < 10; i++ ) {
array2[ i ] = array1[ i ];
}

array2[ 10 ] = val;
delete [ ]array1;

Еще один вопрос, как мне получить количество пробелов, которые заполнены в массиве?

int* array1 = new[ 2 ];
array1[ 0 ] = 1;
// the resulting array would look like this { 1 };

Я хочу получить количество инициализированных элементов, поэтому вместо того, чтобы возвращать 2 для количества элементов, которое может содержать выделенный массив, я хочу получить, сколько элементов на самом деле имеют значение. Я хочу сделать это, чтобы я мог заменить 10 в моем предыдущем коде размером array1.

Спасибо!

РЕДАКТИРОВАТЬ: Мне нужно придерживаться массивов в стиле C из-за моего инструктора.

0

Решение

int* array2 = array1;

присваивает один указатель другому, то есть копирует адрес, сохраненный в array1 и делает array2 указать на этот адрес, а также.

Если вы хотите сделать глубокую копию, все еще используя указатели, вы можете использовать memcpy:

int* array2 = new int[10];
memcpy(array2, array1, 10 * sizeof(int));

Это ужасный подход в стиле C, который следует избегать всегда, когда это возможно.


Единственное разумное решение, которое я могу придумать, это использовать std::array или же std::vector вместо
Массивы в стиле C std::vector в отличие от массива это объект, который имеет свой собственный оператор присваивания (а также конструктор копирования), который копирует его для вас так, как вы ожидаете:

std::vector<int> vec1(10, 0);  // 10 numbers initialized to 0
std::vector<int> vec2 = vec1;  // note this actually calls copy constructor
std::vector<int> vec3(vec1);   // the same as previous line
vec3 = vec1;                   // assignment that makes a deep copy for you

Вы можете начать с пустого std::vector и продолжать толкать новые элементы к нему, используя его push_back метод и получить его размер в любой момент вызова vec.size(), Дополнительно: вы не несете ответственности за очистку памяти, в которой хранились ее элементы — если вы используете ее, как я указал в приведенном выше коде, это объекты с автоматическим сроком хранения, которые очищают память для вас, когда они выходят из области видимости. ,

2

Другие решения

Ваша первая попытка не копирует содержимое массива, она просто создает новый указатель, который указывает на начало массива.

Ваш метод добавления значения выглядит правильно.

Сам массив не помнит, каким элементам вы присвоили значения. Если вы хотите отслеживать, сколько элементов «заполнено», вам придется сделать это самостоятельно. Вы можете обернуть массив, скажем, в шаблонный класс и, возможно, вызвать его myVector,

1