Именование структуры словаря, которая хранит ключи в предсказуемом порядке?

Многие из существующих ответов уже касаются конструктора копирования, оператора присваивания и деструктора. Однако в посте C ++ 11 введение семантики перемещения может расширить это за пределы 3.

Недавно Майкл Клэсс выступил с докладом, который затрагивает эту тему: http://channel9.msdn.com/events/CPP/C-PP-Con-2014/The-Canonical-Class

10
задан Community 23 May 2017 в 12:01
поделиться

9 ответов

Я голосую за OrderedDictionary по следующим причинам:

«Индексированный» никогда не используется в классах Какао, за исключением одного случая. Он всегда появляется как существительное (NSIndexSet, NSIndexPath, objectAtIndex: и т. Д.). Есть только один случай, когда "Index" появляется как глагол, который находится в свойстве "indexed" NSPropertyDescription: isIndexed и setIndexed. NSPropertyDescription примерно аналогичен столбцу таблицы в базе данных, где «индексирование» означает оптимизацию для ускорения времени поиска. Следовательно, имеет смысл, если NSPropertyDescription является частью структуры Core Data, что «isIndexed» и «setIndexed» будут эквивалентны индексу в базе данных SQL. Поэтому называть его "IndexedDictionary" было бы излишним, поскольку индексы в базах данных создаются для ускорения времени поиска, но словарь уже имеет время поиска O (1). Однако называть его «IndexDictionary» также было бы неправильным употреблением, поскольку «индекс» в Какао относится к позиции, а не к порядку. Эти два семантически различны.

Я понимаю вашу озабоченность по поводу "OrderedDictionary", но прецедент уже был установлен в Какао. Когда пользователи хотят поддерживать определенную последовательность, они используют «упорядоченные»: - [NSApplication orderDocuments], - [NSWindow ordersIndex], - [NSApplication ordersWindows] и т. Д. Итак, Джон Пири в основном прав.

Однако, вы не хотите, чтобы вставка в словарь была обузой для ваших пользователей. Они захотят создать словарь один раз , а затем поддерживать в нем соответствующий порядок. Они выиграли' Я даже не хочу запрашивать объекты в определенном порядке. Спецификация порядка должна выполняться во время инициализации.

Поэтому я рекомендую сделать OrderedDictonary кластером классов с частными подклассами InsertionOrderDictionary, NaturalOrderDictionary и CustomOrderDictionary. Затем пользователь просто создает OrderedDictionary следующим образом:

OrderedDictionary * dict = [[OrderedDictionary alloc] initWithOrder:kInsertionOrder];
//or kNaturalOrder, etc

Для CustomOrderDictionary вы можете попросить их предоставить вам селектор сравнения или даже (если они используют 10.6) блок. Я думаю, это обеспечит максимальную гибкость для будущего расширения, сохранив при этом подходящее имя.

с частными подклассами InsertionOrderDictionary и NaturalOrderDictionary и CustomOrderDictionary. Затем пользователь просто создает OrderedDictionary следующим образом:

OrderedDictionary * dict = [[OrderedDictionary alloc] initWithOrder:kInsertionOrder];
//or kNaturalOrder, etc

Для CustomOrderDictionary вы можете попросить их предоставить вам селектор сравнения или даже (если они используют 10.6) блок. Я думаю, это обеспечит максимальную гибкость для будущего расширения, сохранив при этом подходящее имя.

с частными подклассами InsertionOrderDictionary и NaturalOrderDictionary и CustomOrderDictionary. Затем пользователь просто создает OrderedDictionary следующим образом:

OrderedDictionary * dict = [[OrderedDictionary alloc] initWithOrder:kInsertionOrder];
//or kNaturalOrder, etc

Для CustomOrderDictionary вы можете попросить их предоставить вам селектор сравнения или даже (если они используют 10.6) блок. Я думаю, это обеспечит максимальную гибкость для будущего расширения, сохранив при этом подходящее имя.

6
ответ дан 3 December 2019 в 22:38
поделиться

Я голосую за InsertionOrderDictionary . Вы справились.

4
ответ дан 3 December 2019 в 22:38
поделиться

После публикации этого вопроса, Я начинаю склоняться к чему-то вроде IndexedDictionary или IndexableDictionary . Хотя полезно иметь возможность поддерживать произвольный порядок ключей, ограничение его только порядком вставки кажется ненужным ограничением. Кроме того, мой класс уже поддерживает indexOfKey: и keyAtIndex: , которые (намеренно) аналогичны NSArray's indexOfObject: и objectAtIndex: objectAtIndex: . Я серьезно подумываю добавить insertObject: forKey: atIndex: , который совпадает с NSMutableArray insertObject: atIndex: .

Всем известно, что вставка в середину массива неэффективна, но это не значит, что нам нельзя разрешать редкие случаи, когда это действительно полезно. (Кроме того, реализация могла бы тайно использовать двусвязный список или любую другую подходящую структуру для отслеживания упорядочивания, если это необходимо ...)

