Допустим у меня есть два массива по 5 объектов класса Obj. Я хочу поместить эти объекты из разных массивов в один результирующий, размерностью 10 элементов. Как правильно выделить под него память? Если я напишу вот так:
Obj* result_arr = new Obj[10];
или вот так
Obj result_array[10];
а затем цикл:
for (int i = 0; i < 5; i++) {
result_arr[i] = arr1[i];
result_arr[i + 5] = arr2[i];
}
то получится так, что у меня 10 раз вызовется конструктор класса Obj, если такой есть, при этом созданные объекты не будут никак использоваться. А если его нет, то вообще будет ошибка компиляции. Единственное что мне пришло в голову это написать вот так
Obj* result_arr = malloc(sizeof(Obj) * 10);
но это же колхоз. Как то можно сделать это красиво в С++ стиле? И как vector справляется с подобной задачей? Ведь он добавляет элементы в уже зарезервированную область памяти.
Готового решения для такого специального случая, как "инициализировать массив из нескольких отдельных диапазонов", нет. Так что в вашем случае остается лишь выделение "сырой" памяти с последующим std::uninitialized_copy
void *raw = std::aligned_alloc(alignof(Obj), sizeof(Obj) * 10);
Obj *arr = static_cast<Obj *>(raw);
std::uninitialized_copy_n(arr1, 5, arr);
std::uninitialized_copy_n(arr2, 5, arr + 5);
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
При попытке запуска для дебага (F5, брекпойнт поставлен) кода на C++ в Visual Studio Code (ОС Ubuntu 1804) возникает ошибка
Делаю функцию, преобразовывающую номер из номера из "+7(9хх)хх-ххх-хх" в "89ххххххххх"