Re: В чём развод STL?
От: Mr. None Россия http://mrnone.blogspot.com
Дата: 29.05.06 04:22
Оценка:
Здравствуйте, Doc, Вы писали:

Doc>Здравствуйте, Mr. None, Вы писали:


MN>>деле фигня и где-то их на самом деле разводят (сам такой же — каюсь) .


Doc>А расскажите в чем развод STL? Очень уж интересно


Н-да... Не думал, что моя шутка породит такую дискуссию... В пору уже отделять в "Священные войны".
А тепрь конкретика, никакую реентерабельность или потоко-безопасность я не имел в виду. Это вообще отдельная песня и не многие библиотеки, обладают 3-мя качествами одновременно: потоко-безопасность, универсальность и эффективность. Чем-то одним приходится жертвовать...
Stl удобен, для тех кто его знает и умеет им пользоваться, а это очень и очень не просто. Не мне судить, но как человек, знающий его относительно хорошо (скажем так на 4-ку, думаю даже с плюсом — скромность не позволяет выставить оценку выше ), могу сказать: некоторые вещи можно было сделать по проще и по понятнее. Это касается и нюансов использования, и интерфейсов, и реализации.

1. Нюансы использования.
Вот последнее, в обсуждение чего я принимал участие:
std::vector<std::string> myVec;
myVec.push_back("QQQQQQ");
// ещё много-много push_back`ов.
myVec.clear(); // (1)

Вы надеетесь, что в точке (1) память из-под myVec освободится? Вы очень наивны, если так думаете. А чтобы узнать как её гарантировано освободить на любой реализации придётся либо проштудировать стандарт, либо искать на форуме, либо прочитать ещё одну книжку (например С. Мейерса "Эффективное использование C++"). Но и этого не достаточно: чтобы всё это сделать, надо как минимум подозревать, что не всё так просто и память реально не освободится при вызове clear. При всём при этом самое неприятное — это то, что в некоторых случаях сложность совершенно не оправдана.
Чтобы убедиться, что не всё так тривиально, вбейте слово stl в поиске на RSDN`е: у меня вышло 11319 тем...

2. Интерфейсы.
std::transform(it->begin(), it->begin() + commandEnd,
    cmd.begin(),
    std::bind2nd(std::ptr_fun(toupper_wrap), &loc));


Это ещё достаточно простая комбинация. Для меня эта запись выглядит понятной, но я встречал людей, которых она вгоняла в такой ступор... А уж если надо написать свой функтор (но это уже больше относится к 3-ему пункту).

3. Реализация.
Вы когда-нибудь порбовали написать свой аллокатор или свой контейнер, удовлетворяющий всем требованиям stl? Попробуйте на досуге...
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.