Большой вопрос: "индексируется" или "индексируется" столь же расплывчато или потенциально запутанно, как " приказал"? Подумают ли люди об индексах баз данных, индексах книг и т. Д.? Было бы вредно, если бы они предположили, что это было реализовано с помощью массива, или это может упростить понимание пользователем функциональности?


Изменить: Это имя имеет еще больший смысл, учитывая тот факт, что я ' m рассматривает возможность добавления в будущем методов, которые работают с NSIndexSet . (NSArray имеет -objectsAtIndexes: , а также методы для добавления / удаления наблюдателей для объектов по заданным индексам.)

2
ответ дан 3 December 2019 в 22:38
поделиться

Как вы сказали в последнем абзаце, я думаю, что InsertionOrder (ed) Dict (ionary) довольно однозначен; Я не понимаю, как это можно интерпретировать иначе, как то, что ключи будут возвращены в том порядке, в котором они были вставлены.

0
ответ дан 3 December 2019 в 22:38
поделиться

Разве путем отделения индексированного порядка от порядка вставки это просто не сводится к хранению массива и словаря в одном объекте? Я полагаю, что мой голос за этот тип объекта - IndexedKeyDictionary

В C #:

public class IndexedKeyDictionary<TKey, TValue> { 

  List<TKey> _keys;
  Dictionary<TKey, TValue> _dictionary;
  ...

  public GetValueAtIndex(int index) {
    return _dictionary[_keys[index]];
  }

  public Insert(TKey key, TValue val, int index) {
    _dictionary.Add(key, val);

    // do some array massaging (splice, etc.) to fit the new key
    _keys[index] = key;
  }

  public SwapKeyIndexes(TKey k1, TKey k2) {
    // swap the indexes of k1 and k2, assuming they exist in _keys
  }
}

Что было бы действительно круто, так это индексированные значения ... так что у нас есть способ отсортировать значения и получить новый порядок ключей. Например, если бы значения были координатами графика, и мы могли бы читать ключи (имена бункеров), когда мы перемещаемся вверх / вниз по координатной плоскости. Как бы вы назвали эту структуру данных? IndexedValueDictionary?

0
ответ дан 3 December 2019 в 22:38
поделиться

На первый взгляд у меня есть первый ответ - InsertionOrderDictionary, хотя это немного двусмысленно относительно того, что на первый взгляд означает «InsertionOrder».

То, что вы описываете, звучит для меня почти так же, как карта C ++ STL. Насколько я понимаю, карта - это словарь, в котором есть дополнительные правила, включая порядок. STL просто называет это «картой», что, на мой взгляд, вполне уместно. Уловка с картой заключается в том, что вы не можете отдать должное наследованию, не сделав его избыточным, то есть "MapDictionary". Это слишком избыточно. «Карта» слишком проста и оставляет много места для неправильного толкования.

Хотя "CHMap" может быть неплохим выбором после просмотра ссылки на вашу документацию.

Может быть, "CHMappedDictionary"? =)

Удачи.

Edit: Спасибо за разъяснение, каждый день узнаешь что-то новое. =)

0
ответ дан 3 December 2019 в 22:38
поделиться

Единственная разница в том, что allKeys возвращает ключи в определенном порядке? Если так, я бы просто добавил методы allKeysSorted и allKeysOrderdByInsertion к стандартному API NSDictionary .

Какова цель этого словаря порядка вставки? Какие преимущества он дает программисту по сравнению с массивом?

-1
ответ дан 3 December 2019 в 22:38
поделиться

А как насчет KeyedArray?

1
ответ дан 3 December 2019 в 22:38
поделиться

Решительное голосование за OrderedDictionary.

Слово «заказанный» означает именно то, что вы рекламируете: что при итерации по списку элементов существует определенный порядок их выбора. «Индексированный» - это слово реализации - оно больше говорит о том, как достигается упорядочение. Индекс, связанный список, дерево ... пользователю все равно; этот аспект структуры данных должен быть скрыт. «Заказанный» - это точное слово для дополнительной функции, которую вы предлагаете, независимо от того, как вы это делаете.

Кроме того, похоже, что выбор порядка может быть на усмотрение пользователя. Есть ли причина, по которой вы не могли создать методы для вашего типа данных, которые позволяют пользователю переключаться, скажем, с алфавитного порядка на порядок вставки? В случае по умолчанию пользователь выберет конкретный порядок и придерживается его, и в этом случае реализация будет не менее эффективной, чем если бы вы создали специализированные подклассы для каждого метода упорядочивания. А в некоторых менее используемых случаях разработчик может фактически пожелать использовать любой из нескольких различных порядков для одних и тех же данных в зависимости от контекста приложения. (Я могу вспомнить конкретные проекты, над которыми я работал, где мне хотелось бы иметь такую ​​структуру данных.)

Назовите это OrderedDictionary, потому что это именно то, что есть. (Честно говоря, у меня больше проблем с использованием слова "

3
ответ дан 3 December 2019 в 22:38
поделиться
Другие вопросы по тегам:

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