Книга: Эффективное использование STL
Обходное решение для MSVC4-5
Обходное решение для MSVC4-5
Еще раз посмотрим на правильный код, который не компилируется для реализации STL из поставки MSVC4-6:
vector<Widget> vw(begin, end); // Отвергается реализацией STL
// из поставки MSVC4-6
list<Widget> lw;
…
lw.assign(vw.rbegin(), vw.rend()); // То же
SpeciаlContainer<Widget> scw;
…
scw.insert(scw.end(), lw.begin(), lw.end()); // То же
Несмотря на внешние различия, выделенные вызовы отвергаются компилятором по одной и той же причине: из-за отсутствия шаблонов функций класса в реализации STL. Соответственно и решение во всех случаях оказывается одним и тем же: замена вызовом copy
с итератором вставки (см. совет 30). Ниже приведены обходные решения для всех примеров, приведенных ранее:
istream_iterator<Widget> begin(cin), end;
vector<Widget> vw(begin, end); //Создать vw конструктором
copy(begin, end, back_inserter(vw)); // по умолчанию и скопировать
// в него объекты Widget из cin
list<Widget> lw;
…
lw.clear(); // Удалить из lw старые объекты;
copy(vw.rbegin(), vw.rend(), // скопировать объекты из vw
back_inserter(lw)); //(в обратном порядке)
SpecialContainer<Widget> scw;
copy(lw.begin(), lw.end(), // Скопировать объекты Widget
inserter(scw, scw.end())); // из lw в конец scw
Я рекомендую использовать эти обходные решения с библиотекой, входящей в комплект поставки MSVC4-5. С другой стороны, будьте внимательны и не забывайте о том, что эти решения являются обходными. Как показано в совете 5, алгоритм copy
почти всегда уступает интервальной функции контейнера, поэтому как только представится возможность обновить платформу STL до версии с поддержкой шаблонов функций класса, откажитесь от использования copy
в тех местах, где следовало бы использовать интервальные функции.