Почему некоторые используют параллельные массивы вместо списков массивов? Есть ли какая-то реальная разница? [Дубликат]

  typedef struct Freqamp {double freq;  двойной усилитель;  } FREQAMP;  bool struct_cmp_by_freq (FREQAMP a, FREQAMP b) {return a.freq & lt;  b.freq;  } main () {vector & lt; FREQAMP & gt;  темп;  FREQAMP freqAMP;  freqAMP.freq = 330;  freqAMP.amp = 117,56;  temp.push_back (freqAMP);  freqAMP.freq = 450;  freqAMP.amp = 99,56;  temp.push_back (freqAMP);  freqAMP.freq = 110;  freqAMP.amp = 106,56;  temp.push_back (freqAMP);  sort (temp.begin (), temp.end (), struct_cmp_by_freq);  }  

, если сравнение ложно, оно будет «обмениваться».

6
задан zengr 18 March 2011 в 03:17
поделиться

4 ответа

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

11
ответ дан Jim Garrison 15 August 2018 в 16:12
поделиться

Классы более приятные, но если прецедент ограничен, например. один метод тела, расточительно его создавать. Если у вас есть класс Pair , вы можете специализироваться на этом, не создавая новый класс.

1
ответ дан Community 15 August 2018 в 16:12
поделиться

Единственное реальное преимущество параллельных массивов в Java - это (экстремальная) IMO, чтобы уменьшить распределение объектов и / или использование кучи. Для достаточно большой коллекции объектов 3 массива занимают меньше места И используют меньше объектов, чем один массив экземпляров какого-либо настраиваемого класса.

Этот подход обычно является плохим, поскольку он делает ваш код много более хрупким. Создание и использование пользовательского класса - лучший подход в большинстве ситуаций.

Примечание: Рекомендации по производительности для Android советуют иначе, но эти советы в основном направлены на снижение частоты / воздействия GC приостанавливает работу пользователя. И даже этот совет замаскирован несколькими способами.

12
ответ дан Stephen C 15 August 2018 в 16:12
поделиться
  • 1
    Да, это то, что нужно иметь в виду при разработке Android. Не все Android-устройства равны, а мобильные телефоны в целом ограничены. Для цитирования из «Советы по производительности» из ссылки разработчиков Android «Если вам нужно реализовать контейнер, в котором хранятся кортежи объектов (Foo, Bar), попробуйте вспомнить, что два параллельных массива Foo [] и Bar [] обычно намного лучше, чем один массив пользовательских (Foo, Bar) объектов. & quot; developer.android.com/training/articles/perf-tips.html – loeschg 7 January 2013 в 16:44

Создать представление класса / объекта, только если то, что вы пытаетесь представить, может быть лучше объяснено как объект.

Хэш-карты - еще одно решение. Например, вместо разнородных массивов для возрастов и имен, если имена уникальны, вы можете использовать имя как ключи и возраст в качестве значения.

1
ответ дан Sujoy 15 August 2018 в 16:12
поделиться
  • 1
    Карты почти так же плохи, как параллельные массивы. – Stephen C 18 March 2011 в 04:28
  • 2
    @stephan: ну, я согласен, но иногда я предпочитаю использовать карты, когда все просто :) – Sujoy 18 March 2011 в 06:07
  • 3
    Я пересмотрю это. В некоторых отношениях Карты хуже; например они неизбежно медленнее и голоднее, чем параллельные массивы и предпочтительный подход (пользовательские классы). Кроме того, подход Map становится громоздким, если у вас есть более двух атрибутов для связи ... как в этом случае. – Stephen C 11 May 2011 в 09:03
Другие вопросы по тегам:

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