C ++ Сортировка массива константных указателей на структуры

У меня есть функция сортировки:

void countingSort(TPhone * const * array, int count) {

// some code

// making copy od array
TPhone * const * arrayCopy = new TPhone * [count];

for(int i = 0; i < count; i++) {
arrayCopy[i] = array[i];
}

for(int i = 0; i < count; i++) {
int index = // some function to determine where to place array[i]
array[index] = arrayCopy[i];
}
}

Я опустил детали об алгоритме сортировки, потому что проблема в другом. Дело в том, что есть проблема с объявлением arrayCopy,

на линии

arrayCopy[i] = array[i]
...
array[index] = arrayCopy[i];

я получаю это сообщение об ошибке

error: assignment of read-only location ‘*(arrayCopy + ((sizetype)(((long unsigned int)i) * 8ul)))’
error: assignment of read-only location ‘*(array + ((sizetype)(((long unsigned int)index) * 8ul)))’

Там должно быть что-то не так с const использование в декларации, но я не знаю, как это исправить …

0

Решение

Прочитайте объявления const и указателя справа налево:

TPhone * const * arrayCopy
^   ^   ^   ^    ^
|   |   |   |    \---- arrayCopy is a
|   |   |   \------------ pointer to
|   |   \------------------- const
|   \-------------------------- pointer to
\--------------------------------- TPhone

Таким образом, arrayCopy — это массив постоянных указателей (как и массив). Постоянные указатели не могут быть перемещены (то есть вы не можете изменить где они указывают). Таким образом, вы не можете перезаписать их, и, следовательно, вы не можете их отсортировать.

Если вам нужен массив указателей на постоянный TPhone (то есть вы не можете изменить поля TPhone, но можете перемещать указатели вокруг), тогда вам следует переместить const:

pointer to constant TPhone:
TPhone const *   // right-to-left

array of pointer to constant TPhone:
TPhone const * []   // right-to-left
but since arrays can't easily be passed to functions, you can use a pointer:
TPhone const * *   // right-to-left

Тогда вы можете изменить указатели (которые являются просто адресами памяти), но вы не можете изменить фактические объекты TPhone.

3

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

Других решений пока нет …

По вопросам рекламы [email protected]