Книга: Эффективное использование 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 в тех местах, где следовало бы использовать интервальные функции.

Оглавление книги


Генерация: 1.384. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз