Какой тип я должен использовать для диапазона (индексов массива)?

Мне нужно написать некоторые функции, возвращающие диапазоны в массиве (вы можете, если хотите, предположить, что они указаны в качестве начальной позиции и длины). Я не могу вернуть кортеж, поэтому мне нужно вернуть какой-то другой тип (и, возможно, это хорошая идея в любом случае). Теперь я хотел бы вернуть что-то, что является (несколько) стандартным и не влечет за собой снижения производительности из-за vtables, извилистых ctors и т. Д.

Варианты, которые приходят на ум:

  1. std::pair<unsigned> (или же std::pair<size_t>).
  2. структура, обертывающая два unsignedс (или size_t«S).
  3. Прокатить мой собственный класс Range, покрыть его сахаром полезными методами.

Я пытался найти подходящий класс Range, но не смог его найти. Странно, что ничего в стандартной библиотеке / STL не использует класс для диапазонов.

Есть ли лучшие альтернативы? А если нет, что из вышеперечисленного вы бы порекомендовали?

2

Решение

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

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

Если, в конце концов, когда все варианты использования понятны и все функции-члены и вспомогательные функции определены, оказывается, что его можно заменить парой, вы все равно можете заменить класс на typedef,

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

2

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

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

0

Мне нужно написать некоторые функции, возвращающие диапазоны в массиве (вы можете, если хотите, предположить, что они указаны в качестве начальной позиции и длины).

Похоже, вам нужно сгруппировать пару итераторов.

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

Не уверен, почему вы не можете вернуть кортеж, но вы можете попробовать вернуть пару итераторов, или (если вы не можете вернуть std::pair) создание собственной структуры вокруг пары итераторов.

Теперь я хотел бы вернуть что-то, что является (несколько) стандартным и не влечет за собой снижения производительности из-за vtables, извилистых ctors и т. Д.

Пара итераторов звучит хорошо 🙂
(и я звучу как битая запись)

Я пытался найти подходящий класс Range, но не смог его найти. Странно, что ничего в стандартной библиотеке / STL не использует класс для диапазонов.

Есть повышение :: диапазон, если вы можете использовать повышение. Вы можете бросить свой собственный, если вам не разрешено его использовать. Я бы просто использовал пару итераторов (: ->)

[…] Есть ли лучшие альтернативы? А если нет, что из вышеперечисленного вы бы порекомендовали?

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

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector