模板接受两个迭代器

时间:2011-07-08 14:23:15

标签: c++ templates iterator

为什么设计普通算法模板以便它接受两个迭代器而不是这些迭代器对?考虑这个例子:

#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()调用详细程度]

编辑:如DeadMG建议的那样,我大量减少了copy2()的详细程度。

4 个答案:

答案 0 :(得分:1)

真的?没有一个。标准库只有迭代器的概念,因为据我所知,在标准化之前没有人想出范围。许多人认为使用范围可以大大改善它。其次,您可以使用一些额外的预先编写的锅炉轻松改善#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"));

答案 1 :(得分:0)

我认为这样做很简单。除了copy2函数的较小签名之外,将迭代器包装在另一个容器中的用途是什么? (就个人而言,我认为将它包装成一对没有任何好处,所以只需要编写更多代码来调用函数)

查看您发布的示例代码,原始复制调用(IMO)比copy2调用更具可读性。

答案 2 :(得分:0)

我认为如果你已经有了单个迭代器,你不必构造一对来调用算法,并且它保持算法的所有参数都是一致的:某种迭代器(可能是谓词) )。

答案 3 :(得分:0)

copy2中,由于必须从两个迭代器构造对,所以会有一些额外的开销。它可能不是很多,但如果没有必要,就没有理由添加额外的计算。

此外,不应低估保持代码易于理解的好处。