Я использую MS VC 2008 и для некоторых проектов компилятор Intel C ++ 11.0. Действительно ли стоит использовать tr1 функции в производстве? Они останутся в новом стандарте?
Например, теперь я использую stdext::hash_map
. TR1 определяет std::tr1::unordered_map
. Но в реализации MS unordered_map
просто их stdext::hash_map
, templatized в другом отношении.
Мой совет - использовать псевдоним для пространства имен, содержащего элементы TR1, которые вы используете. Таким образом, вы сможете "перейти" от использования версии TR1 к стандартной версии, когда ваш компилятор будет ее поддерживать.
namespace cpp0x = std::tr1;
cpp0x::unordered_map<std::string, int> mymap;
для компилятора C++0x первая строка становится:
namespace cpp0x = std;
а остальное можно не трогать.
Да, все, что находится в tr1, останется там. останется там. Некоторые вещи будут приняты в std::, но они останутся в tr1 тоже. Так что ни один из ваших кодов не сломается, когда новый стандарт будет закончен.
Простите меня: нет, не сломаются. Как описано здесь:
В предложение были добавлены два примечания, чтобы дать понять пользователям, что при переходе от TR к будущим стандартам компоненты TR не останутся в пространстве имен std::tr1, а конфигурационные макросы исчезнут.
Но стоит отметить, что поставщики компиляторов, готовые поддерживать tr1 сейчас, скорее всего, не будут вырывать землю у вас из-под ног и предоставят вам какой-то способ перехода.
Для tr1::unordered_map
имейте в виду, что существует множество различных реализаций хэш-карт, и что реализация, выбранная стандартом, является вполне классической... но может быть не самой эффективной для вашей конкретной задачи.
К сожалению, стандарт не требует реализации нескольких стратегий (хотя я полагаю, что это потребовало бы довольно много работы).
unordered_map
будет в новом стандарте, hash_map
не будет. Обратите внимание, что пространство имен tr1
также не является стандартным.
Подавляющее большинство библиотечного кода, который будет добавлен в C ++ 0x, уже довольно давно присутствует в Boost C ++ Libraries . Я настоятельно рекомендую использовать Boost (например, boost :: unordered_map ), поскольку он работает с очень большим количеством компиляторов ISO C ++ 1998 и будет продолжать работать (возможно, используя встроенную реализацию компилятора) на C + + 0x компиляторы. Кроме того, вам не нужно менять пространство имен - тогда как одобренные элементы в std :: tr1 будут перемещены в std - поскольку они всегда будут доступны в boost ::, и вам не придется беспокоиться о том, какие элементы tr1 вошли в стандарт. Короче говоря, Boost - это то, что вам нужно.