sharkster
@sharkster

Как создать копию массива значений и массива указателей без std?

Не могу разобраться как сделать копию такой структуры:

struct Node {
private:
    int *keys_;
    int min_degree_;
    Node **children_;
    int count_;
    bool is_leaf_;
    ...

Ну с половиной понятно:

Node(Node const &node) {
    min_degree_ = node.min_degree_;
    is_leaf_ = node.is_leaf_;
    count_ = node.count_;
    ...
}

А как сделать копию без массива значений(int *keys_) и массива указателей(Node **children_) без std не понятно. Изначальный объект надо удалить, поэтому сслыки можно скопировать, хотя не уверен.
  • Вопрос задан
  • 699 просмотров
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Чтобы скопировать массив можно воспользоваться memcpy, или делать это циклом.

Массив указателей от массива значений не отличается ничем. Просто там значения - это указатели. Аккуратно не допустите ошибки при использовании sizeof - если ему передать сам массив (указатель), то это будет размер указателя, а не всего массива. Надо брать размер одного элемента и домножать на их количество.

Если изначальный объект можно удалить, то вам надо переопределить оператор перемещения, а не копирования. Внутри ваши массивы - это просто указатели и их можно перемещать как переменные:
keys_ = node.keys_;
node.keys_ = nullptr;


Не забудьте изначальное место затереть нулевым указателем, чтобы нечайнно потом два раза не удалить.

Так делать при копировании нельзя - ибо вы создаете несколько указателей на один и тот же массив и вообще непонятно, кто потом должен это удалять. Только при перемещении.

Когда вы определили оператор перемещения (или конструктор перемещения), то далее оберните элемент источник в std::move() при присваивании или передаче в конструктор. Тогда вызовется действительно перемещающий метод.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы