Стоит ли использовать std :: tr1 в производстве? - PullRequest
6 голосов
/ 08 марта 2010

Я использую MS VC 2008 и для некоторых проектов компилятор Intel C ++ 11.0. Стоит ли использовать функции tr1 в производстве? Останутся ли они в новом стандарте?

Например, сейчас я использую stdext::hash_map. TR1 определяет std::tr1::unordered_map. Но в реализации MS unordered_map это просто их stdext::hash_map, шаблонизированные по-другому.

Ответы [ 5 ]

9 голосов
/ 08 марта 2010

Да, все, что есть в tr1, будет оставайся там. Некоторые вещи будут принято в std ::, но они останутся в tr1 тоже. Так что ни один из вашего кода сломается, как только новый стандарт завершено.

Прости меня: нет, они не будут. Как описано здесь :

В предложение было добавлено два примечания, чтобы пользователям было ясно, что при переходе от TR к будущим стандартам компоненты TR не останутся в пространстве имен std :: tr1, а макросы конфигурации исчезнут.

Но стоит отметить, что поставщики компиляторов, желающие сейчас поддерживать tr1, скорее всего, не будут вырывать землю из-под ваших ног и предоставят вам какой-то метод перехода.

6 голосов
/ 08 марта 2010

Мой совет - использовать псевдоним для пространства имен, содержащего элементы TR1, которые вы используете. Таким образом, вы сможете «перейти» от использования версии TR1 к стандартной версии, если ваш компилятор ее поддерживает.

namespace cpp0x = std::tr1;

cpp0x::unordered_map<std::string, int> mymap;

для компилятора C ++ 0x, первая строка становится:

namespace cpp0x = std;

и вы можете оставить остальное в покое.

5 голосов
/ 08 марта 2010

unordered_map будет в новом стандарте, hash_map не будет. Обратите внимание, что пространство имен tr1 также не является стандартным.

2 голосов
/ 08 марта 2010

Подавляющее большинство библиотечного кода, который будет добавлен в C ++ 0x, уже давно существует в Boost C ++ Libraries . Я настоятельно рекомендую использовать Boost (т.е. boost :: unordered_map ), поскольку он работает на очень большом количестве компиляторов ISO C ++ 1998 и будет продолжать работать (возможно, с использованием встроенной реализации компилятора) на C + + 0x компиляторы. Кроме того, вам не нужно менять пространство имен - тогда как одобренные элементы в std :: tr1 будут перемещены в std - так как он всегда будет доступен в boost ::, и вам не придется беспокоиться о том, какие элементы tr1 сделали это в стандарт. Короче говоря, Boost - это путь.

1 голос
/ 08 марта 2010

Для tr1::unordered_map следует помнить, что существует множество различных реализаций Hash Maps и что реализация, выбранная стандартом, является довольно классической ... но может быть не самой эффективной для вашей конкретной задачи.

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

...