Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
slipp1
13 / 12 / 1
Регистрация: 09.11.2012
Сообщений: 367
Записей в блоге: 1
#1

templates, STL - C++

10.10.2013, 12:11. Просмотров 1472. Ответов 43
Метки нет (Все метки)

ПЕРВОЕ средства обобщенного программирования в С++ (templates)
ВТОРОЕ библиотека STL, контейнеры и алгоритмамы STL

в чем разница первого и второго?

спасибо.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.10.2013, 12:11     templates, STL
Посмотрите здесь:

Variadic Templates - C++
проблема только в переводе на русский, обычно это "Шаблоны с переменным числом аргументов" но такое длинное выражение долго не проживёт....

Variadic templates - C++
как можно сделать чтобы функция принимала бесконечное количество объектов std::string? (только их) я пробовал вот так: template<const...

Variadic templates - C++
1. как можно сделать чтобы передавались ссылки на переменные? (с variadic templates) 2. как вообще обращаться к переменным объявленным...

Variadic templates - C++
А как бы так исхитриться, чтобы шаблонная функция, использующая Variadic templates узнала размер передаваемых ей параметров с тем, чтобы,...

Templates внутри класса - C++
Добрый день!! Я новичок в Си ++. Никак не могу разобраться в синтаксисе. Помогите пожалуйста, а если можете, подскажите как лучше исполнить...

Перегрузка операторов и templates - C++
Добрый вечер!! Разбираюсь дальше с классами и шаблонами. Никак не получается создать класс Матрица. Знаю, что в интернете полно...

Generic inheritance. Templates - C++
Код компилируется. Не могу разобраться то ли я как не правильно иерархию построил то ли компилятор глючит. Вообщем если я пишу в...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
10.10.2013, 12:21     templates, STL #2
В том, что первое (шаблоны) - инструмент самого языка, а второе (STL) - написанный код с использованием этого и других инструментов этого языка. Очень советую избегать шаблонов там, где только можно. И с осторожностью использовать стороннии библиотеки на STL. Они, часто, очень мощные, но сами по себе шаблоны не торт.
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 320
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
10.10.2013, 12:39     templates, STL #3
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Очень советую избегать шаблонов там, где только можно. И с осторожностью использовать стороннии библиотеки на STL. Они, часто, очень мощные, но сами по себе шаблоны не торт.
Это че это? Использование шаблонов увеличивает время компиляции, однако уменьшает время выполнения (естественно я имею ввиду вычисления на этапе компиляции).
Любую возможность языка стоит использовать там где это нужно, что понятно. Но "избегать" некую возможность языка (причем далеко не самую плохую) это, простите, бред.
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
10.10.2013, 20:52     templates, STL #4
Цитата Сообщение от ForEveR Посмотреть сообщение
Это че это? Использование шаблонов увеличивает время компиляции, однако уменьшает время выполнения (естественно я имею ввиду вычисления на этапе компиляции).
Любую возможность языка стоит использовать там где это нужно, что понятно. Но "избегать" некую возможность языка (причем далеко не самую плохую) это, простите, бред.
Потому что возможность очень даже хреновая. Я долго не замечал, как это удобно программировать БЕЗ шаблонов. Это как глоток свежего воздуха. Реализация шаблонов в C++ не без... багов. Я уже смирился с тем багом, но только усугубляет и так не очень хорошее положение. Идею многократного использования кода можно решить и без использования шаблонов, а лишь используя наследование и инкапсуляцию.

Что я вообще несу?.. Окей, закроем глаза на "баг". Просто используем шаблон.
C++
1
template <typename T> class List { /***/ };
А теперь попробуем отнаследоваться:
C++
1
template <typename T> class LinkedList : public List <T> { /***/ };
Вроде жить можно. Не очень красиво, но жить можно. Только... Что произошло с неперегруженными реализациями?.. Упс...
Окей, не забываем, что в C++ нет никакой рефлексии, и мы не можем посмотреть на типы в шаблоне. А код. Ну что за код?.. Он некрасив. Ладно, к этому тоже можно привыкнуть.

