在C ++中,如何编写一个函数以便它可以处理任何数据类型?

时间:2015-01-13 16:19:09

标签: c++ stl iterator

我正在使用此资源学习C ++ STL:http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=standardTemplateLibrary

在那里给出了以下函数来反转数组的元素:

template<typename T> void reversearr(T *begin, T *end) { 
      // We should at first decrement 'end' 
      // But only for non-empty range 
      if(begin != end) 
      { 
           end--; 
           if(begin != end) { 
                while(true) { 
                     swap(*begin, *end); 
                     begin++; 
                     if(begin == end) { 
                          break; 
                     } 
                     end--; 
                     if(begin == end) { 
                          break; 
                     } 
                } 
           } 
      } 
 } 

它适用于系统定义的类型数组,例如:

int arr[]={1,2,3,4,5}
reversearr(arr,arr+5);

但它给出了以下编译器错误:

&#34; Iterator02_ReverseIterators.cpp:39:32:错误:没有匹配函数来调用&#39; reversearr(std :: vector :: iterator,std :: vector :: iterator)&#39;& #34;

如果我使用此代码:

vector<int> v;
//Code to insert data in vector
reversearr(v.begin(),v.end());

如何编写类似的函数,以便它们也可以在迭代器上工作?

3 个答案:

答案 0 :(得分:7)

Welp,cppreference.com再次为我们提供了完整的答案,也称为std::reverse

可能的实施:

template<class BidirIt>
void reverse(BidirIt first, BidirIt last)
{
    while ((first != last) && (first != --last)) {
        std::iter_swap(first++, last);
    }
}

其中BidirItbidirectional iterator类型的概念。两个标准库容器&#39;迭代器和原始指针满足它,这就是它起作用的原因。

答案 1 :(得分:4)

在您的代码中,参数是T的指针。当你使用迭代器时,参数是指向迭代器的指针,所以它不起作用。

如果你想让它与迭代器一起工作,我认为你应该这样写:

template<typename T> 
void reversearr(T begin, T end)
{
   ...
}

答案 2 :(得分:4)

这是一个有趣的事实:

即使从参数中删除*,您的代码也可以使用数组。

template<typename T> void reversearr(T begin, T end) { 

为什么?

因为在原始代码中,Tint,而且T*的函数参数为int*
在我修改过的代码中,Tint*,函数参数仍为 int*

这个&#34;版本&#34;与迭代器一起工作 - 选择迭代器的语法和语义,这样你就可以编写与指针或迭代器同样有效的泛型函数。