, если я определю пространство имен log
где-нибудь и сделаю его доступным в глобальной области видимости, это будет конфликтовать с double log (double)
из стандартного cmath
заголовок. На самом деле, похоже, что большинство компиляторов согласны с этим - большинство версий SunCC, MSVC, GCC - но GCC 4.1.2 нет.
К сожалению, похоже, нет способа разрешить двусмысленность, поскольку используя Объявления
недопустимы для идентификаторов пространства имен. Знаете ли вы, как я могу записать log :: Log
в глобальном пространстве имен, даже если включен cmath
?
Спасибо.
EDIT : Кто-нибудь знает что об этом говорится в стандарте C ++ 03? Я бы подумал, что оператор области в достаточной степени устраняет неоднозначность использования log
в приведенном ниже примере кода.
Мой наивный подход был бы val l = List (1,2,3,4,3)
def isUniqueList (l: List [Int]) = (new HashSet () ++ l) .size == l.size ...
У меня есть несортированный список, и я хочу знать, все ли в нем элементы уникальны.
Мой наивный подход был бы
val l = List(1,2,3,4,3)
def isUniqueList(l: List[Int]) = (new HashSet()++l).size == l.size
По сути, я проверяю, имеет ли набор, содержащий все элементы списка, одинаковый размер (поскольку элемент, появляющийся дважды в исходном списке, будет отображаться в наборе только один раз), но я не уверен, является ли это идеальным решением этой проблемы.
Изменить:
Я проверил 3 самых популярных решения: l == l.distinct
, l.size == l.distinct.size
и решение Алексея на основе HashSet.
Каждая функция запускалась 1000 раз с уникальным списком из 10 элементов, уникальным списком из 10 000 элементов и теми же списками с одним элементом, появляющимся в третьем квартале, скопированным в середину списка. Перед каждым запуском каждая функция вызывалась 1000 раз для разогрева JIT, весь тест запускался 5 раз, прежде чем время было взято с помощью System.currentTimeMillis.
Это была машина C2D P8400 (2,26 ГГц) с 3 ГБ ОЗУ, java-версия была 64-битной серверной виртуальной машиной OpenJDK (1.6.0.20). Аргументы java были -Xmx1536M -Xms512M
Результаты:
l.size==l.distinct.size (3, 5471, 2, 6492) l==l.distinct (3, 5601, 2, 6054) Alexey's HashSet (2, 1590, 3, 781)
Результаты с более крупными объектами (строки от 1 КБ до 5 КБ):
l.size==l.distinct.size MutableList(4, 5566, 7, 6506) l==l.distinct MutableList(4, 5926, 3, 6075) Alexey's HashSet MutableList(2, 2341, 3, 784)
Решение с использованием HashSets определенно является самым быстрым и, как он уже указал, использует. размер не имеет большого значения.