Но ко всему сразу?.. ИМХО, нужно просто избегать шаблонов там, где они не нужны. А не нужны они почти всегда.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
10.10.2013, 21:00     templates, STL #5
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Что произошло с неперегруженными реализациями?..
А что с ними произошло?
Кстати, о каком баге идет речь?
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
10.10.2013, 21:03     templates, STL #6
Цитата Сообщение от castaway Посмотреть сообщение
А что с ними произошло?
ЕМНИП, когда мне пришлось такое сотворить, компилятор не нашёл реализации конкретно для этого класса. Вылечилось переходом к чистому наследованию.
Имхо, в Java сделал более качественная объектная модель. Не холивара и оффтопа ради, а лишь ради сравнения с Си++.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
10.10.2013, 21:04     templates, STL #7
Цитата Сообщение от AnyOne697 Посмотреть сообщение
ЕМНИП, когда мне пришлось такое сотворить, компилятор не нашёл реализации конкретно для этого класса. Вылечилось переходом к чистому наследованию.
Может, вы просто не знаете как это правильно сделать?
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
10.10.2013, 21:09     templates, STL #8
Цитата Сообщение от castaway Посмотреть сообщение
Может вы просто не знаете как это сделать?
Может просто не стоит заставлять делать из кодовой базы помойку. Засовывать 1k строк кода для реализации предка (это всё header), в другой заголовочный файл с уже более чем 1k строк кода мне совсем не хотелось. Тем более, что предок в ближайшей перспективе должен был иметь ещё несколько детей.

Перейдя на чистую объектную модель мы ускорили время компиляции более чем в 5 раз (производительность снизилась в пределах погрешности). К тому же, количество кода в заголовчных сократилась в 10 раз (хоть за счёт и расширения cpp-файлов, но им 2k это нормально).

Собственно, мы просто применили этот инструмент неправильно. Вот и всё.
castaway
Эксперт С++
4881 / 3017 / 370
Регистрация: 10.11.2010
Сообщений: 11,076
Записей в блоге: 10
Завершенные тесты: 1
10.10.2013, 21:21     templates, STL #9
Вы в каменном веке живете? Что за претензии к размерам заголовочных файлов.., ко времени компиляции? Вы компилируете 10 программ в секунду не ради производительности программы а ради 10 компиляций в секунду?
По-моему ваши утверждения чистой воды бредовые. Шаблоны дают дополнительный функционал языку. Пользоваться ими или не пользоваться - ваше личное мнение, но судить о том нужны ли они или нет по-моему уже просто глупо.
Убежденный
Системный программист
Эксперт С++
15296 / 6928 / 1096
Регистрация: 02.05.2013
Сообщений: 11,337
Завершенные тесты: 1
10.10.2013, 21:24     templates, STL #10
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Я долго не замечал, как это удобно программировать БЕЗ шаблонов. Это как глоток свежего воздуха. Реализация шаблонов в C++ не без... багов. Я уже смирился с тем багом, но только усугубляет и так не очень хорошее положение. Идею многократного использования кода можно решить и без использования шаблонов, а лишь используя наследование и инкапсуляцию.
Вы не могли бы привести пример того, как должен выглядеть программный
интерфейс list без шаблонов, используя только наследование и инкапсуляцию ?
Разумеется, должна быть поддержка любых типов. Только не говорите, что
будете делать это через макросы или приведения к <void *> - ни за что не
поверю, что это и есть "чистая объектная модель".
kamre
126 / 130 / 4
Регистрация: 25.12.2011
Сообщений: 443
10.10.2013, 21:51     templates, STL #11
Цитата Сообщение от AnyOne697 Посмотреть сообщение
в Java сделал более качественная объектная модель
Загнали в жесткие рамки, где все наследуется от Object, нет user-defined value types (aka structs), где кривые generics (из-за чего приходится или copy-paste кода делать или боксить примитивные типы). Это называется "качественная объектная модель"?

А если с этой качественной моделью нужна хоть какая-то сравнимая с C/C++ производительность, то всю эту модель посылают куда подальше и работают с ByteBuffer.
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
10.10.2013, 22:06     templates, STL #12
Цитата Сообщение от Убежденный Посмотреть сообщение
Вы не могли бы привести пример того, как должен выглядеть программный
интерфейс list без шаблонов, используя только наследование и инкапсуляцию ?
Разумеется, должна быть поддержка любых типов. Только не говорите, что
будете делать это через макросы или приведения к <void *> - ни за что не
поверю, что это и есть "чистая объектная модель".
Всё очень просто. Пришлось правда сделать Complex -> Real -> Integer -> Unsigned -> Object.
Ну и банальное:
C++
1
2
3
4
5
6
class List {
public:
    virtual void put ( Object o, uint i = 0 );
    virtual Object get ( uint i );
    /***/
}
Сравнения заявлены в Object.
Не стоит сразу так кидаться палками. Я уже говорил, что время полной компиляции уменьшилось в 5 раз. С 70 часов до 12 часов. Имхо, это очень и очень существенно. В случае инкрементальной сборки, то сильно зависит от количества изменений их локации. При небольших изменениях в 3-4 относительно новых файлах (не в глубокой иерархической ( . )) собирается за секунды. Против от минуты до часа.
Из проблем - огромное количество кастов. Обобщений здесь нет и приходиться творить огород. Был даже сделать специальный кастер - темплейтовая штука, которая делает это чуть удобнее. Но она нигде не наследуется, а её использования необязательно. Почти как Java.
И уйдите подальше от камней. Да, почти как Java. Были вполне объективные причины не использовать Java. Наконец, было потрачено огромное количество времени на переписывание с нуля библиотек, ограничения в использовании буста и прочего. Но 12 часов собирается вместе с библиотекой. Да и писали мы по мере необходимости нередко быстро оборачивая шаблонный аналог, а потом переписывая оптимальнее. Если я правильно знаю, то до сих пор пишеться.

