шаблоны, принимающие два итератора - PullRequest
0 голосов
/ 08 июля 2011

Почему обычный шаблон алгоритма разработан так, что он принимает два итератора вместо пары этих итераторов? Рассмотрим этот пример:

#include <iostream>
#include <iterator>
#include <vector>

using namespace std;

template <typename Range, typename OutputIterator> 
void copy2 (Range r, OutputIterator o) {
     copy (r.first, r.second, o);
}

template <typename iter1, typename iter2> 
pair<typename iter1, typename iter2> Range(iter1 start, iter2 end) {
    return make_pair(start, end);
}

int main()
{
    vector<int> myvector;
    myvector.push_back(3);
    myvector.push_back(2);
    myvector.push_back(1);

    // ordinary algorithm template accepts two iterators
    copy(myvector.begin(), 
         myvector.end(), 
         ostream_iterator<int> (cout,"\n") );

    // this template accepts iterator Range
    copy2(Range(myvector.begin(),myvector.end()),
          ostream_iterator<int> (cout,"\n"));
}

Каковы причины того, что copy () лучше, чем copy2 () [, кроме copy2 (), многословность вызова ]

РЕДАКТИРОВАТЬ: Я сократил многословность copy2 (), как предложил DeadMG.

Ответы [ 4 ]

1 голос
/ 08 июля 2011

В самом деле? Там нет ни одного. Стандартная библиотека имеет только понятие итераторов, потому что, насколько я знаю, никто не придумал диапазоны до того, как она была стандартизирована. Многие люди думают, что это может быть значительно улучшено с помощью диапазонов. Во-вторых, вы можете легко улучшить многословие # 2 с помощью небольшого дополнительного заранее написанного котла.

template<typename T> std::pair<typename T::const_iterator, typename T::const_iterator> all(const T& t) {
    return std::make_pair(t.begin(), t.end());
}
template<typename T> std::pair<typename T::iterator, typename T::iterator> all( T& t) {
    return std::make_pair(t.begin(), t.end());
}

copy2(all(myvector), ostream_iterator<int>(cout, "\n"));
0 голосов
/ 08 июля 2011

В copy2 есть некоторые дополнительные затраты на создание пары из двух ваших итераторов.Это может быть немного, но нет причин добавлять дополнительные вычисления, если они не нужны.

Кроме того, нельзя недооценивать преимущества упрощения понимания кода.

0 голосов
/ 08 июля 2011

Полагаю, это так, что если у вас уже есть отдельные итераторы, вам не нужно создавать пару для вызова алгоритма, и что он сохраняет согласованность всех аргументов алгоритма: какой-то итератор (и, возможно, предикат ).

0 голосов
/ 08 июля 2011

Я смотрю на это как на простоту.Что дает упаковка ваших итераторов в другом контейнере, кроме меньшей подписи для вашей функции copy2?(Лично я не вижу никакого преимущества в том, чтобы обернуть его в пару, поэтому для вызова функции нужно написать больше кода)

И, глядя на пример кода, который вы разместили, исходный вызов копирования(IMO) гораздо более читабельный, чем вызов copy2.

...