Мне нужно написать некоторые функции, возвращающие диапазоны в массиве (вы можете, если хотите, предположить, что они указаны в качестве начальной позиции и длины). Я не могу вернуть кортеж, поэтому мне нужно вернуть какой-то другой тип (и, возможно, это хорошая идея в любом случае). Теперь я хотел бы вернуть что-то, что является (несколько) стандартным и не влечет за собой снижения производительности из-за vtables, извилистых ctors и т. Д.
Варианты, которые приходят на ум:
std::pair<unsigned>
(или же std::pair<size_t>
).unsigned
с (или size_t
«S).Я пытался найти подходящий класс Range, но не смог его найти. Странно, что ничего в стандартной библиотеке / STL не использует класс для диапазонов.
Есть ли лучшие альтернативы? А если нет, что из вышеперечисленного вы бы порекомендовали?
Основная причина, по которой трудно ответить, состоит в том, что неясно, для каких ситуаций будет использоваться диапазон. Даже вы, вероятно, еще точно не знаете.
В подобных ситуациях я рекомендую создать свой собственный класс, потому что это делает вас гибким. Вы можете добавлять функции-члены и вложенные определения типов по мере необходимости.
Если, в конце концов, когда все варианты использования понятны и все функции-члены и вспомогательные функции определены, оказывается, что его можно заменить парой, вы все равно можете заменить класс на typedef
,
Для внутреннего типа я бы порекомендовал итераторы над целыми числами, если только вы не хотите хранить огромное количество этих диапазонов (в этом случае важна оптимизация пространства, а два целых числа (смещение + длина) помогут сэкономить пространство).
Лично я бы написал отдельный класс для диапазона. Без виртуальных вызовов не будет практически никаких накладных расходов на вызов соответствующих методов, и вы сможете свободно определять внутренние методы для операций, специфичных для диапазона, таких как объединение, пересечение, сдвиг, зажим и т. Д.
Мне нужно написать некоторые функции, возвращающие диапазоны в массиве (вы можете, если хотите, предположить, что они указаны в качестве начальной позиции и длины).
Похоже, вам нужно сгруппировать пару итераторов.
Я не могу вернуть кортеж, поэтому мне нужно вернуть какой-то другой тип (и, возможно, это хорошая идея в любом случае).
Не уверен, почему вы не можете вернуть кортеж, но вы можете попробовать вернуть пару итераторов, или (если вы не можете вернуть std::pair
) создание собственной структуры вокруг пары итераторов.
Теперь я хотел бы вернуть что-то, что является (несколько) стандартным и не влечет за собой снижения производительности из-за vtables, извилистых ctors и т. Д.
Пара итераторов звучит хорошо 🙂
(и я звучу как битая запись)
Я пытался найти подходящий класс Range, но не смог его найти. Странно, что ничего в стандартной библиотеке / STL не использует класс для диапазонов.
Есть повышение :: диапазон, если вы можете использовать повышение. Вы можете бросить свой собственный, если вам не разрешено его использовать. Я бы просто использовал пару итераторов (: ->)
[…] Есть ли лучшие альтернативы? А если нет, что из вышеперечисленного вы бы порекомендовали?
Да: используйте пару итераторов: он совместим со стандартом, он быстр, он идиоматичен, он не страдает от сложной конструкции или накладных расходов vtables и безопасен. Это также следует принципу наименьшего удивления.