Вас, наверное, интересует производительность. Вот здесь я просто убился об стенку, когда узнал, как плохо написана библиотека. Поразительно, но заменив красно-чёрные деревья на куда более интересные декартовы деревья (они были немного изменены), произоводительность деревьев возрасла раза в 3, хоть разница и падала с ростом дерева. Но. Требовалось забить 2.5 гигабайта памяти, чтобы std:set работал быстрее нашего Set.
_stealth_
16 / 16 / 1
Регистрация: 07.06.2012
Сообщений: 100
10.10.2013, 22:10     templates, STL #13
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Собственно, мы просто применили этот инструмент неправильно. Вот и всё.
ну да, вот от сюда и проблемы. а например какие проблемы от std::string? ведь это же typedef басикстринга. или у буста в optonal? shared_ptr - очень удобно... наследование от шаблона ОЧЕНЬ сильно замедляет компиляцию. а вот юзанье шаблона типа shared_ptr почти не замедляет, глюков никаких..
slipp1
13 / 12 / 1
Регистрация: 09.11.2012
Сообщений: 367
Записей в блоге: 1
10.10.2013, 22:12  [ТС]     templates, STL #14
отето вы Пацаны розвели
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.10.2013, 22:19     templates, STL
Еще ссылки по теме:

C++11::templates::compilation failure - C++
Почему не компилируется. Объяснить. template&lt; unsigned v = 10 &gt; class a { public: class b { std::vector&lt; char &gt; seq; int...

Result_of + variadic templates - C++
Как здесь можно вывести возвращаемый тип функторов? res_t должен получиться типом которым они параметризуются.template &lt;typename ... F&gt; ...

Ошибка: templates may not be 'virtual' - C++
Здравствуйте форумчане. Какими способами можно избежать этой ошибки? ошибка: templates may not be 'virtual' class IObject { ...

Variadic templates fail - C++
Здравствуйте. У меня проблема, нужно реализовать в проекте функционал, который будет использовать шаблоны с переменным количеством...

Passing member functions into templates - C++
Привет. Вот так передаю member-function в шаблон: #include &lt;iostream&gt; #include &lt;typeinfo&gt; template&lt;typename T, typename U&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
10.10.2013, 22:19     templates, STL #15
Цитата Сообщение от _stealth_ Посмотреть сообщение
наследование от шаблона ОЧЕНЬ сильно замедляет компиляцию
Спасибо, КО. Я про то и говорю. К слову, generics почти не замедляют компиляцию. А может даже ускоряют =)
Цитата Сообщение от kamre Посмотреть сообщение
Загнали в жесткие рамки, где все наследуется от Object, нет user-defined value types (aka structs), где кривые generics (из-за чего приходится или copy-paste кода делать или боксить примитивные типы). Это называется "качественная объектная модель"?
И?.. user-defined value types? Вы
смеётесь. Класс - да, он похож на user-defined value types. А структура - банальный агрегатор данных. Впрочем, в Си++ что-то странное сотворили со структурами от чего они стали... Запутанными.
Цитата Сообщение от _stealth_ Посмотреть сообщение
например какие проблемы от std::string? ведь это же typedef басикстринга
А какие проблемы от std::string? Почти никаких. Мы лишь отнаследовали String от std::string и Object. Ну почти "лишь", но суть была в этом.
Вообще, беспредметный разговор. Лично я понимаю, что инструмент мощный. Но. Опасный и неудобный. Это как сравнивать острозаточенный нож без ручки (templates) с новенькой электробритвой (generics). Первым хоть и можно овощей нарезать, да и побриться, но вторым бриться удобнее и практичней.
Yandex
Объявления
10.10.2013, 22:19     templates, STL
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru