13 / 12 / 9
Регистрация: 09.11.2012
Сообщений: 367
Записей в блоге: 1
1

templates, STL

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

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

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

спасибо.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.10.2013, 12:11
Ответы с готовыми решениями:

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

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

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

Variadic templates
typedef function<double(double ...)> fun; inline int sum() { return 0; } template...

43
XRuZzz
10.10.2013, 23:14     templates, STL
  #21

Не по теме:

если кто понял о чем говорил AnyOne697 пожалуйста переведите :D я честно прочитал его посты, но смысл почему не надо использовать шаблоны не понял.

0
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
10.10.2013, 23:20 22
Могу с полной уверенностью сказать: переход от чистого ОО к симбиозу ОО и обобщенного программирования дал мне просто огромный левел-ап. Я смог нормально читать и вникать в код буста. Это просто неиссякаемый кладезь полезной информации. Сравнимо с тем, что я всю жизнь сидел дома, а потом внезапно вышел на улицу - новые горизонты, новые и почти неограниченные возможности.

Как пафосно я завернул

В общем я скромно призываю AnyOne697 реализовать какую-нибудь библиотеку буста без призыва шаблонов и показать, насколько увеличилось удобство использования и производительность.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
10.10.2013, 23:23 23
Цитата Сообщение от ct0r Посмотреть сообщение
В общем я скромно призываю AnyOne697 реализовать какую-нибудь библиотеку буста
Да хотя бы vector из STL.
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
10.10.2013, 23:30 24
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Всё очень просто. Пришлось правда сделать 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 );
 /***/
}
а зачем нам ещё один objective-c ?

Добавлено через 1 минуту
Цитата Сообщение от castaway Посмотреть сообщение
А можно не писать эти талмуды а просто в 5 строках пояснить что имелось в виду в 12-м посте в ответ на вопрос Убежденного ?
как я понял то товарищ AnyOne697 предлагает "взять все, да и поделить" унаследовать от Object

Не по теме:

совпадение с Шариковым случайно:D

1
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
10.10.2013, 23:32 25
Цитата Сообщение от Jupiter Посмотреть сообщение
как я понял то товарищ AnyOne697 предлагает "взять все, да и поделить" унаследовать от Object
Ну тогда он скорее всего ошибся разделом..
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
11.10.2013, 00:48 26
Цитата Сообщение от AnyOne697 Посмотреть сообщение
virtual void put ( Object o, uint i = 0 );
И как в такой list вставить экземпляр типа int ? Например, put(123) не работает.
А указатель как вставить ? Завернуть его в структуру и унаследовать структуру
от Object ? Вообще, это не опечатка, что Object передается по значению ?
Если не опечатка, тогда как вообще выполняется получение реального типа ?

Ок, допустим это опечатка и Object передается по указателю/ссылке.
И сразу же встает вопрос управления временем жизни объекта.

В общем, этот пример неубедителен.
Простой std::list проще, нагляднее и скорее всего еще и эффективнее, в основном
за счет использования шаблонов.
1
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
11.10.2013, 00:53 27
Цитата Сообщение от Убежденный Посмотреть сообщение
И как в такой list вставить экземпляр типа int ?
Это как в Яве (если без generics) - нужен враппер (Integer), а потом касты при извлечении из колекции...
0
134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533
11.10.2013, 01:21 28
[quote="Убежденный;5166658"]И как в такой list вставить экземпляр типа int ? Например, put(123) не работает.[quote]
Легко.
C++
1
List list; list.put ( new Integer ( 123 ) );
Немного многословно, но мы сделали несколько облегчающих инструментов.
Алсо, иногда, когда скорость (ну или эллегантность кода, что в общем-то было в приоритете) очень и очень критична, делали такое:
C++
1
2
3
4
5
class IntList {
public:
    virtual void put ( int v, int i = 0 );
    virtual int get ( int i );
}
Цитата Сообщение от Убежденный Посмотреть сообщение
А указатель как вставить ? Завернуть его в структуру и унаследовать структуру
от Object ? Вообще, это не опечатка, что Object передается по значению ?
Если не опечатка, тогда как вообще выполняется получение реального типа ?
Не совсем. Это и не опечатка и опечатка. Мы сделали умные указатели внутри Object по типу конверта. Приходилось по особому делать копирующие конструкторы и вообще аккуратно работать с памятью, но в общем и целом, стало даже проще, чем если без этого =)

Вообще, мы хотели ещё попробовать добавить немного рефлексии, но как-то слабо получалось. Не удобно очень. Или макросы страшные появлялсиь, или какие-то списки приходилось создавать. Но с ней всё было бы много круче.
Цитата Сообщение от castaway Посмотреть сообщение
Ну тогда он скорее всего ошибся разделом..
Ну я смотрю, что иницировал здесь неплохую дискуссию.
Цитата Сообщение от ct0r Посмотреть сообщение
Могу с полной уверенностью сказать: переход от чистого ОО к симбиозу ОО и обобщенного программирования дал мне просто огромный левел-ап. Я смог нормально читать и вникать в код буста. Это просто неиссякаемый кладезь полезной информации. Сравнимо с тем, что я всю жизнь сидел дома, а потом внезапно вышел на улицу - новые горизонты, новые и почти неограниченные возможности.
Я читал код буста. И честно - потом долго отходил. Да, там интересно реализованы некоторые вещи. Но при этом понимаешь, что нужно слишком круто владеть таким инструментом, как Си++. Да и ногу лишний раз прострелить проще простого.
В общем, я люблю крайности. Смешивать ООП с обобщённым программированием, как товарищ ct0r предложил - мерзость по сути. Придерживаясь одной идеи нет конфликтов идей, как это часто происходит в Си++.
Цитата Сообщение от ct0r Посмотреть сообщение
В общем я скромно призываю AnyOne697 реализовать какую-нибудь библиотеку буста без призыва шаблонов и показать, насколько увеличилось удобство использования и производительность.
Смотря в какой области. Если в непосредственном использовании, то скорее больше минусов, чем плюсов. Производительность только падает.
Если же в разработки, то она как по маслу. Разделение заявления / реализации - на ура. Убогих темплейтов - минимум.
Цитата Сообщение от Jupiter Посмотреть сообщение
а зачем нам ещё один objective-c ?
Затем, что это не Objective C. ЕМНИП, это вообще не то. Да, он забавный, но всё же немного не то.
Цитата Сообщение от Jupiter Посмотреть сообщение
как я понял то товарищ AnyOne697 предлагает "взять все, да и поделить" унаследовать от Object
Не совсем так. Суперпредок нужен в основном только для того, чтобы избавиться от шаблонов. По крайне менее, в рамках этой темы. И начиналось именно с этого.

Вообще, я тут распинаюсь, а зачем мне это?.. Я же написал, что я прекрасно понимаю мощь темплейтов. Но не нужным мне они, ваши темплейты. Лучше бы доработали мультипоточность или добавили бы нормальные умные указатели (без использования темплейтов - с ними они уже очень давно были). Или добавили бы минимальную поддержку графики (необязательную). Да, снова получается Java. Но Си++ интересен тем, что всегда есть выбор. И это круто. Этим он крут. Из-за этого я не могу полностью с него слезть.

Добавлено через 10 минут
Цитата Сообщение от kamre Посмотреть сообщение
Вот именно что нет в Java "банального агрегатора данных". Ключевое отличие value types от reference types знаете? Попробуйте на Java реализовать эффективный тип данных для комплексных чисел с возможностью выбора базового типа хотя бы из float/double. Эффективный тип данных - это такой, при использовании которого не будет потерь производительности по сравнению с вручную написанным кодом под специальные случаи.
Если не считать незначительные потери на virtual-функции, то можно. Если применить джедайскую магию, тоже можно. Вообще всё можно.
Цитата Сообщение от _stealth_ Посмотреть сообщение
такая общность весьма разная. наследование (public) - Х есть (is) У. включения экземпляра другого класса в класс - X имеет (has) Y (вот не надо сейчас эту тему развивать ). а шаблон такие-то классы обрабатываются по одному и тому же шаблону (при этом они не is и не has).
когда нужно что-то выразить, то просто выбираешь нужно средство.
Как-то одномерно. Давайте хотя бы плоско: X: O, Y: O. То есть X is O, Y is O. Но что есть X и Y?..
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
11.10.2013, 01:32 29
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Легко.
и шарп и джава ушли от использования безтиповых коллекций (типичный ArrayList), ты же предлагаешь отбросить их горький опыт и вернутся на десятилетие назад
0
134 / 106 / 10
Регистрация: 22.05.2010
Сообщений: 533
11.10.2013, 01:38 30
Цитата Сообщение от Jupiter Посмотреть сообщение
и шарп и джава ушли от использования безтиповых коллекций (типичный ArrayList), ты же предлагаешь отбросить их горький опыт и вернутся на десятилетие назад
Горький опыт обоснован. Как показывает практика производительность действительно возрастает, так как мы имеем доступ к неплохим "ручным" оптимизациям (так как знаем, что оптимизировать). Конечно, пример с целочисленным немного надуман. Но в общем и целом. Тем более это удобно, когда внезапно возникает многопоточность.
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
11.10.2013, 01:41 31
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Тем более это удобно, когда внезапно возникает многопоточность.
чем шаблоны мешают многопоточности? что за хрень ты тут доказываешь?
1
127 / 131 / 11
Регистрация: 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
134 / 106 / 10
Регистрация: 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
127 / 131 / 11
Регистрация: 25.12.2011
Сообщений: 443
11.10.2013, 02:03 34
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Такие.
Почему захардкодили double внутри Complex? Нужна поддержка как минимум еще и float!

И уже видно, что copy-paste - это ваш метод, под каждую специализацию ручной copy-paste. Очень элегантно и эффективно. Получается, что нужно этим методом сделать ComplexDouble, ComplexFloat, ComplexDoubleList, ComplexFloatList, такой у вас подход?
0
88 / 83 / 21
Регистрация: 08.08.2012
Сообщений: 737
11.10.2013, 02:04 35
а в Qt как реализованы Qcontainers?
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
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
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
11.10.2013, 02:24 37
Цитата Сообщение от Хулиган Посмотреть сообщение
а в Qt как реализованы Qcontainers?
на шаблонах
0
134 / 106 / 10
Регистрация: 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
127 / 131 / 11
Регистрация: 25.12.2011
Сообщений: 443
11.10.2013, 08:15 39
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Мы же не на микроконтроллеры пишем, что бы на float'ах экономить.
При выводе 3d графики до сих пор эффективнее с float работать (меньше данных в GPU пересылать, и с float GPU намного быстрее работают пока). А, например, считать физику можно в double на CPU. Так что не нужно тут про микроконтроллеры. Вообще уже понятно, что на эффективность обобщенного кода вам наплевать (все подряд наследуем от Object и аллоцируем в куче). А когда вдруг нужна эффективность, то начинаете вручную инстанцировать шаблоны методом copy-paste.
0
134 / 106 / 10
Регистрация: 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
11.10.2013, 08:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.10.2013, 08:50
Помогаю со студенческими работами здесь

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

Variardic templates
Вообщем есть одна задумка, реализовать одну штуку :D Надеюсь общую идею изображу в коде ниже: ...

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru