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

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

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

templates, STL - C++

10.10.2013, 12:11. Просмотров 1499. Ответов 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
Jupiter
Каратель
Эксперт С++
6556 / 3977 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.10.2013, 01:41 #31
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Тем более это удобно, когда внезапно возникает многопоточность.
чем шаблоны мешают многопоточности? что за хрень ты тут доказываешь?
1
kamre
126 / 130 / 4
Регистрация: 25.12.2011
Сообщений: 443
11.10.2013, 01:41 #32
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Попробуйте на Java реализовать эффективный тип данных для комплексных чисел с возможностью выбора базового типа хотя бы из float/double.
Если не считать незначительные потери на virtual-функции, то можно. Если применить джедайскую магию, тоже можно. Вообще всё можно.
Какие еще виртуальные функции? Какая еще "джедайская магия"?

Например, нужно уложить несколько миллионов комплексных чисел в контейнер и не потерять производительность при их обработке. C++ это легко позволяет сделать с помощью шаблонов (complex<T> и vector<T>) без какой-либо потери производительности вроде кучи аллокаций в heap, лишней косвенности и т.п. Все данные будут лежать одним куском в памяти и обрабатываться максимально эффективно, при этом все будет в объектах с удобным интерфейсом.

Чтобы добиться подобной производительности в Java придется полностью выбросить все абстракции и работать напрямую с массивом из double или float, где под каждое комплексное число будет отводиться два double/float. Причем даже ArrayList нельзя будет использовать для double/float из-за boxing. Не позволяют механизмы абстракции в Java получать эффективный код, слишком они там простенькие, даже в C# куда лучше будут.
1
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
11.10.2013, 01:59 #33
Цитата Сообщение от kamre Посмотреть сообщение
Какие еще виртуальные функции? Какая еще "джедайская магия"?
Например, нужно уложить несколько миллионов комплексных чисел в контейнер и не потерять производительность при их обработке. C++ это легко позволяет сделать с помощью шаблонов (complex<T> и vector<T>) без какой-либо потери производительности вроде кучи аллокаций в heap, лишней косвенности и т.п. Все данные будут лежать одним куском в памяти и обрабатываться максимально эффективно, при этом все будет в объектах с удобным интерфейсом.
Чтобы добиться подобной производительности в Java придется полностью выбросить все абстракции и работать напрямую с массивом из double или float, где под каждое комплексное число будет отводиться два double/float. Причем даже ArrayList нельзя будет использовать для double/float из-за boxing. Не позволяют механизмы абстракции в Java получать эффективный код, слишком они там простенькие, даже в C# куда лучше будут.
Такие.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
 
class Object {
    /***/
}
 
class Complex : Object {
public:
    Complex ( double r, double i );
    Complex ( double n );
    Complex ( Complex& c );
    
    /* ... operator [ *,=,-,+,/,<<,>> ... ] */
    double operator double (); // ||c||
private:
    double m_real;
    double m_img;
}
 
class List : Object {
public:
    /***/
    virtual Object put ( Object o, int i = 0 );
    virtual Object get ( int i );
    /***/
private:
    /***/
}
 
int main(void) {
    List list;
    Complex c ( 2.5, -1.3 );
    list.put ( c );
    /****/
    cout << list.put ( 3 );
    
    return 0;
}
Это набросок по памяти. Конечно, Object считал указатели и всё такое. Именно поэтому были и такие "уроды":
C++
1
2
3
4
5
6
7
8
9
class ComplexList : Object {
public:
    /***/
    Complex put ( Complex c, int i = 0 );
    Complex get ( int i );
    /***/
private:
    /***/
}
Это кажется не настолько удобным, как шаблоны. Но мы взялись реализовать собственную библиотеку. И сделали. И ничего страшного. И всё нормально. И живём пока. И вроде даже проект живёт.
И кстати, лично мне кажется это более удобным, чем шаблоны. Особенно при использовании. Как будно пишешь на выразительном скриптовом языке без кучи звёздочек и знаков меньше-больше.

Добавлено через 5 минут
Алсо, совсем забыл. Здесь получается интересная штука - можно в один лист запихать объекты разного типа. Но, как я говорил, не хватает рефлексии.
0
kamre
126 / 130 / 4
Регистрация: 25.12.2011
Сообщений: 443
11.10.2013, 02:03 #34
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Такие.
Почему захардкодили double внутри Complex? Нужна поддержка как минимум еще и float!

И уже видно, что copy-paste - это ваш метод, под каждую специализацию ручной copy-paste. Очень элегантно и эффективно. Получается, что нужно этим методом сделать ComplexDouble, ComplexFloat, ComplexDoubleList, ComplexFloatList, такой у вас подход?
0
Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
11.10.2013, 02:04 #35
а в Qt как реализованы Qcontainers?
0
MrGluck
Модератор
Эксперт CЭксперт С++
7278 / 4439 / 650
Регистрация: 29.11.2010
Сообщений: 12,018
11.10.2013, 02:04 #36
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Приходилось по особому делать копирующие конструкторы и вообще аккуратно работать с памятью
Рядом лежала вилка, но мы ели руками так как не шли на поводу орудия дьявола.

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

Цитата Сообщение от AnyOne697 Посмотреть сообщение
Впрочем, в Си++ что-то странное сотворили со структурами от чего они стали... Запутанными.
Возможно, только для вас.

Цитата Сообщение от AnyOne697 Посмотреть сообщение
Придерживаясь одной идеи нет конфликтов идей
Отныне и всегда буду есть ложкой, чтобы не вызвать конфликт инструментов.

Цитата Сообщение от AnyOne697 Посмотреть сообщение
Конечно, пример с целочисленным немного надуман. Но в общем и целом.
Все-таки признали, что пример неудачен, а ничего стоящего так и не предложили. Вывод только на конце как будто аксиома доказана.

Цитата Сообщение от AnyOne697 Посмотреть сообщение
Окей, закроем глаза на "баг"
Где баг?

Цитата Сообщение от AnyOne697 Посмотреть сообщение
Тем более это удобно, когда внезапно возникает многопоточность.
std::lock_guard<>
std::unique_lock<>
std::future<>
std::promise<>
std::packaged_task<>
не нужно!

Цитата Сообщение от AnyOne697 Посмотреть сообщение
Как будно пишешь на выразительном скриптовом языке без кучи звёздочек и знаков меньше-больше.
То бишь без комментариев и алгебры булевых функций?

Цитата Сообщение от XRuZzz Посмотреть сообщение
но смысл почему не надо использовать шаблоны не понял.
Потому что у него не получилось их использовать и решено было сделать все наперекосяк. Зато хедеры маленькие и время компиляции меньше. Мы ведь пишем программы чтобы компилировать.
2
Jupiter
Каратель
Эксперт С++
6556 / 3977 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.10.2013, 02:24 #37
Цитата Сообщение от Хулиган Посмотреть сообщение
а в Qt как реализованы Qcontainers?
на шаблонах
0
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
11.10.2013, 07:47 #38
Окей. Кажется меня здесь начинают... неправильно понимать. Подозреваю это было с самого начало.

Я не категорически против шаблонов. Я понимаю насколько мощный инструмент. Просто они меня раздражают. Мне они не нравяться, но это не значит, что я их не использую. Конечно использую, но не так активно, как это делают stl'и и бусты.

Цитата Сообщение от kamre Посмотреть сообщение
Почему захардкодили double внутри Complex? Нужна поддержка как минимум еще и float!
И уже видно, что copy-paste - это ваш метод, под каждую специализацию ручной copy-paste. Очень элегантно и эффективно. Получается, что нужно этим методом сделать ComplexDouble, ComplexFloat, ComplexDoubleList, ComplexFloatList, такой у вас подход?

Да мы переписали библиотеку. Но работа с числами интуитивна - что за бредовый ComplexFloat? А ComplexInteger? Что это за вырождение. double уже покрывает максимально возможное количество значений. Мы же не на микроконтроллеры пишем, что бы на float'ах экономить.

Успокойтесь.
0
kamre
126 / 130 / 4
Регистрация: 25.12.2011
Сообщений: 443
11.10.2013, 08:15 #39
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Мы же не на микроконтроллеры пишем, что бы на float'ах экономить.
При выводе 3d графики до сих пор эффективнее с float работать (меньше данных в GPU пересылать, и с float GPU намного быстрее работают пока). А, например, считать физику можно в double на CPU. Так что не нужно тут про микроконтроллеры. Вообще уже понятно, что на эффективность обобщенного кода вам наплевать (все подряд наследуем от Object и аллоцируем в куче). А когда вдруг нужна эффективность, то начинаете вручную инстанцировать шаблоны методом copy-paste.
0
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
11.10.2013, 08:50 #40
Цитата Сообщение от kamre Посмотреть сообщение
При выводе 3d графики до сих пор эффективнее с float работать (меньше данных в GPU пересылать, и с float GPU намного быстрее работают пока). А, например, считать физику можно в double на CPU.
3D-графика немного другая тема. Во-первых, ни о какой 3D-графики у нас не шло и речи. Во-вторых, если экономить, то лучше использовать оптимизации на уровне драйвера, а не экономии на пересылках double. Более того, float по производительности почти такой в современных картах и CPU, тогда как точность, пусть и выше, но не избавляет от погрешностей округления, систем исчисления, разницы в реализациях (и соответственно - точности, скорости) и подобного. В суперточных вычислениях выгоднее использовать собственные структуры. Да и кто вообще вздумает использовать generic complex на GPU?.. Лучше туда масивами попарно пихать. И ведь нормально, ничего страшного.

Да и вообще, может уже пора закончить?.. Бессмысленный спор, ИМХО.
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
11.10.2013, 11:13 #41
AnyOne697, Проблема лишь в том, что Вы написали сообщение:
Очень советую избегать шаблонов там, где только можно. И с осторожностью использовать стороннии библиотеки на STL. Они, часто, очень мощные, но сами по себе шаблоны не торт.
Не указано ИМХО, не указано ничего. Просто такое ощущение, что это констатация давно известного факта. А впоследствии выясняется, что вообще наследовать все от базового типа - это та дорога, которой стоит идти. Превозносятся generic в Java и тому подобное, чего нет, не было и никогда не будет в С++. generic и templates это ведь абсолютно разные вещи, заради чего их сравнивать? Шаблоны позволяют куда большую гибкость и пишем мы код так, чтобы он быстрее работал, а не быстрее компилировался (в конце концов, если так важно именно время компиляции можно ведь и ускорить, причем довольно просто).
На тему generic и templates: http://stackoverflow.com/questions/3...-in-c-and-java
2
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
11.10.2013, 16:29 #42
Цитата Сообщение от ForEveR Посмотреть сообщение
Не указано ИМХО, не указано ничего. Просто такое ощущение, что это констатация давно известного факта. А впоследствии выясняется, что вообще наследовать все от базового типа - это та дорога, которой стоит идти. Превозносятся generic в Java и тому подобное, чего нет, не было и никогда не будет в С++. generic и templates это ведь абсолютно разные вещи, заради чего их сравнивать? Шаблоны позволяют куда большую гибкость и пишем мы код так, чтобы он быстрее работал, а не быстрее компилировался (в конце концов, если так важно именно время компиляции можно ведь и ускорить, причем довольно просто).
На тему generic и templates: http://stackoverflow.com/questions/3...-in-c-and-java
Да я всё это прекрасно знаю. Я понимаю некорректность сравнения шаблонов и обобщений. Но в тоже время есть некоторые задачи, которые решаются и шаблонами, и обобщениями. А есть задачи, которые не решаются только одним (или шаблонами, или обобщениями).
И потом, ИМХО напрямую написано не было. Но это был совет, мой совет. И проблема в том, что это не давно известная истина. Истина есть только в логике, в реальной жизни (часто далёкой от логике) нет полностью правильного решения. Мой, лично мой опыт константирует тот факт, что шаблоны решают два класса проблем - вычисления на этапе компиляции и многократное использование кода. Первая - надуманная проблема, она редко возникает действительно, а когда возникает - обычно решается сама собой (компилятор часто умнее человека оказывается). Вторая прекрасно решается с помощью наследования и инкапсуляции (это разные вещи, если что). Показывать общность с помощью шаблонов... Не знаю, это не их задача, на мой взгляд.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7278 / 4439 / 650
Регистрация: 29.11.2010
Сообщений: 12,018
12.10.2013, 00:14 #43
Цитата Сообщение от AnyOne697 Посмотреть сообщение
И проблема в том, что это не давно известная истина.
Проблема в том, что это было сказано во всеуслышание и пыталось доказываться на протяжении 5 страниц. Мы все порой морозим ерунду, просто некоторые в этом сознаются.

Никто не ставит своей целью заставить конкретно вас использовать шаблоны, да пишите void foo(int), void foo(double), void foo(any_other_type), но вот за слова, сказанные на форуме, который читают люди и учатся языку, надо отвечать.

Вы уже сами себя неоднократно слили, нет смысла более вести дискуссию на тему профита обобщенного программирования и шаблонов в частности, просто в следующий раз воздержитесь от столь громких высказываний не имея веских аргументов, ну или хотя бы интересной теории, а то уже даже читать становится скучно.
2
AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 533
12.10.2013, 00:22 #44
Цитата Сообщение от MrGluck Посмотреть сообщение
то уже даже читать становится скучно.
Не читайте. Это всё было мой опыт. У вас он может быть другой. Впрочем, я, конечно, слишком сильно выразился. Я ни разу не говорил, что я не использую шаблоны. Но почти всегда, когда я их использую - начинаются проблемы. Даже с виртуальными методами и их перегрузкой не было столько проблем, как с ними.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.10.2013, 00:22
Привет! Вот еще темы с ответами:

Перегрузка операторов и 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 { ...


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

Или воспользуйтесь поиском по форуму:
44
Yandex
Объявления
12.10.2013, 00:22
Ответ Создать тему
Опции темы

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