Как я могу изменить порядок 2 объектов в массиве? - PullRequest
0 голосов
/ 02 ноября 2019

Итак, у меня есть массив 3 размера. Объявлен как:

Bucket* bucket = new Bucket[size]();

И у меня есть функция, которая печатает адрес каждого сегмента:

printBucket(Bucket* tempBucket)
{
cout << "Address is:" << tempbucket << endl;
}

Допустим, он выводит (для всех сегментов):

1st bucket address:015650DC
2nd bucket address:015650E8
3rd bucket address:015650F4

Я хотел бы заменить второе ведро на третье, поэтому я создал эту функцию:

Bucket* changeBucket(Bucket* buckets, int first, int second)
{

    Bucket* temp = new Bucket();
    temp = &buckets[first];
    buckets[first] = buckets[second];
    buckets[second] = *temp;
    return buckets;
}

После того, как я вызову эту функцию, выходные адреса остаются прежними:

1st bucket address:015650DC
2nd bucket address:015650E8
3rd bucket address:015650F4

Что я хочу, чтобы вывод был:

1st bucket address:015650DC
2nd bucket address:015650F4
3rd bucket address:015650E8

Ответы [ 2 ]

0 голосов
/ 02 ноября 2019

Проблема здесь в том, что вы меняете содержимое двух элементов массива, но не можете (и не можете) изменить адреса элементов массива.

Когда вы создаете массив с Bucket* bucket = new Bucket[size]();, вы создаете блок памяти, достаточно большой для размещения size объектов типа Bucket. Это будет непрерывный блок памяти, где любой элемент может быть доступен с помощью оператора [], так что bucket[2] будет ссылаться на третий (индексы начинаются с нуля) элемента.

Итак, когда вы вызываете функцию changeBucket, вы изменяете содержимое двух элементов массива. Вы не изменяете адреса тех элементов, которые всегда будут фиксированными относительно первого элемента (который сам определяется операцией new[]).

Если выможет изменить адреса, тогда это лишит законной силы всю концепцию массива, потому что то, что вам кажется, нужно, чтобы выражение типа bucket[2] затем ссылалось на второй элемент, а не на третий - и это явно неприемлемо дляосновные принципы c++ программирования.

В качестве альтернативы, вы можете искать массив указателей на сегменты - в котором каждый элемент массива указывает наобъект;в этом случае вы можете (юридически) поменять местами эти указатели. Я могу предоставить некоторые изменения кода, если это то, что вы хотите сделать.

Не стесняйтесь просить дальнейших разъяснений и / или объяснений.

0 голосов
/ 02 ноября 2019

Вы пробовали просто:

Bucket* changeBucket(Bucket* buckets, int first, int second)
{

Bucket temp;
temp = buckets[first];
buckets[first] = buckets[second];
buckets[second] = temp;
return buckets;
}

И вы также можете изменить прототип на "void", изменения, которые вы делаете в массиве, являются постоянными (массивы являются указателями в конце)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...