Здравствуйте, Аноним, Вы писали:
MN>>1. Нюансы использования.
MN>>Вот последнее, в обсуждение чего я принимал участие:
MN>>MN>>std::vector<std::string> myVec;
MN>>myVec.push_back("QQQQQQ");
MN>>// ещё много-много push_back`ов.
MN>>myVec.clear(); // (1)
MN>>
MN>>Вы надеетесь, что в точке (1) память из-под myVec освободится? Вы очень наивны, если так думаете. А чтобы узнать как её гарантировано освободить на любой реализации придётся либо проштудировать стандарт, либо искать на форуме, либо прочитать ещё одну книжку (например С. Мейерса "Эффективное использование C++"). Но и этого не достаточно: чтобы всё это сделать, надо как минимум подозревать, что не всё так просто и память реально не освободится при вызове clear. При всём при этом самое неприятное — это то, что в некоторых случаях сложность совершенно не оправдана.
MN>>Чтобы убедиться, что не всё так тривиально, вбейте слово stl в поиске на RSDN`е: у меня вышло 11319 тем...
Так и логично, что она не освободиться. Ведь, если я использую clear, значит вектор мне ещё нужен и я буду опять в него что-то добавлять. Зачем перераспределять память для вектора несколько раз? А если я не буду использовать вектор больше, то деструктор всё сам очистит и будет вызван автоматически при выходе за область видимости.
Всё, что я хочу сделать вызовом clear — удалить элементы вектора. Память и т.д. меня здесь не интересует — особенности реализации. Если стоит задача, где это критично (есть ограничения на использование памяти) — тогда читаю документацию.
MN>>2. Интерфейсы.
MN>>MN>>std::transform(it->begin(), it->begin() + commandEnd,
MN>> cmd.begin(),
MN>> std::bind2nd(std::ptr_fun(toupper_wrap), &loc));
MN>>
MN>>Это ещё достаточно простая комбинация. Для меня эта запись выглядит понятной, но я встречал людей, которых она вгоняла в такой ступор... А уж если надо написать свой функтор (но это уже больше относится к 3-ему пункту).
В ступор этот код вогнать конечно может. Но только человека плохо знающего stl.