Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

templates, STL - C++

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

А если с этой качественной моделью нужна хоть какая-то сравнимая с C/C++ производительность, то всю эту модель посылают куда подальше и работают с ByteBuffer.
1
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
10.10.2013, 22:06 #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.
0
_stealth_
16 / 16 / 1
Регистрация: 07.06.2012
Сообщений: 100
10.10.2013, 22:10 #13
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Собственно, мы просто применили этот инструмент неправильно. Вот и всё.
ну да, вот от сюда и проблемы. а например какие проблемы от std::string? ведь это же typedef басикстринга. или у буста в optonal? shared_ptr - очень удобно... наследование от шаблона ОЧЕНЬ сильно замедляет компиляцию. а вот юзанье шаблона типа shared_ptr почти не замедляет, глюков никаких..
0
slipp1
13 / 12 / 1
Регистрация: 09.11.2012
Сообщений: 367
Записей в блоге: 1
10.10.2013, 22:12  [ТС] #14
отето вы Пацаны розвели
0
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
10.10.2013, 22:19 #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). Первым хоть и можно овощей нарезать, да и побриться, но вторым бриться удобнее и практичней.
0
10.10.2013, 22:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.10.2013, 22:19
Привет! Вот еще темы с ответами:

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

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

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 { ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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