Const указатели мелкой копии

0

можно скопировать

MyStruct * const * array1

в

MyStruct * array1

но как мелкая копия? Мне нужно отсортировать его и записать обратно в него, и я хочу, чтобы изменения в массиве 1 тоже

EDIT: Im глупо, я упустил ** в array1, тогда это имеет смысл.

Теги:
sorting
const
shallow-copy

2 ответа

0

Наверное, вы имеете в виду const MyStruct * array1?

В любом случае вы можете использовать const_cast для изменения константы указателя:

const MyStruct * array1;
MyStruct * array2 = const_cast<MyStruct *>(array1);

Или

const MyStruct * const array1;
MyStruct * array2 = const_cast<MyStruct *>(array1);
  • 0
    Вопрос о MyStruct*const , а не о const MyStruct* . const_cast<> совершенно не нужен.
0

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

Может быть, вы квалифицируете это как глубокую копию, даже если это мелкая копия структуры? Тогда, может быть, другой ответ лучше.


struct MyStruct {
    int i;
    int* p;
};

int j=2;

MyStruct st={ 1, &j };

int main() {

    MyStruct* parray1(&st);

    MyStruct* const* array1(&parray1);

    MyStruct * parray=new MyStruct();

    parray->i = (*array1)->i;
    parray->p = (*array1)->p;
        /*
        This is essentially the same as
        (*parray) = *(*array1);
        */

    delete parray;
}

Изменение: второй пример, как описано в комментариях к этому ответу. Здесь у нас есть неконстантный указатель, которому мы последовательно присваиваем значения указателя из array1 -указателя-указателя array1.

#include <iostream>

struct MyStruct {
    int i;
    int* p;
};

int j=2;

MyStruct st1={ 1, &j }, st2={ 2, &j };

int main() {

    MyStruct* parray1[2] = {&st1, &st2};

    MyStruct* const *array1(parray1);

    std::cout << array1[0]->i << ' ' << array1[1]->i << '\n';

    MyStruct* parray=array1[0];

    parray->i = 3;

    parray=array1[1];

    parray->i = 4;

    std::cout << array1[0]->i << ' ' << array1[1]->i << '\n';

    return 0;
}

Соответствующий вывод:

1 2
3 4

После последних комментариев (я думаю) мы достигли общей интерпретации вопроса. Указатели в массиве const должны быть скопированы в не-const-массив, где они могут быть перегруппированы и объекты могут быть изменены.

#include <iostream>
#include <algorithm>

struct MyStruct {
    int i;
    int* p;
};

int j=2;

MyStruct st1={ 1, &j }, st2={ 2, &j };

int main() {

    MyStruct* parray1[2] = {&st1, &st2};

    MyStruct* const *array1(parray1);

    std::cout << array1[0]->i << ' ' << array1[1]->i << '\n';

    MyStruct* parray[2];

    std::copy(array1,array1+sizeof(parray)/sizeof(parray[0]),parray);

    // some manipulation:
    std::swap(parray[0],parray[1]);

    parray[0]->i = 3;

    parray[1]->i = 4;

    std::cout << array1[0]->i << ' ' << array1[1]->i << '\n';

    return 0;
}

Новый выход:

1 2
4 3
  • 0
    если я изменю i и p в parray, то изменится ли он и в array1?
  • 0
    Нет, не будет. Но * p в массиве1 изменится, если вы измените * p в * parray. Это из-за мелкой копии самого массива.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню