За что я не люблю STL
От: TepMuHyc  
Дата: 08.08.02 13:02
Оценка: 31 (4) -1
Я превосходно понимаю что покушаюсь на святое и что скоро-скоро меня накроет залп из тухлых яиц по своей суммарной мощности превосходящий бомбу сброшенную на Хиросиму. Но искушение велико.

Итак, ЗА ЧТО Я НЕ ЛЮБЛЮ STL:
---------------------------------------------------------------------------------
1) За то что его контейнеры реализуют парадигму "владения" только в том случае, когда обьекты хранятся в контейнере "по значению". Для тех кто забыл или не знает — "обьектом владеет тот кто его удаляет".

Пример:
void func1()
{
    vector<TheClass> byvalStorage;
    while(<<очень много>>) {
        byvalStorage.push_back(TheClass());
            //вот здесь нас поджидает две совершенно лишних операции, а именно - операция копирования и и операция удаления временного обьекта.
            //К тому же выясняется что класс TheClass должен иметь осмысленный конструктор копирования.
    } 
    /* 
    ...
    делаем еще много чего
    ...
    */ 
    
    /* а вот здесь наш контейнер благополучно самоуничтожается со всем своим содержимым...*/
}

//Конечно, это можно переписать и так:
void func2()
{
    vector<TheClass*> byrefStorage;
    while(<<очень много>>) {
        byvalStorage.push_back( new TheClass() );
            //и никаких лишних операций...
    }  
    /* 
    ...
    делаем еще много чего
    ...
    */ 
    
    /*а вот здесь я должен ручками удалить все из контейнера - т.к. гадить в память     
    никогда не считалось хорошим тоном. А подлый STL за меня это не сделает*/
}


...А хотелось бы мне лишний параметр в шаблон контейнера — что-то типа "I0WNU=true". Конечно, если value_type контейнера не является указателем, этот параметр бесполезен, но в противном случае он просто незаменим. Апологеты STL могут сказать что "владеющий указателями" контейнер не будет совместим с почти всеми алгоритмами (с copy_xx() — точно). Это так, но кто мешает посредством специализации запретить таким алгоритмам работать с "владетельными" контейнерами ?

---------------------------------------------------------------------------------
2) За их строки. Точнее за то что они модель "Sequence", Что мешало Степанову и компании сделать строку также моделью "Front Inserting Sequence" и "Back Inserting Sequence"? Робкие шаги в этом направлении видны (по крайней мере реализовали метод push_back()). Но дальше дело почему-то не пошло...
Чувство это сугубо иррациональное, идущее из глубины моего естества, но тем не менее каждый раз как я обнаруживаю что у строки нет методов "front()" и "back()" и "push_front()" во мне закипает тихое бешенство...

То же самое касается отсутствия строковых специализаций таких полезных вещей как istream_iterator... Скажете что есть getline()? Да идите вы со своими советами

---------------------------------------------------------------------------------
3) За их список. Точнее за его сортировку. А еще точнее — за метод sort(). За каким хреном, позвольте спроcить? Не вы ли договаривались что sort() это АЛГОРИТМ? Ах да, алгоритм "sort" работает только с "Random Access Iterator"... А у списка итератор всего лишь "bidirectional"... Так КАКОГО ЖЕ ЧЕРТА вы не предусмотрели алгоритм sort_for_bidirectional_iterator()?

---------------------------------------------------------------------------------
4) За их потоки. Точнее за исключение "ios_base::failure". А еще точнее — за его конструктор failure::failure(const string&).

Это ЕДИНСТВЕННОЕ место где потоки STL используют string. Нескромный вопрос: зачем? Идиотизм? Про.б? Или что-то еще?

---------------------------------------------------------------------------------
Пожалуй, пока хватит...
____________________
God obviously didn't debug, hasn't done any maintenance, and no documentation can be found. Truly amateur work.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.