Как разрешить конфликт имен между пространством имен C ++ и глобальной функцией?

, если я определю пространство имен 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 определенно является самым быстрым и, как он уже указал, использует. размер не имеет большого значения.

10
задан tstenner 9 October 2010 в 15:43
поделиться